【问题标题】:How to replace dense layer with convolutional one?如何用卷积层替换密集层?
【发布时间】:2018-09-17 17:29:29
【问题描述】:

我想用卷积层替换 Dense_out 层,谁能告诉我该怎么做?

代码:

model = Sequential()
conv_1 = Conv2D(filters = 32,kernel_size=(3,3),activation='relu')
model.add(conv_1)
conv_2 = Conv2D(filters=64,kernel_size=(3,3),activation='relu')
model.add(conv_2)
pool = MaxPool2D(pool_size = (2,2),strides = (2,2), padding = 'same')
model.add(pool)
drop = Dropout(0.5)
model.add(drop)
model.add(Flatten())
Dense_1 = Dense(128,activation = 'relu')
model.add(Dense_1)
Dense_out = Dense(57,activation = 'softmax')
model.add(Dense_out)
model.compile(optimizer='Adam',loss='categorical_crossentropy',metric=['accuracy'])
model.fit(train_image,train_label,epochs=10,verbose = 1,validation_data=(test_image,test_label))
print(model.summary())

当我尝试这段代码时:

model = Sequential()
conv_01 = Conv2D(filters = 32,kernel_size=(3,3),activation='relu')
model.add(conv_01)
conv_02 = Conv2D(filters=64,kernel_size=(3,3),activation='relu')
model.add(conv_02)
pool = MaxPool2D(pool_size = (2,2),strides = (2,2), padding = 'same')
model.add(pool)
conv_11 = Conv2D(filters=64,kernel_size=(3,3),activation='relu')
model.add(conv_11)
pool_2 = MaxPool2D(pool_size=(2,2),strides=(2,2),padding='same')
model.add(pool_2)
drop = Dropout(0.3)
model.add(drop)
model.add(Flatten())
Dense_1 = Dense(128,activation = 'relu')
model.add(Dense_1)
Dense_2 = Dense(64,activation = 'relu')
model.add(Dense_2)
conv_out = Conv2D(filters= 64,kernel_size=(3,3),activation='relu')
model.add(Dense_out)
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(train_image,train_label,epochs=10,verbose = 1,validation_data=(test_image,test_label))

我收到以下错误

ValueError: 层 conv2d_3 的输入 0 与层不兼容: 预期 ndim=4,发现 ndim=2。收到的完整形状:[无,64]

我是新手,所以解释会很有帮助

【问题讨论】:

  • 你能更好地解释你的问题吗?你想在输出层做些什么改变?
  • 你是什么意思“转换”,在什么意义上你认为密集(或任何其他)层可以“转换”为卷积层?

标签: python keras keras-layer


【解决方案1】:

您需要重新整形才能在 conv2D 图层中根据需要使用 2x2 过滤器。 您可以使用:

out = keras.layers.Reshape(target_shape)
model.add(out)

然后做卷积:

conv_out = Conv2D(filters=3,kernel_size=(3,3),activation='softmax')
model.add(conv_out)

filters 是您希望输出层中的通道数(RGB 为 3)。

关于Keras Documentation中的层和参数的更多信息

【讨论】:

  • dense_2 的目标形状输出也是?
  • 没有。目标形状是您想要作为输出的矩阵的形状。如果您想要一个大小为 [None, 64, 64, 3] 的矩阵(64 x 64 彩色图像)作为输出,那么这将是您的形状。此值应与dense_2 中的过滤器大小相同。 64 个过滤器 = 高度 x 重量 x 通道
猜你喜欢
  • 2016-08-26
  • 2017-04-30
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多