当前位置: 首页 > 知识库问答 >
问题:

Keras中的扁平层是如何工作的?

韩佐
2023-03-14

我正在使用TensorFlow后端。

我正在按顺序应用卷积、最大池、展平和密集层。卷积需要3D输入(高度、宽度、color\u channels\u深度)。

在卷积之后,它变为(高度、宽度、过滤器的数量)。

在应用最大池化高度和宽度变化之后。但是,在应用展平层之后,到底会发生什么?例如,如果展平之前的输入是(24, 24, 32),那么它是如何展平的?

对于每个过滤器号的高度、重量,它是像(24*24)一样顺序的,还是以其他方式?一个例子将与实际值一起欣赏。

共有3个答案

庄萧迟
2023-03-14

它的顺序类似于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
艾晋
2023-03-14

展平张量意味着移除除一个维度以外的所有维度。

Keras中的扁平层重塑张量,使其形状等于张量中包含的元素数量。

这与创建1d元素数组是一样的。

例如,在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。您可以在这里找到更多详细信息。

陶宏浚
2023-03-14

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

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

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

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中扁平化功能的作用。下面是我的代码,这是一个简单的两层网络。它接收形状(3,2)的二维数据,输出形状(1,4)的一维数据: 这将打印出y具有形状(1,4)。但是,如果我删除展平线,则它会打印出y具有形状(1、3、4)。 我不明白这一点。根据我对神经网络的理解,这个模型。add(Dense(16,input\u shape=(3,2)))函数正在创建一个具有16个节点的隐藏完

  • 问题内容: 我认为当输入值为0时将输出0,因此以下各层可能会跳过计算或其他操作。 如何运作? 例: 实际输出为:(数字是随机的) 但是,我认为输出将是: 问题答案: 实际上,设置嵌入层不会导致返回零向量。而是,嵌入层的行为不会改变,它将返回索引为零的嵌入向量。您可以通过检查Embedding层权重(即在您提到的示例中为)来确认这一点。取而代之的是,它将影响诸如RNN层之类的后续层的行为。 如果检查

  • 问题内容: 我试图了解TimeDistributed包装器在Keras中的作用。 我得到了TimeDistributed“将层应用于输入的每个时间片”。 但是我做了一些实验,却得到了我无法理解的结果。 简而言之,对于LSTM层,TimeDistributed和Just Dense层的结果相同。 对于这两个模型,我得到的输出形状为 (None,10,1) 。 在RNN层之后,谁能解释TimeDist

  • 我对神经网络和keras有点陌生。我有一些大小为6*7的图像,过滤器的大小为15。我想有几个过滤器,并在每个上分别训练一个卷积层,然后组合它们。我在这里看了一个例子: 此型号使用一个过滤器。有谁能给我一些关于如何修改模型以处理并行卷积层的提示吗。 谢啦

  • 问题内容: This is my test code: The output is: 但是发生了什么? 文件上说: 注意:如果层的输入的秩大于2,则为 在初始点积之前先展平带核。 当输出被重塑时? 问题答案: 目前,与文件中所述相反的是, 层[应用在输入张量的最后一个轴上](网址:keras.com/https://github- 团队/KERA/问题/10736#问题建议-406589140):

  • 我试图为时间序列分析构建一个简单的神经网络。到目前为止,我只添加了致密层(但如果您喜欢,欢迎对LSTM等进行评论)。 我的输入是通常的格式{样本,时间步,特征},比如说{1000,100,3},我想要一个单步输出。到目前为止,我无法理解是否应该将数据展平,以及在哪里。 如果我不展平,如果我在最后一层之前展平,如果我在第一层之前展平,结果就会改变。但我还没有办法判断其中是否有一个是正确的。 在这个问