我正在使用TensorFlow后端。
我正在按顺序应用卷积、最大池、展平和密集层。卷积需要3D输入(高度、宽度、color\u channels\u深度)。
在卷积之后,它变为(高度、宽度、过滤器的数量)。
在应用最大池化高度和宽度变化之后。但是,在应用展平层之后,到底会发生什么?例如,如果展平之前的输入是(24, 24, 32),那么它是如何展平的?
对于每个过滤器号的高度、重量,它是像(24*24)一样顺序的,还是以其他方式?一个例子将与实际值一起欣赏。
它的顺序类似于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
展平张量意味着移除除一个维度以外的所有维度。
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。您可以在这里找到更多详细信息。
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},我想要一个单步输出。到目前为止,我无法理解是否应该将数据展平,以及在哪里。 如果我不展平,如果我在最后一层之前展平,如果我在第一层之前展平,结果就会改变。但我还没有办法判断其中是否有一个是正确的。 在这个问