【问题标题】:Keras LSTM multidimensional output error — expected time_distributed_17 to have 3 dimensions, but got array with shape (1824, 3)Keras LSTM 多维输出错误 - 预期 time_distributed_17 具有 3 维,但得到的数组具有形状 (1824, 3)
【发布时间】:2018-06-24 21:18:53
【问题描述】:

我正在尝试按顺序预测多维值,例如 [[0, 0, 2], [1, 0, 3], [2, 3, 4], [3, 2, 5], [4, 0, 6], [5, 0, 7] ... ] 并希望 LSTM 捕获每个 [x, y, z] 维度。

当我尝试在下面的模型上运行model.fit() 时,我得到标题中的错误,

ValueError: Error when checking target: expected time_distributed_19 to have 3 dimensions, but got array with shape (1824, 3)

我知道输出层应该具有三个维度,但我在思考如何需要 LSTM 来处理我的 n 维值序列时感到困惑。

这是我的模型。请注意,如果我按照某些解决方案的建议取消注释 Flatten() 行,我会在 model.compile() 上得到一个不起眼的 AssertionError

# X shape: (1824, 256, 3)
# Y shape: (1824, 3)

model = Sequential()

model.add(LSTM(units=128, input_shape=(X.shape[1], X.shape[2]), return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(units=128, return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(units=128, return_sequences=True))
model.add(Dropout(0.2))

# model.add(Flatten())

model.add(TimeDistributed(Dense(Y.shape[1], activation='softmax')))

model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')

这是模型摘要:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_145 (LSTM)              (None, 256, 128)          67584     
_________________________________________________________________
dropout_140 (Dropout)        (None, 256, 128)          0         
_________________________________________________________________
lstm_146 (LSTM)              (None, 256, 128)          131584    
_________________________________________________________________
dropout_141 (Dropout)        (None, 256, 128)          0         
_________________________________________________________________
time_distributed_19 (TimeDis (None, 256, 3)            387       
=================================================================
Total params: 199,555
Trainable params: 199,555
Non-trainable params: 0
_________________________________________________________________
None

此模型在我添加 TimeDistributed() 包装器之前运行(尽管我必须从最后一个隐藏层中删除 return_sequences=True 才能使其工作),但我添加了 TimeDistributed() 因为我不认为单个变量我的 3 维特征值被捕获。

非常感谢任何见解,谢谢。

更新

感谢nuric 对我最初的问题的快速回答,我确认我之前的做法是“正确的方式”,而我的困惑源于我得到的预测。给定一个来自 X 的序列,我得到一个像这样的 3D 向量:[9.915069e-01 1.084390e-04 8.384804e-03](它总是关于 [1, 0, 0]

在我之前的 LSTM 模型中,这个预测向量的最大值对应于我对字母/单词的 one-hot 编码中的索引,但这里我想要的是对下一个 3D 向量的 x、y 和 z 值的预测在序列中。

【问题讨论】:

    标签: python tensorflow keras lstm


    【解决方案1】:

    模型预测的内容(当前是 3D)与目标是 2D 的内容不匹配。你有两个选择:

    1. 应用Flatten并移除TimeDistributed,这意味着模型将根据整个序列进行预测。
    2. 从最后一个 LSTM 中删除 return_sequences=True 以让 LSTM 压缩序列并再次删除 TimeDistributed。这样,模型将根据最后的 LSTM 输出而不是序列进行预测。

    考虑到序列的大小和您拥有的隐藏单元的数量,我更喜欢第二个选项。如果您只是将序列展平,即参数太多,选项一将为 Dense 层创建一个非常大的内核。

    【讨论】:

    • 非常感谢您的快速回复!选项 2 是我在添加 TimeDistributed 之前所拥有的。我对得到的结果没有很好的感觉,而且模型似乎没有捕捉到各个维度,但我在解释预测数据的方式上可能是不正确的。如果您有兴趣进一步提供帮助,我已为我的问题添加了更新。再次感谢!
    猜你喜欢
    • 2020-07-19
    • 2018-07-18
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2018-08-03
    • 2017-11-26
    相关资源
    最近更新 更多