Tensorflow - TypeError: объект 'int' не повторяется - PullRequest
1 голос
/ 31 октября 2019

Я получаю сообщение об ошибке, но оно скрыто в библиотеке 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 ]

2 голосов
/ 31 октября 2019

Керас ожидает, что input_shape всегда будет кортеж ;для одного значения это будет выглядеть как (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'),Для получения дополнительной информации см. этот ответ .


Совет : чтобы убедиться, выполните print(x_train.shape) и убедитесь, что все значения, кроме первого (dim0) соответствует вашему input_shape. Однако я бы рекомендовал всегда использовать batch_shape вместо input_shape, если только приложение не использует переменные размеры пакетов - это значительно упрощает отладку.

Для вашего 1D-примера, если он возвращает что-то вроде (32, 1000) вам нужно добавить измерение, чтобы сделать его 3D: x_train = np.expand_dims(x_train, -1) (-1 = последняя ось)

1 голос
/ 31 октября 2019

Сообщение об ошибке гласит: 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 нет;если мы указываем «форму» массива (или аналогичного), нам нужна последовательность значений - по одному для размера каждого измерения. Да, даже для одномерного ввода.

Мы указываем это вместо (1000,).

1 голос
/ 31 октября 2019

Предполагается, что аргумент input_shape будет кортежем, даже если входной тензор является одномерным. Вместо этого используйте input_shape=(1000,). Обратите внимание, что запятая важна для того, чтобы Python интерпретировал ее как кортеж, а не как одно целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...