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

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

我正在使用 Theano 和 Keras 并使用以下命令,尝试从 .h5 文件加载 VGG 网络的权重。

VGG 网络模型定义:

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

正在尝试使用以下命令加载权重

model = VGG_16('vgg16_weights_th_dim_ordering_th_kernels.h5')

并得到以下错误:

'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'

这个问题的可能解决方案是什么?

我的一个朋友说除了重新安装 Anaconda 和 Theano 别无选择。请指教。

简单尝试:

 import theano
 print theano.ifelse  

如果出现错误,你的theano安装很可能是错误的,你应该重新安装。

示例输出

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

你的 theano 版本对于那个版本的 Keras 来说可能太新了。你应该尝试将 theano 降级到 0.9.x,并至少将 Keras 升级到 2.0。那么它应该可以完美运行。

转到 theano_backend 文件。

在行:

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

覆盖:

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

并且仍在 theano_backend 文件中:

添加:

from theano import ifelse

对不起英语。

升级 keras 应该可以正常工作。

我有类似的问题。使用 pip install keras

升级 keras

现在以下版本组合有效。

1.0.1 2.1.3