【问题标题】:How does the Flatten layer work in Keras?Keras 中的 Flatten 层是如何工作的?
【发布时间】:2017-10-25 21:30:16
【问题描述】:

我正在使用 TensorFlow 后端。

我正在依次应用卷积、最大池化、展平和密集层。卷积需要 3D 输入(高度、宽度、颜色通道深度)。

卷积之后,变成(height, width, Number_of_filters)。

应用最大池化高度和宽度更改后。但是,在应用了 flatten 层之后,究竟会发生什么?比如flatten之前的输入是(24, 24, 32),那它是怎么把它展平的呢?

每个过滤器编号的高度、重量是按顺序排列的(24 * 24),还是以其他方式排列?如果有实际值,将不胜感激。

【问题讨论】:

标签: tensorflow neural-network keras keras-layer


【解决方案1】:

Flatten() 运算符展开从最后一个维度开始的值(至少对于 Theano,它是“通道优先”,而不是像 TF 那样的“通道最后”。我无法在我的环境中运行 TensorFlow)。这相当于 numpy.reshape 使用 'C' 排序:

‘C’表示使用类 C 的索引顺序读取/写入元素,其中 最后一个轴索引变化最快,回到第一个轴索引 变化最慢。

这是一个独立的示例,说明 Flatten 运算符与 Keras 功能 API。您应该能够轻松适应您的环境。

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)

【讨论】:

    【解决方案2】:

    扁平化张量意味着删除除一个之外的所有维度。

    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,None 表示任何维度(或动态维度),但通常可以将其理解为 1。您可以在here 找到更多详细信息。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2021-04-11
        • 1970-01-01
        • 2019-10-15
        • 2018-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        相关资源
        最近更新 更多