keras-team / keras

Deep Learning for humans
http://keras.io/
Apache License 2.0
61.65k stars 19.42k forks source link

AttributeError: 'PReLU' object has no attribute 'alphas' #1496

Closed SnowRipple closed 7 years ago

SnowRipple commented 8 years ago

My model:

model = Sequential()

input: 34x34 grey channeled

# this applies 32 convolution filters of size 3x3 each.
model.add(Convolution2D(128, 3, 3, input_shape=(1, 34, 34)))
model.add(Activation(PReLU()))
model.add(Convolution2D(128, 3, 3))
model.add(Activation(PReLU()))
model.add(Dropout(dropout))

model.add(Convolution2D(128, 3, 3))
model.add(Activation(PReLU()))
model.add(Dropout(dropout))

model.add(Convolution2D(128, 3, 3))
model.add(Activation(PReLU()))
model.add(Dropout(dropout))

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(256, 3, 3))
model.add(Activation(PReLU()))
model.add(Dropout(dropout))

model.add(Convolution2D(256, 3, 3))
model.add(Activation(PReLU()))
model.add(Dropout(dropout))

model.add(Convolution2D(256, 3, 3))
model.add(Activation(PReLU()))
model.add(Dropout(dropout))

model.add(Convolution2D(512, 3, 3))
model.add(Activation(PReLU()))
model.add(Dropout(dropout))

model.add(Flatten())

Note: Keras does automatic shape inference.

model.add(MaxoutDense(512))
model.add(Dropout(dropout))
model.add(MaxoutDense(512))
model.add(Dropout(dropout))

model.add(Dense(output_dim=16,activation='sigmoid'))

#sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mse', optimizer='adam')

remote = RemoteMonitor(root='http://localhost:9001')
earlystop = EarlyStopping(monitor="val_loss", patience=30, verbose=0)

model.fit(X_train, Y_train, batch_size=batches, nb_epoch=epochs,
        validation_split=0.1, show_accuracy=True,verbose=2,
        callbacks=[earlystop,remote])

Error:

Using Theano backend. Using gpu device 0: GeForce GTX TITAN X (CNMeM is disabled) Loading /home/piotr/workspace/vessel_segmentation/whole_binary_datasets/zipped.pkl... Loaded /home/piotr/workspace/vessel_segmentation/whole_binary_datasets/zipped.pkl in 0:00:16.21 (82893, 1, 34, 34) (82893, 16) max is 2.837531 min is -3.083485 max is 1.000000 min is 0.000000 Traceback (most recent call last): File "/home/piotr/workspace/vessel_segmentation/drive_pylearn2/cnn_keras.py", line 119, in cnn() File "/home/piotr/workspace/vessel_segmentation/drive_pylearn2/cnn_keras.py", line 93, in cnn model.compile(loss='mse', optimizer='adam') File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 433, in compile self.y_train = self.get_output(train=True) File "/usr/local/lib/python2.7/dist-packages/keras/layers/containers.py", line 128, in get_output return self.layers[-1].get_output(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 962, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 637, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 1328, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 637, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 1328, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 834, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 637, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 671, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 311, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 637, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 671, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 311, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 637, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 671, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 311, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 637, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 671, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 311, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 495, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 637, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 671, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 311, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 637, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 671, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 311, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 637, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 671, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 311, in get_output X = self.get_input(train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 173, in get_input previous_output = self.previous.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 672, in get_output return self.activation(X) File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 84, in call Y = self.get_output(train=train) File "/usr/local/lib/python2.7/dist-packages/keras/layers/advanced_activations.py", line 72, in get_output neg = self.alphas * (X - abs(X)) * 0.5 AttributeError: 'PReLU' object has no attribute 'alphas'

I was trying leaky relu before and the error I got was something like : LeakyRelu has no attribute name

keunwoochoi commented 8 years ago

Have you updated it with git address? I also had this problem with 'name' attribute, which was resolved by updating it not with pip but with git, IIRC.

SnowRipple commented 8 years ago

Updated with git pull, Leaky relu still failing:

Traceback (most recent call last): File "/home/piotr/workspace/vessel_segmentation/drive_pylearn2/cnn_keras.py", line 136, in cnn() File "/home/piotr/workspace/vessel_segmentation/drive_pylearn2/cnn_keras.py", line 126, in cnn json_string = model.to_json() File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 396, in to_json config = self.get_config() File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 345, in get_config config = super(Model, self).get_config() File "/usr/local/lib/python2.7/dist-packages/keras/layers/containers.py", line 164, in get_config 'layers': [layer.get_config() for layer in self.layers]} File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 676, in get_config 'activation': self.activation.name} AttributeError: 'LeakyReLU' object has no attribute 'name'

tboquet commented 8 years ago

Did you reinstall the package?

SnowRipple commented 8 years ago

yes of course: sudo python setup.py install

keunwoochoi commented 8 years ago

Then did you check the version by keras.__version__ ? Perhaps we all are talking about too basic stuff but that's because layer.name attributes seem to be added quite recently and by the error message, as you may agree, to update to recent version would be the only solution for this. Or open the core.py file that it the message says and see if it agrees with the up-to-date code on web repo.

SnowRipple commented 8 years ago

I checked keras.version it says 0.3.1, opened core.py it agrees. Removed keras to be sure, pull new changes,reinstalled, Prelu still fails with:

File "build/bdist.linux-x86_64/egg/keras/layers/advanced_activations.py", line 72, in get_output AttributeError: 'PReLU' object has no attribute 'alphas'

Compared Prelu code here and on mt local copy,it's exactly the same. After debugging I can see that Prelu doesn't initialize self.alphas at all, because it doesn't call the build method:

class PReLU(MaskedLayer): '''

Input shape

    Arbitrary. Use the keyword argument `input_shape`
    (tuple of integers, does not include the samples axis)
    when using this layer as the first layer in a model.
# Output shape
    Same shape as the input.

# Arguments:
    init: initialization function for the weights.
    weights: initial weights, as a list of a single numpy array.

# References:
    - [Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification](http://arxiv.org/pdf/1502.01852v1.pdf)
'''
def __init__(self, init='zero', weights=None, **kwargs):
    self.init = initializations.get(init)
    self.initial_weights = weights
    super(PReLU, self).__init__(**kwargs)

def build(self):
    input_shape = self.input_shape[1:]
    self.alphas = self.init(input_shape)
    self.params = [self.alphas]

    if self.initial_weights is not None:
        self.set_weights(self.initial_weights)
        del self.initial_weights

def get_output(self, train):
    X = self.get_input(train)
    pos = K.relu(X)
    neg = self.alphas * (X - abs(X)) * 0.5
    return pos + neg

def get_config(self):
    config = {"name": self.__class__.__name__,
              "init": self.init.__name__}
    base_config = super(PReLU, self).get_config()
    return dict(list(base_config.items()) + list(config.items()))

That's why get_output() fails. Tried to run build manually but I don't know "input shape" in every layer:

Activation(PReLU().build()), File "build/bdist.linux-x86_64/egg/keras/layers/advanced_activations.py", line 61, in build File "build/bdist.linux-x86_64/egg/keras/layers/core.py", line 142, in input_shape Exception: Layer is not connected. Did you forget to set "input_shape"?

mrwns commented 8 years ago

Does it work if you add PReLU like this (without wrapping in in Activation() )?

model.add(Convolution2D(128, 3, 3)) model.add(PReLU()) model.add(Dropout(dropout))

jrosebr1 commented 7 years ago

For the record I tried the suggestion by @mrwns and did not wrap PReLU in an Activation. That resolved the error.

AnasHXH commented 4 years ago

leakyrelu_alpha = 0.2

gen5 = Conv2D(filters=256, kernel_size=3, strides=1, padding='same')(gen5) gen5 = LeakyReLU(alpha=leakyrelu_alpha)(gen5)#Activation('relu')'or #LeakyReLU(alpha=0.3)

use this, it will solve your problem