我试图了解该Flatten功能在Keras中的作用.下面是我的代码,这是一个简单的双层网络.它接收形状(3,2)的二维数据,并输出形状(1,4)的1维数据:
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
Run Code Online (Sandbox Code Playgroud)
这打印出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),为什么我需要进一步压平它?
谢谢!
machine-learning neural-network deep-learning keras tensorflow
我想将ConvLSTM和Conv2D的输出传递给Keras中的Dense Layer,使用全局平均池和flatten之间的区别是两者都适用于我的情况.
model.add(ConvLSTM2D(filters=256,kernel_size=(3,3)))
model.add(Flatten())
# or model.add(GlobalAveragePooling2D())
model.add(Dense(256,activation='relu'))
Run Code Online (Sandbox Code Playgroud) 我开始使用Keras构建神经网络模型.
我有一个分类问题,其中的功能是离散的.为了管理这种情况,标准过程包括使用单热编码转换二进制数组中的离散特征.
然而,似乎使用Keras这一步骤不是必需的,因为可以简单地使用嵌入层来创建这些离散特征的特征向量表示.
如何执行这些嵌入?
我的理解是,如果离散特征f可以采用k值,则嵌入层会创建一个带有k列的矩阵.每次我收到该功能的值时,比如说i,在训练阶段,只会i更新矩阵的列.
我的理解是否正确?
我开始使用keras和tensorflow深入学习东西.在第一阶段,我感到疑惑.当我使用tf.contrib.layers.flatten(Api 1.8)平整图像时(也可以是多通道).
这与使用numpy的flatten函数有什么不同?这对培训有何影响.我可以看到tf.contrib.layers.flatten比numpy flatten需要更长的时间.它正在做更多的事情吗?
这是一个非常接近的问题,但这里接受的答案包括Theano并没有完全解决我的疑虑.
示例:假设我有一个(10000,2,96,96)形状的训练数据.现在我需要输出(10000,18432)形状.我可以使用tensorflow flatten或使用像numpy flatten这样做
X_reshaped = X_train.reshape(*X_train.shape[:1], -2)
Run Code Online (Sandbox Code Playgroud)
它在培训方面有何不同,哪种方法最佳?