Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 为什么不先使用“展平”,然后再使用“密集层”,而不是“时间分布”?_Tensorflow_Machine Learning_Keras_Lstm_Keras Layer - Fatal编程技术网

Tensorflow 为什么不先使用“展平”,然后再使用“密集层”,而不是“时间分布”?

Tensorflow 为什么不先使用“展平”,然后再使用“密集层”,而不是“时间分布”?,tensorflow,machine-learning,keras,lstm,keras-layer,Tensorflow,Machine Learning,Keras,Lstm,Keras Layer,我试图更好地理解Keras层。我正在研究一个序列到序列的模型,在这个模型中我嵌入一个句子并将其传递给一个返回序列的LSTM。此后,我想对句子中的每个时间步(单词)应用一个稠密层,似乎时间分布完成了三维张量的工作,如本例所示 在我的理解中,稠密层只适用于二维张量,而时间分布只适用于三维中的每个时间步。那么,我们是否可以简单地将时间步长展平,应用致密层并进行重塑以获得相同的结果,或者这些时间步长是否在某种程度上不等同于我所缺少的时间步长?假设您有一批4个时间步长,每个时间步长包含一个3元素向量。让我

我试图更好地理解Keras层。我正在研究一个序列到序列的模型,在这个模型中我嵌入一个句子并将其传递给一个返回序列的LSTM。此后,我想对句子中的每个时间步(单词)应用一个稠密层,似乎时间分布完成了三维张量的工作,如本例所示


在我的理解中,稠密层只适用于二维张量,而时间分布只适用于三维中的每个时间步。那么,我们是否可以简单地将时间步长展平,应用致密层并进行重塑以获得相同的结果,或者这些时间步长是否在某种程度上不等同于我所缺少的时间步长?

假设您有一批4个时间步长,每个时间步长包含一个3元素向量。让我们用这个来表示:

现在,您希望使用密集层转换此批次,因此每个时间步可以获得5个特征。层的输出可以表示为以下内容:

你考虑两个选项,一个代码> TimeTimeButix/<代码>密集层,或者作为一个平坦的输入整形,应用一个密集的层并重新调整到时间步长。

在第一个选项中,您将为每个时间步应用一个包含3个输入和5个输出的密集层。这可能是这样的:

这里的每个蓝色圆圈都是致密层中的一个单位。通过对每个输入时间步执行此操作,可以获得总输出。重要的是,这五个单位在所有时间步中都是相同的,因此只有具有3个输入和5个输出的单个密集层的参数

第二种选择是将输入展平为12个元素的向量,应用一个包含12个输入和20个输出的密集层,然后再将其重新整形。这就是它的样子:

为了清晰起见,这里仅绘制了一个单元的输入连接,但每个单元都将连接到每个输入。显然,这里有更多的参数(具有12个输入和20个输出的密集层的参数),还要注意每个输出值都受每个输入值的影响,因此一个时间步中的值会影响其他时间步中的输出。这是好是坏取决于您的问题和模型,但这与前一个问题相比是一个重要的区别,在前一个问题中,每个时间步长的输入和输出都是独立的。除此之外,此配置要求您在每个批次上使用固定数量的时间步,而之前的配置与时间步数无关


你也可以考虑有四个致密层的选项,每一个都独立地应用于每个时间步长(我没有画它,但是希望你能得到这个想法)。这与前一个类似,只有每个单元只从其各自的时间步长输入接收输入连接。我不认为在Keras中有一种简单的方法可以做到这一点,你必须将输入分成四个部分,对每个部分应用密集层,然后合并输出。同样,在这种情况下,时间步数是固定的。

致密层可以作用于任何张量,不一定是秩2。我认为时间分布式包装器不会改变致密层的行为方式。仅将稠密层应用于秩3的张量将与应用稠密层的时间分布包装器完全相同。以下是示例:

from tensorflow.keras.layers import *
from tensorflow.keras.models import *

model = Sequential()

model.add(Dense(5,input_shape=(50,10)))

model.summary()
_________________________________________________________________ 层(类型)输出形状参数 ================================================================= 时间分布3(时间距离(无,50,5)55 ================================================================= 总数:55 可培训参数:55 不可训练参数:0 _________________________________________________________________
除上述答案外,, 下面是几张比较两层输出形状的图片。因此,在LSTM之后使用其中一层时(例如)会有不同的行为。

然后你会有一个大的密集层,每个时间步都有不同的参数,而不是将同一个单一的时间步密集层应用于输入中的每个时间步。我假设密集层必须以某种方式连接到每个时间步,以便更新后支柱上的权重?我相信我没有正确理解这个概念是因为我n事实上,我无法将这些方法可视化。正如@Andrey Kite Gorin在下面提到的,密集层可以应用于3D张量,它们可以做你喜欢做的事情。我认为在Keras的一些早期版本中,你必须使用时间分布为密集的方法,但仅适用于2D张量,这就是为什么一些教程仍然有我喜欢它。 _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_5 (Dense) (None, 50, 5) 55 ================================================================= Total params: 55 Trainable params: 55 Non-trainable params: 0 _________________________________________________________________
model1 = Sequential()

model1.add(TimeDistributed(Dense(5),input_shape=(50,10)))

model1.summary()
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= time_distributed_3 (TimeDist (None, 50, 5) 55 ================================================================= Total params: 55 Trainable params: 55 Non-trainable params: 0 _________________________________________________________________