我试图了解该Flatten
功能在Keras中的作用。下面是我的代码,它是一个简单的两层网络。它接收形状为(3,2)的二维数据,并输出形状为(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),为什么还要进一步使其平坦?
Dense(16, input_shape=(5,3)
,将来自16组(对于这些神经元的所有5组)的每个输出神经元都连接到所有(3 x 5 = 15)输入神经元吗?或者将第一个16组中的每个神经元仅连接到第一个5组输入神经元中的3个神经元,然后将第二个16组中的每个神经元仅连接到第二组5个输入神经元中的3个神经元神经元等。。。。