我正在尝试使用来自预训练的ResNet50(keras.applications中包含的那些)的一些层来构建神经网络 为此,我正在使用模型的get_layer方法。像这样。
input = Input( (224, 224 , 3) )
resnet = ResNet50(weights='imagenet', pooling=max, include_top = False , input_tensor=input )
firstconv = resnet.get_layer("conv1")
然后我打印出firstconv的形状:
print( firstconv.output_shape )
我得到了预期的结果(根据model.summary()):(?,112,112,64)
然后在代码中我通过输入张量调用firstconv层:
x = firstconv( inputs )
然后我打印出这个x
的形状,然后我得到(?,109,109,64)代码断开,因为形状冲突。
我想知道为什么会这样,我该如何解决它。我还在学习keras和深度学习,也许我尝试访问Resnet50中的层的方式有问题。
提前致谢
我正在使用Uppntu 14.04,Keras 2.1.4和Tensorflow 1.6从pip安装为keras的后端。
编辑:
self.input = Input( (224, 224 , 3) )
self.resnet = ResNet50(weights='imagenet', pooling=max, include_top = False , input_tensor=self.input )
for layer in self.resnet.layers:
layer.trainable = False
self.firstconv = self.resnet.get_layer("conv1")
print(" first convt output ")
# this outputs (? , 112 , 112 , 3) , the desired shape
print( self.firstconv.output_shape )
... later on the code
x = self.firstconv( self.input)
print( x.shape )
# this outputs ( ? , 109 , 109 , 64 ), but the expected shape is ( ? , 112 , 112 , 64 )
就是这样。代码之间我没有在self.firstconv或输入
上做任何事情答案 0 :(得分:0)
ResNet50的示例代码
model = ResNet50(weights = "imagenet",
include_top = False,
input_shape = (224,224, 3))
for layer in model.layers:
layer.trainable = False
x = model.output
# flatten outputs of resnet
x = Flatten()(x)
# add a fully connected layer
predictions = Dense(1, activation = "sigmoid")(x)
# build the model
model_final = Model(inputs = model.input, outputs = predictions)
关于如何重现问题和代码目的,您的描述有点模糊。此处的示例代码提供了使用ResNet50处理输入和输出的正确方法。
答案 1 :(得分:0)
我发现在这种情况下会发生什么奇怪的事。
我在两台不同的机器上工作,当我在第一台(在家里)打印resnet.summary()时,它告诉我,restnet模型的第一层是 conv1 所以我记住了这些信息,并设置在另一台机器上工作,后来经过多次尝试后我终于意识到,在第二台机器上,第一层Resnet是 conv1d_pad ,这一层正在接受( 224,224,3)输入并将其转换为(230,230,3),这是畸形问题的起源。我仍然不知道为什么存在这种差异,但我能够克服这个问题。