【发布时间】: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 内核......有时我会遇到非常奇怪的错误,这些错误是这样解决的。 (不知道为什么,但是经常在我中断一些代码时开始)