keras卷积神经网络 – 输出形状

请原谅我的无知,因为我刚开始接触这个领域。我正在尝试从我的神经网络中获得正确的输出形状,我的网络有3个Conv2D层然后是2个Dense层。我的输入形状是(140, 140, 4),即4张灰度图像。当我输入一个输入时,我期望得到(1, 4)的输出,但在这里我得到的形状是(14, 14, 4)。我在这里做错了什么?非常感谢您的帮助!

meta_layers = [Conv2D, Conv2D, Conv2D, Dense, Dense]
meta_inits = ['lecun_uniform'] * 5
meta_nodes = [32, 64, 64, 512, 4]
meta_filter = [(8,8), (4,4), (3,3), None, None]
meta_strides = [(4,4), (2,2), (1,1), None, None]
meta_activations = ['relu'] * 5
meta_loss = "mean_squared_error"
meta_optimizer=RMSprop(lr=0.00025, rho=0.9, epsilon=1e-06)
meta_n_samples = 1000
meta_epsilon = 1.0;
meta = Sequential()
meta.add(self.meta_layers[0](self.meta_nodes[0], init=self.meta_inits[0], input_shape=(140, 140, 4), kernel_size=self.meta_filters[0], strides=self.meta_strides[0]))
meta.add(Activation(self.meta_activations[0]))
for layer, init, node, activation, kernel, stride in list(zip(self.meta_layers, self.meta_inits, self.meta_nodes, self.meta_activations, self.meta_filters, self.meta_strides))[1:]:
    if(layer == Conv2D):
        meta.add(layer(node, init = init, kernel_size = kernel, strides = stride))
        meta.add(Activation(activation))
    elif(layer == Dense):
        meta.add(layer(node, init=init))
        meta.add(Activation(activation))
    print("meta node: " + str(node))
meta.compile(loss=self.meta_loss, optimizer=self.meta_optimizer)

回答:

您的问题在于,在Keras版本>=2.0中,Dense层被应用于输入的最后一个通道(您可以在这里阅读相关信息这里)。所以如果您对形状为(14, 14, 64)Conv2D层应用:

Dense(512)

您将得到形状为(14, 14, 512)的输出,然后对其应用Dense(4)将给您形状为(14, 14, 4)的输出。您可以调用model.summary()方法来确认我的话。

为了解决这个问题,您需要对最后一个卷积层的输出应用以下层之一:GlobalMaxPooling2DGlobalAveragePooling2DFlatten,以便将您的输出压缩为仅2维(形状为(batch_size, features))。

Related Posts

如何从数据集中移除EXIF数据?

我在尝试从数据集中的图像中移除EXIF数据(这些数据将…

用于Python中的“智能点”游戏的遗传算法不工作

过去几天我一直在尝试实现所谓的“智能点”游戏。我第一次…

哪个R平方得分更有帮助?

data.drop(‘Movie Title’, ax…

使用线性回归预测GRE分数对录取率的影响

我正在学习线性回归,并尝试在Jupyter笔记本中用P…

使用mlrMBO贝叶斯优化进行SVM超参数调优时出现错误

我试图针对一个分类任务优化SVM,这个方法在许多其他模…

Keras模型的二元交叉熵准确率未发生变化

我在网上看到了很多关于这个问题的提问,但没有找到明确的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注