在阅读了这个问题的答案后,我对整个 PackedSequence 对象的事情仍然有点困惑。据我了解,这是一个针对循环模型中可变大小序列的并行处理而优化的对象,零填充是一个[不完美]解决方案。看起来,给定一个 PackedSequence 对象,Pytorch RNN 将处理批次中的每个序列直至结束,并且不会继续处理填充。那么为什么这里需要填充呢?为什么同时存在 pack_padded_sequence() 和 pack_sequence() 方法?
首先,我已经阅读了这个和这个与我名字相似的问题,但仍然没有答案。
我想建立一个用于序列预测的前馈网络。(我意识到 RNN 更适合这项任务,但我有我的理由)。序列的长度为 128,每个元素是一个有 2 个条目的向量,因此每个批次都应具有形状(batch_size, 128, 2)
,目标是序列中的下一步,因此目标张量应具有形状(batch_size, 1, 2)
。
网络架构是这样的:
model = Sequential()
model.add(Dense(50, batch_input_shape=(None, 128, 2), kernel_initializer="he_normal" ,activation="relu"))
model.add(Dense(20, kernel_initializer="he_normal", activation="relu"))
model.add(Dense(5, kernel_initializer="he_normal", activation="relu"))
model.add(Dense(2))
Run Code Online (Sandbox Code Playgroud)
但是尝试训练时出现以下错误:
ValueError: Error when checking target: expected dense_4 to have shape (128, 2) but got array with shape (1, 2)
Run Code Online (Sandbox Code Playgroud)
我尝试过以下变体:
model.add(Dense(50, input_shape=(128, 2), kernel_initializer="he_normal" ,activation="relu"))
Run Code Online (Sandbox Code Playgroud)
但得到同样的错误。
我有一个(任意形状的)X
整数数组,并且我想计算每个条目的阶乘的对数(精确地,不是通过Gamma函数)。数字足够大
np.log(scipy.special.factorial(X))
Run Code Online (Sandbox Code Playgroud)
是不可行的。所以我想做类似的事情np.sum(np.log(np.arange(2,X+1)), axis=-1)
但是arange()函数为每个条目赋予不同的大小,因此这是行不通的。我虽然想用填充,但是我不确定该怎么做。
能以向量化的方式完成吗?