我正在使用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。
答案 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
现在跟随版本组合工作。
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。然后它应该完美。