Getting error, "AttributeError: 'module' object has no attribute 'ifelse'"

5.3k Views Asked by At

I am using Theano and Keras and using the below command, trying to load the weights of VGG Net from the .h5 file.

VGG Net Model Definition:

def VGG_16(weights_path=None):
    model = Sequential()
    model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))
    model.add(Convolution2D(64, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(64, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(128, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(128, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(256, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(256, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(256, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(Flatten())
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1000, activation='softmax'))

    if weights_path:
        model.load_weights(weights_path)

    return model

Trying to load the weights using the below command

model = VGG_16('vgg16_weights_th_dim_ordering_th_kernels.h5')

And got the below one as error:

'AttributeError Traceback (most recent call last)
<ipython-input-3-e815cc7d5738> in <module>()
      1 #model = VGG_16('vgg16_weights_tf_dim_ordering_tf_kernels.h5')
----> 2 model = VGG_16('vgg16_weights_th_dim_ordering_th_kernels.h5')
      3 #sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
      4 #model.compile(optimizer=sgd, loss='categorical_crossentropy')

<ipython-input-2-f9b05d09c080> in VGG_16(weights_path)
     39     model.add(Flatten())
     40     model.add(Dense(4096, activation='relu'))
---> 41     model.add(Dropout(0.5))
     42     model.add(Dense(4096, activation='relu'))
     43     model.add(Dropout(0.5))

c:\users\sekhar\onedrive\insofe\classes\week17\for_keras\keras-master\keras\models.pyc in add(self, layer)
    330                  output_shapes=[self.outputs[0]._keras_shape])
    331         else:
--> 332             output_tensor = layer(self.outputs[0])
    333             if isinstance(output_tensor, list):
    334                 raise TypeError('All layers in a Sequential model '

c:\users\sekhar\onedrive\insofe\classes\week17\for_keras\keras-master\keras\engine\topology.pyc in __call__(self, x, mask)
    570         if inbound_layers:
    571             # This will call layer.build() if necessary.
--> 572             self.add_inbound_node(inbound_layers, node_indices, tensor_indices)
    573             # Outputs were already computed when calling self.add_inbound_node.
    574             outputs = self.inbound_nodes[-1].output_tensors

c:\users\sekhar\onedrive\insofe\classes\week17\for_keras\keras-master\keras\engine\topology.pyc in add_inbound_node(self, inbound_layers, node_indices, tensor_indices)
    633         # creating the node automatically updates self.inbound_nodes
    634         # as well as outbound_nodes on inbound layers.
--> 635         Node.create_node(self, inbound_layers, node_indices, tensor_indices)
    636 
    637     def get_output_shape_for(self, input_shape):

c:\users\sekhar\onedrive\insofe\classes\week17\for_keras\keras-master\keras\engine\topology.pyc in create_node(cls, outbound_layer, inbound_layers, node_indices, tensor_indices)
    164 
    165         if len(input_tensors) == 1:
--> 166             output_tensors = to_list(outbound_layer.call(input_tensors[0], mask=input_masks[0]))
    167             output_masks = to_list(outbound_layer.compute_mask(input_tensors[0], input_masks[0]))
    168             # TODO: try to auto-infer shape

c:\users\sekhar\onedrive\insofe\classes\week17\for_keras\keras-master\keras\layers\core.pyc in call(self, x, mask)
    108             def dropped_inputs():
    109                 return K.dropout(x, self.p, noise_shape, seed=self.seed)
--> 110             x = K.in_train_phase(dropped_inputs, lambda: x)
    111         return x
    112 

c:\users\sekhar\onedrive\insofe\classes\week17\for_keras\keras-master\keras\backend\theano_backend.pyc in in_train_phase(x, alt)
   1166     if callable(alt):
   1167         alt = alt()
-> 1168     x = theano.ifelse.ifelse(_LEARNING_PHASE, x, alt)
   1169     x._uses_learning_phase = True
   1170     return x

AttributeError: 'module' object has no attribute 'ifelse'

What would be the probable solution to this problem??

One of my friend says other than re-installing Anaconda and Theano there is no other alternative. Please adivce.

4

There are 4 best solutions below

0
On BEST ANSWER

Your version of theano is probably too new for that version of Keras. You should try downgrading theano to 0.9.x, and also upgrading Keras to 2.0 at least. Then it should work perfectly.

0
On

Try simply:

 import theano
 print theano.ifelse  

If it shows up an error your theano installation is most likely wrong and you should reinstall.

Example output

<module 'theano.ifelse' from '/usr/local/lib/python2.7/dist-packages/theano/ifelse.pyc'>
0
On

Go to theano_backend file.

At line :

x = theano.ifelse.ifelse(training, x, alt)

Overwrite:

x = ifelse.ifelse(training, x, alt)

And still in theano_backend file :

Add:

from theano import ifelse

Sorry by the english.

1
On

Upgrading keras should make it work.

I has similar issue. Upgrade keras using pip install keras

Now following version combination works.

1.0.1 2.1.3