我正在使用tensorflow后端。
顺序应用卷积,最大池化,展平和密集层。卷积需要3D输入(高度,宽度,color_channels_depth)。
卷积后,它变为(高度,宽度,Number_of_filters)。
应用max-pooling height后,宽度会发生变化。但在应用展平层后究竟发生了什么?例如。
如果在展平之前输入是(24,24,32)那么它是如何展平的呢?
对于高度,每个过滤器编号的重量是顺序还是以某种其他方式顺序(24 * 24)?一个例子将被实际值所赞赏。
答案 0 :(得分:29)
Flatten()
运算符展开从最后一个维度开始的值(至少对于Theano来说,这是“通道优先”,而不是像TF这样的“通道最后”。我无法在我的环境中运行TensorFlow)。这相当于numpy.reshape
和'C'排序:
'C'表示使用类似C的索引顺序读/写元素 最后一个轴索引变化最快,回到第一个轴索引 改变最慢。
这是一个独立的示例,用于说明使用Keras Functional API的Flatten
运算符。您应该能够轻松适应您的环境。
import numpy as np
from keras.layers import Input, Flatten
from keras.models import Model
inputs = Input(shape=(3,2,4))
# Define a model consisting only of the Flatten operation
prediction = Flatten()(inputs)
model = Model(inputs=inputs, outputs=prediction)
X = np.arange(0,24).reshape(1,3,2,4)
print(X)
#[[[[ 0 1 2 3]
# [ 4 5 6 7]]
#
# [[ 8 9 10 11]
# [12 13 14 15]]
#
# [[16 17 18 19]
# [20 21 22 23]]]]
model.predict(X)
#array([[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
# 11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21.,
# 22., 23.]], dtype=float32)
答案 1 :(得分:3)
如24 * 24 * 32那样顺序并重新整形,如下面的代码所示。
def batch_flatten(x):
"""Turn a nD tensor into a 2D tensor with same 0th dimension.
In other words, it flattens each data samples of a batch.
# Arguments
x: A tensor or variable.
# Returns
A tensor.
"""
x = tf.reshape(x, tf.stack([-1, prod(shape(x)[1:])]))
return x
答案 2 :(得分:0)
对张量进行平整意味着除去除一个之外的所有尺寸。
Keras中的Flatten层将张量整形为具有等于张量中包含的元素数量的形状。
这与制作一维元素数组相同。
例如,在VGG16模型中,您可能会很容易理解:
>>> model.summary()
Layer (type) Output Shape Param #
================================================================
vgg16 (Model) (None, 4, 4, 512) 14714688
________________________________________________________________
flatten_1 (Flatten) (None, 8192) 0
________________________________________________________________
dense_1 (Dense) (None, 256) 2097408
________________________________________________________________
dense_2 (Dense) (None, 1) 257
===============================================================
请注意,flatten_1图层的形状如何(无,8192),其中8192实际上是4 * 4 * 512。
PS,“无”表示任何尺寸(或动态尺寸),但通常可以将其读取为1。您可以在here中找到更多详细信息。