我试图了解Flatten在Keras中的功能。以下是我的代码,这是一个简单的两层网络。它获取形状(3、2)的二维数据,并输出形状的1维数据(1,4):

model = Sequential()
model.add(Dense(16, input_shape=(3, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

x = np.array([[[1, 2], [3, 4], [5, 6]]])

y = model.predict(x)

print y.shape

这打印出来y具有形状(1,4)。但是,如果我删除Flatten线,然后打印出来y具有形状(1、3、4)。

我不明白。从我对神经网络的理解,model.add(Dense(16, input_shape=(3, 2)))函数正在创建一个带有16个节点的隐藏完全连接的层。这些节点中的每个节点都连接到3x2输入元素中的每个节点。因此,第一层输出的16个节点已经"平坦"。因此,第一层的输出形状应为(1,16)。然后,第二层将其作为输入,并输出形状的数据(1,4)。

因此,如果第一层的输出已经"平坦"并且形状(1,16),为什么我需要进一步将其弄平呢?

答案

如果您阅读了KERAS文档条目Dense,您会看到此调用:

Dense(16, input_shape=(5,3))

会导致Dense具有3个输入和16个输出的网络将对5个步骤中的每个步骤独立应用。因此,如果D(x)将3维向量转换为16-D向量,您将从层中获得的输出将是一系列向量:[D(x[0,:]), D(x[1,:]),..., D(x[4,:])]与形状(5, 16)。为了拥有您指定的行为,您可能首先Flatten您对15-D矢量的输入,然后申请Dense

model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

**EDIT:**正如有些人努力理解的那样 - 在这里,您有一个解释的形象:

enter image description here

来自: stackoverflow.com