Tensorflow - TypeError: 'int' object is not iterable

Tensorflow - TypeError: 'int' object is not iterable

我收到一个错误,但它隐藏在 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 的新手,所以如果有人能找出我哪里出错了,我将不胜感激。谢谢。

参数 input_shape 应该是一个元组,即使输入张量是一维的。请改用 input_shape=(1000,)。请注意,逗号对于确保 Python 将其解释为元组而不是单个整数很重要。

错误消息显示: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(或类似)数组的 "shape",那么我们需要一系列值 - 每个维度的大小一个。是的,即使是一维输入。

我们将其指定为 (1000,)

Keras 期望 input_shape 始终是一个 元组 ;对于单个值,它看起来像 (1000,).

然而,对于 LSTM,预期的完整形状 (batch_shape) 是:(num_samples, timesteps, num_channels) - 或等效地,(batch_size, timesteps, features)input_shape 只是没有维度 0 的 batch_shape - 即 (timesteps, num_channels)。如果您的输入数据是 单变量 (例如一维序列),则 num_channels=1 - 因此:

model.add(LSTM(128, activation='relu', input_shape=(1000, 1), return_sequences=True))

最后,对于 'binary_crossentropy',更好的输出层是 Dense(1, activation='sigmoid')。有关详细信息,请参阅


提示:可以肯定的是,运行 print(x_train.shape),并确保除了第一个 (dim 0) 之外的所有值都与您的 input_shape.但是,我建议始终使用 batch_shape 而不是 input_shape,除非应用程序涉及可变批处理大小 - 它使调试更容易。

对于您的 1D 示例,如果它 returns 类似于 (32, 1000),您需要添加一个维度使其成为 3D:x_train = np.expand_dims(x_train, -1)(-1 = 最后一个轴)