【问题标题】:keras convolutional nerural network - output shapekeras 卷积神经网络 - 输出形状
【发布时间】:2018-01-24 20:03:39
【问题描述】:

请原谅我的无知,因为我是该地区的新手。我试图从我的神经网络中获得正确的输出形状,它有 3 个 Conv2D 层,然后是 2 个 Dense 层。我的输入形状是 (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)

【问题讨论】:

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


    【解决方案1】:

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

    Dense(512)
    

    到形状为(14, 14, 64)Conv2D 层,您将获得形状为(14, 14, 512) 的输出,然后应用Dense(4) 将为您提供形状为(14, 14, 4) 的输出。你可以调用model.summary()方法来确认我的话。

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

    【讨论】:

    • 只是增加了一个扁平层吗?我尝试在最后一个卷积层之后添加一个,它给了我这个错误:输入 0 与 flatten_2 层不兼容:预期 min_ndim=3,发现 ndim=2
    • 这看起来很奇怪。看起来你压扁了你的第一个卷积层。
    • 没关系,我添加它时只是一个愚蠢的错误。使用 flatten 解决了这个问题。谢谢!
    • 尝试同时测试其他层 - 使用Pooling,因为它们可能有助于加快计算速度。
    • 这些层只会影响速度吗?或者它们也可能影响训练结果?
    猜你喜欢
    • 2019-09-09
    • 2020-10-07
    • 2017-07-30
    • 2017-08-31
    • 2020-05-26
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    相关资源
    最近更新 更多