我遇到了一个错误,但是它被埋在TensorFlow库中,所以我正在努力找出我的模型出了什么问题。
我正在尝试将RNN与LSTM结合使用。我的模型如下:
model = Sequential()
model.add(LSTM(128, activation='relu',
input_shape=1000, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(2, activation='softmax'))
opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
我的训练数据是一个列表列表,每个列表包含1000个浮点数。例如,x_train[0] =
[0.0, 0.0, 0.1, 0.25, 0.5, ...]
我收到此错误:
File "C:\Users\bencu\Desktop\ProjectFiles\Code\Program.py", line 74, in FitModel
input_shape=1000, return_sequences=True))
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\layers\recurrent_v2.py", line 881, in __init__
**kwargs)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\layers\recurrent.py", line 1007, in __init__
super(DropoutRNNCellMixin, self).__init__(*args, **kwargs)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\layers\recurrent.py", line 2541, in __init__
**kwargs)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\layers\recurrent.py", line 395, in __init__
super(RNN, self).__init__(**kwargs)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\training\tracking\base.py", line 457, in _method_wrapper
result = method(self, *args, **kwargs)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 356, in __init__
batch_input_shape = (batch_size,) + tuple(kwargs['input_shape'])
TypeError: 'int' object is not iterable
我是ML的新手,所以如果有人能弄清楚我要去哪里错了,那将不胜感激。谢谢。
答案 0 :(得分:2)
Keras期望input_shape
始终是 tuple ;对于单个值,它看起来像(1000,)
。
对于LSTM,预期的完整形状(batch_shape
)为:(num_samples, timesteps, num_channels)
-或等效地为(batch_size, timesteps, features)
。 input_shape
就是batch_shape
,没有维度0-即(timesteps, num_channels)
。如果您输入的数据是单变量(例如1D序列),则num_channels=1
-这样:
model.add(LSTM(128, activation='relu', input_shape=(1000, 1), return_sequences=True))
最后,对于'binary_crossentropy'
,更好的输出层将是Dense(1, activation='sigmoid')
。有关更多信息,请参见this answer。
提示:请确保运行print(x_train.shape)
,并确保除first(第0维)之外的所有值都与您的input_shape
相匹配。但是,我建议始终使用batch_shape
而不是input_shape
,除非应用程序涉及可变的批处理大小-这样会使调试变得更加容易。
对于您的一维示例,如果它返回类似(32, 1000)
的内容,则需要添加尺寸以使其成为3D:x_train = np.expand_dims(x_train, -1)
(-1 =最后一个轴)
答案 1 :(得分:1)
即使输入张量是一维的,自变量input_shape
也应该是一个元组。请改用input_shape=(1000,)
。请注意,逗号对于确保Python将其解释为元组而不是单个整数很重要。
答案 2 :(得分:1)
错误消息显示:TypeError: 'int' object is not iterable
。因此,我们的代码中的int
出了点问题,这导致Error
是因为它是错误的Type
。
我们自己的代码中堆栈跟踪中的最新行是:
model.add(LSTM(128, activation='relu', input_shape=1000, return_sequences=True))
这里唯一的int
是128
和1000
。 128是单位数,所以很好。 input_shape
不是;如果我们指定一个numpy(或类似的)数组的“形状”,那么我们需要一系列值-每个维的大小一个。是的,即使是一维输入。
我们将其指定为(1000,)
。