Tensorflow-TypeError:'int'对象不可迭代

时间:2019-10-31 00:45:25

标签: python tensorflow keras lstm recurrent-neural-network

我遇到了一个错误,但是它被埋在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的新手,所以如果有人能弄清楚我要去哪里错了,那将不胜感激。谢谢。

3 个答案:

答案 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))

这里唯一的int1281000。 128是单位数,所以很好。 input_shape不是;如果我们指定一个numpy(或类似的)数组的“形状”,那么我们需要一系列值-每个维的大小一个。是的,即使是一维输入。

我们将其指定为(1000,)