我正在使用TensorFlow后端。
我按顺序应用卷积、最大池化、展平和全连接层。卷积需要一个三维输入(高度、宽度、颜色通道深度)。
经过卷积之后,它变成了(高度、宽度、滤波器数量)。
应用最大池化后,高度和宽度会发生改变。但是,在应用展平层之后,会发生什么呢?例如,如果展平之前的输入是(24,24,32),那么它会如何展平?
它是否像(24 * 24)一样按每个滤波器号码顺序逐个展开,还是以其他方式展开?能否给出实际值的示例说明会更好。
我正在使用TensorFlow后端。
我按顺序应用卷积、最大池化、展平和全连接层。卷积需要一个三维输入(高度、宽度、颜色通道深度)。
经过卷积之后,它变成了(高度、宽度、滤波器数量)。
应用最大池化后,高度和宽度会发生改变。但是,在应用展平层之后,会发生什么呢?例如,如果展平之前的输入是(24,24,32),那么它会如何展平?
它是否像(24 * 24)一样按每个滤波器号码顺序逐个展开,还是以其他方式展开?能否给出实际值的示例说明会更好。
Flatten()
操作符从最后一个维度开始展开值(至少对于 Theano 而言,其是“通道优先”的,而不是像 TensorFlow 那样是“通道最后”的。我无法在我的环境中运行 TensorFlow)。这相当于使用 'C' 排序的 numpy.reshape
:
'C' 表示使用类似于 C 的索引顺序读取/写入元素,最后一个轴索引最快地改变,回到第一个轴索引最慢地改变。
下面是使用 Keras 函数式 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)
将张量扁平化意味着除了一个维度之外,移除所有的维度。
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 层的形状是(None,8192),这里的 8192 实际上是 4*4*512。
PS,None 表示任何维度(或动态维度),但通常可以将其视为 1。您可以在此处找到更多详细信息。
它是像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