为了账号安全,请及时绑定邮箱和手机立即绑定

检查目标时出错:将 FC 图层转换为 Conv2D

检查目标时出错:将 FC 图层转换为 Conv2D

qq_笑_17 2022-08-02 17:20:56
我试图用卷积层替换VGG 16网络末尾的FC层。以下是我的代码:model2= Sequential()model2.add(Conv2D(4096, kernel_size=(8,8), activation="relu"))model2.add(Conv2D(4096, kernel_size=(1,1), activation="relu"))model2.add(Conv2D(16, kernel_size=(1,1), activation="softmax"))model = applications.VGG16(weights='imagenet', include_top=False, input_shape=inputshape)F2model = Model(inputs=model.input, outputs=model2(model.output))for layer in F2model.layers[:25]:   layer.trainable = FalseF2model.compile(optimizer=optimizers.Adam(), loss="binary_crossentropy", metrics=["accuracy"])batch_size = 128trainsize = 36000validsize = 12000F2model.fit_generator(    train_generator,    steps_per_epoch=trainsize // batch_size,    epochs=5,    validation_data=valid_generator,    validation_steps=validsize // batch_size,callbacks=[tensorboard_callback])我使用FC层训练常规网络,运行良好,但是当我运行上述内容时,我收到以下错误:ValueError                                Traceback (most recent call last)in <module>  4         epochs=5,  5         validation_data=valid_generator,  ----> 6         validation_steps=validsize // batch_size,callbacks=[tensorboard_callback])ValueError: Error when checking target: expected sequential_1 to have 4 dimensions, but got array with shape (32, 16)在这一点上,我试图弄清楚这些维度(32,16)来自哪里。ANy的帮助将不胜感激。谢谢
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

keras的功能API更适合这种问题:


model = VGG16(weights='imagenet', include_top=False, input_shape=inputshape)

x = model.output

x = Conv2D(4096, kernel_size=(8, 8), activation="relu")(x)

x = Conv2D(4096, kernel_size=(1, 1), activation="relu")(x)

out = Conv2D(16, kernel_size=(1, 1), activation="softmax")(x)


F2model = Model(inputs=model.inputs, outputs=out)



for layer in F2model.layers[:25]:

    layer.trainable = False

此外,我看到您正在使用具有softmax激活的binary_crossentropy,这可能会导致一些问题:

- 使用softmax和categorical_crossentropy

- 使用sigmoid和binary_crossentropy


并且要小心这个模型,使用4096的卷积将使你的参数数量真的非常动!


(本例中为 1.65 亿)

编辑

看起来你的问题只来自你的标签数组:

  • 您的最后一层是卷积层,因此它期望一个带有形状的4D数组,但您正在给它一个形状数组(batch_size, height, width, channel)(batch_size, 16)

  • 因此,要么将最后一层更改为:

out = Dense(16, activation="softmax")(x)
  • 或者将标签数组更改为卷积层可接受。


查看完整回答
反对 回复 2022-08-02
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号