Keras 2D密集输出层

时间:2019-03-01 15:50:13

标签: conv-neural-network keras-layer sequential

我正在玩一个模型,该模型应该以8x8的国际象棋棋盘作为输入,编码为224x224的灰度图像,然后输出64x13的一维编码逻辑回归=正方形上的棋子概率。

现在,在卷积层之后,我还不太清楚,如何继续获得2D密集层作为结果/目标。

我尝试在序列模型中添加一个Dense(64,13)作为图层,但是出现错误“ Dense`只能接受1个位置参数('units',”)

是否有可能训练2D目标?

EDIT1: 这是我的代码的相关部分,简化了:

# X.shape = (10000, 224, 224, 1)
# Y.shape = (10000, 64, 13)

model = Sequential([
    Conv2D(8, (3,3), activation='relu', input_shape=(224, 224, 1)),
    Conv2D(8, (3,3), activation='relu'),

    # some more repetitive Conv + Pooling Layers here

    Flatten(),

    Dense(64,13)
])
  

TypeError:Dense只能接受1个位置参数('units',),但是您传递了以下位置参数:[64,13]

EDIT2:正如Anand V. Singh所建议的,我将Dense(64,13)更改为Dense(832),效果很好。损失=毫秒。

使用“ sparse_categorical_crossentropy”作为损失和64x1编码(而不是64x13)会更好吗?

2 个答案:

答案 0 :(得分:1)

在“密集”中,您仅传递希望作为输出的层数,如果您希望将(64x13)作为输出,则将层尺寸设置为Dense(832)(64x13 = 832),然后稍后重塑形状。您还需要调整Y的形状,以便准确计算损耗,该损耗将用于反向传播。

# X.shape = (10000, 224, 224, 1)
# Y.shape = (10000, 64, 13)
Y = Y.reshape(10000, 64*13)
model = Sequential([
    Conv2D(8, (3,3), activation='relu', input_shape=(224, 224, 1)),
    Conv2D(8, (3,3), activation='relu'),
    # some more repetitive Conv + Pooling Layers here
    Flatten(),
    Dense(64*13)
])

如果它没有发布失败的地方,那应该可以完成工作,我们可以继续进行下去。

答案 1 :(得分:0)

Reshape 层允许您控制输出形状。

    Flatten(),
    Dense(64*13)
    Reshape((64,13))#2D