得到错误,"属性错误:'模块'对象没有属性' ifelse'"

时间:2017-09-16 12:10:18

标签: keras theano vgg-net

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

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之外别无选择。请adivce。

4 个答案:

答案 0 :(得分:4)

转到theano_backend文件。

在线:

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

覆盖:

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

仍然在theano_backend文件中:

添加:

from theano import ifelse

对不起英文。

答案 1 :(得分:4)

升级keras应该可以使它工作。

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

升级keras

现在跟随版本组合工作。

1.0.1 2.1.3

答案 2 :(得分:2)

尝试简单:

 import theano
 print theano.ifelse  

如果它显示错误,您的theano安装很可能是错误的,您应该重新安装。

示例输出

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

答案 3 :(得分:2)

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