连接到初始化器的 LSTM 值错误
Posted
技术标签:
【中文标题】连接到初始化器的 LSTM 值错误【英文标题】:LSTM value error connected to the initializer 【发布时间】:2018-11-07 02:05:58 【问题描述】:我正在使用 Keras 构建 LSTM 模型。
def LSTM_model_1(X_train,Y_train,Dropout,hidden_units):
model = Sequential()
model.add(Masking(mask_value=666, input_shape=(X_train.shape[1],X_train.shape[2])))
model.add(LSTM(hidden_units, activation='tanh', return_sequences=True, dropout=Dropout))
model.add(LSTM(hidden_units, return_sequences=True))
model.add(LSTM(hidden_units, return_sequences=True))
model.add(Dense(Y_train.shape[-1], activation='softmax'))
model.compile(loss='mean_squared_error', optimizer='adam',metrics['categorical_accuracy'])
return model
输入数据的形状 X_train.shape=(77,100,34); Y_Train.shape=(77,100,7)
Y 数据是单热编码的。对于最后一个列表条目,两个输入张量都是零填充的。 Y_train 中的填充值为 0。因此,没有任何状态的填充端值为 1。 dropout=0 和 hidden_units=2 这似乎与以下错误无关。
不幸的是,我得到以下错误,我认为这与 Y 的形状有关。但我无法将手指放在它上面。初始化/添加第一个 LSTM 层时会发生错误。
ValueError: 变量 lstm_58/kernel/ 的初始化程序来自内部 控制流构造,例如循环或条件。当创建一个 循环或条件内的变量,使用 lambda 作为 初始化器。
如果我遵循错误,我注意到它归结为:
dtype:如果设置,initial_value 将被转换为给定的类型。 如果
None
,则将保留数据类型(如果initial_value
是 张量)或convert_to_tensor
将决定。
"convert to tensor' 创建一个对象,然后它是 None 并导致错误。显然,LSTM 试图将输入转换为张量......但是如果我查看我的输入,它已经是一个张量。
你们有没有人知道出了什么问题或如何使用 lambda 作为初始化程序?谢谢
编辑:堆栈跟踪
文件“C:\Users\310122653\Documents\GitHub\DNN\build_model.py”,行 44、在 LSTM_model_1 model.add(LSTM(hidden_units, activation='tanh', return_sequences=True, dropout=Dropout))
文件 "C:\ProgramData\Anaconda3\lib\site-packages\keras\models.py", 第 492 行,添加 output_tensor = layer(self.outputs[0])
文件 "C:\ProgramData\Anaconda3\lib\site-packages\keras\layers\recurrent.py", 第 499 行,在 call 中 return super(RNN, self).call(inputs, **kwargs)
文件 "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\topology.py", 第 592 行,在 调用 self.build(input_shapes[0])
文件 "C:\ProgramData\Anaconda3\lib\site-packages\keras\layers\recurrent.py", 第 461 行,正在构建中 self.cell.build(step_input_shape)
文件 "C:\ProgramData\Anaconda3\lib\site-packages\keras\layers\recurrent.py", 第 1838 行,正在构建中 约束=self.kernel_constraint)
文件 "C:\ProgramData\Anaconda3\lib\site-packages\keras\legacy\interfaces.py", 第 91 行,在包装器中 返回函数(*args, **kwargs)
文件 "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\topology.py", 第 416 行,在 add_weight 约束=约束)
文件 "C:\ProgramData\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py", 第 395 行,在变量中 v = tf.Variable(值, dtype=tf.as_dtype(dtype), name=name)
文件 "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\ops\variables.py", 第 235 行,在 init 中 约束=约束)
文件 "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\ops\variables.py", 第 356 行,在 _init_from_args “初始化器。” % 名称)
【问题讨论】:
请分享堆栈跟踪。 你好丹尼尔。很高兴再次见到你。我添加了错误的堆栈跟踪。 因为它看起来是一个 dtype 问题。输入和目标数据都是 float64。那可能是错误吗?在描述中,如果没有给出其他 dtype,则接受 tensor 或 float32。我将尝试将两者都转换为 float32 并返回结果 你的代码中真的是这样吗?model.add(Masking(mask_value=666, input_shape=X_train.shape[1],X_train.shape[2])))
(看来输入形状应该是(X_train.shape[1], X_train.shape[2])
。
也许你可以完全重新启动你的 python 内核......有时我会遇到非常奇怪的错误,这些错误是这样解决的。 (不知道为什么,但是经常在我中断一些代码时开始)
【参考方案1】:
在这种情况下,解决方案是重新启动内核。 感谢 Daniel Möller
【讨论】:
以上是关于连接到初始化器的 LSTM 值错误的主要内容,如果未能解决你的问题,请参考以下文章