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

时间:2017-08-16 15:29:10

标签: machine-learning neural-network keras conv-neural-network keras-layer

请原谅我的无知,因为我是该地区的新手。我试图从我的神经网络获得正确的输出形状,其具有3个Conv2D层,然后是2个密集层。我的输入形状是(140,140,​​4),它们是4个灰度图像。当我输入1输入时,我期望输出为(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)

1 个答案:

答案 0 :(得分:2)

你的问题在于,在版本> = 2.0的Keras中,Dense图层应用于输入的最后一个通道(您可以阅读它here)。所以如果你申请:

Dense(512)

到具有Conv2D形状的(14, 14, 64)图层,您将获得形状为(14, 14, 512)的输出,然后Dense(4)应用于它将为您提供带有形状的输出{ {1}}。您可以拨打(14, 14, 4)方法来确认我的话。

要解决此问题,您需要将以下图层之一:model.summary()GlobalMaxPooling2DGlobalAveragePooling2D应用于最后一个卷积图层的输出,以便将输出压缩到只有2维(形状为Flatten