我正在试图理解Keras中扁平化功能的作用。下面是我的代码,这是一个简单的两层网络。它接收形状(3,2)的二维数据,输出形状(1,4)的一维数据:
model = Sequential()
model.add(Dense(16, input_shape=(3, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')
x = np.array([[[1, 2], [3, 4], [5, 6]]])
y = model.predict(x)
print y.shape
这将打印出y具有形状(1,4)。但是,如果我删除展平线,则它会打印出y具有形状(1、3、4)。
我不明白这一点。根据我对神经网络的理解,这个模型。add(Dense(16,input\u shape=(3,2)))函数正在创建一个具有16个节点的隐藏完全连接层。每个节点都连接到每个3x2输入元素。因此,第一层输出端的16个节点已经“平坦”。因此,第一层的输出形状应为(1,16)。然后,第二层将其作为输入,并输出形状(1,4)的数据。
所以,如果第一层的输出已经是“平坦的”并且是形状(1,16),为什么我需要进一步平坦它呢?
短读:
展平张量意味着移除除一个维度以外的所有维度。这正是展平层所做的。
长读:
如果我们考虑创建的原始模型(带有Flatten层),我们可以得到以下模型摘要:
Layer (type) Output Shape Param #
=================================================================
D16 (Dense) (None, 3, 16) 48
_________________________________________________________________
A (Activation) (None, 3, 16) 0
_________________________________________________________________
F (Flatten) (None, 48) 0
_________________________________________________________________
D4 (Dense) (None, 4) 196
=================================================================
Total params: 244
Trainable params: 244
Non-trainable params: 0
对于这一总结,下一幅图像有望对每一层的输入和输出大小提供更多的意义。
您可以阅读的Flatten层的输出形状是(无,48)
。这是提示。您应该阅读它(1,48)
或(2,48)
或...或(16,48)
...或(32,48)
,...
事实上,该位置上的无表示任何批量大小。对于要调用的输入,第一个维度表示批量大小,第二个维度表示输入特征的数量。
Keras中扁平层的作用非常简单:
张量上的展平运算将张量重塑为具有等于张量非中包含的元素数量(包括批处理维度)的形状。
注意:我使用了model.summary()
方法来提供输出形状和参数细节。
如果阅读Dense的Keras文档条目,您将看到此调用:
Dense(16, input_shape=(5,3))
将产生一个具有3个输入和16个输出的密集
网络,这些输入和16个输出将独立应用于5个步骤中的每一个。因此,如果D(x)
将3维向量转换为16-d向量,您将从图层中获得的输出将是一系列向量:[D(x[0,:]), D(x[1,:]),..., D(x[4,:])]
具有形状(5,16)
。为了具有您指定的行为,您可以首先将您的输入展平到15-d向量,然后应用
密集
:
model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')
编辑:正如一些人难以理解的那样,这里有一幅解释性的图片:
我正在使用TensorFlow后端。 我正在按顺序应用卷积、最大池、展平和密集层。卷积需要3D输入(高度、宽度、color\u channels\u深度)。 在卷积之后,它变为(高度、宽度、过滤器的数量)。 在应用最大池化高度和宽度变化之后。但是,在应用展平层之后,到底会发生什么?例如,如果展平之前的输入是(24, 24, 32),那么它是如何展平的? 对于每个过滤器号的高度、重量,它是像(24*
我试图为时间序列分析构建一个简单的神经网络。到目前为止,我只添加了致密层(但如果您喜欢,欢迎对LSTM等进行评论)。 我的输入是通常的格式{样本,时间步,特征},比如说{1000,100,3},我想要一个单步输出。到目前为止,我无法理解是否应该将数据展平,以及在哪里。 如果我不展平,如果我在最后一层之前展平,如果我在第一层之前展平,结果就会改变。但我还没有办法判断其中是否有一个是正确的。 在这个问
问题内容: 我试图了解TimeDistributed包装器在Keras中的作用。 我得到了TimeDistributed“将层应用于输入的每个时间片”。 但是我做了一些实验,却得到了我无法理解的结果。 简而言之,对于LSTM层,TimeDistributed和Just Dense层的结果相同。 对于这两个模型,我得到的输出形状为 (None,10,1) 。 在RNN层之后,谁能解释TimeDist
问题内容: 我有一个这样的清单: 此列表中的每个项目可能包含一个数据对或一个元组,我想将此列表更改为 然后这样做: 我不知道如何更改列表结构,或者如何基于原始列表进行相同的计算? 问题答案: 如果您只想整理列表,请使用:http : //docs.python.org/library/itertools.html#itertools.chain.from_iterable
问题内容: 我之前已经找到了解决方案,但是我想知道最快的解决方案是将包含其他任意长度列表的列表展平。 例如: 会成为: 可以有无限多个级别。一些列表对象可以是字符串,在输出列表中不得将其展平为它们的顺序字符。 问题答案: 这是一种字符串友好的递归方法: 返回: 请注意,这并不能保证速度或开销的使用,但是说明了一种递归解决方案,希望会对您有所帮助。