连接到初始化器的 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 值错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试从主机连接到 mysql docker 容器时出现“读取初始通信数据包”错误

将初始视图控制器连接到选项卡视图控制器

连接到 Derby 网络服务器时找不到数据库错误

初始化提供者的传输层连接错误

gitkraken 无法连接到 gitlab 无效参数

无法连接到元数据库 h2 数据库