Ошибка размеров LSTM Nerual Network Input / Output - PullRequest
0 голосов
/ 11 января 2019

Я довольно новичок в архитектуре TensorFlow и LSTM. У меня проблема с вычислением входных и выходных данных (x_train, x_test, y_train, y_test) для моего набора данных.

Форма моих входов изначально:

  • X_train: (366,4)
  • X_test: (104,4)
  • Y_train: (366,)
  • Y_test: (104,)

Ytrain и Ytest - это серия цен на акции. Xtrain и Xtest - это четыре функции, которые я хочу научить прогнозировать цены на акции.

# Splitting the training and testing data

train_start_date = '2010-01-08'
train_end_date = '2017-01-06'
test_start_date = '2017-01-13'
test_end_date = '2019-01-04'

train = df.ix[train_start_date : train_end_date]
test = df.ix[test_start_date:test_end_date]


X_test = sentimentScorer(test)
X_train = sentimentScorer(train)

Y_test = test['prices'] 
Y_train = train['prices']

#Conversion in 3D array for LSTM INPUT

X_test = X_test.reshape(1, 104, 4)
X_train = X_train.reshape(1, 366, 4)





model = Sequential()

model.add(LSTM(128, input_shape=(366,4), activation='relu', 
return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.1))

model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(10, activation='softmax'))

opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

# Compile model
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy'],
)

model.fit(X_train,
          Y_train,
          epochs=3,
          validation_data=(X_test, Y_test))

Это сгенерированная ошибка:

----------------------------------------------- ---------------------------- ValueError Traceback (последний вызов последний) в 65 лет, 66 эпох = 3, ---> 67 validation_data = (X_test, Y_test))

C: \ Users \ Талал \ AppData \ Local \ программы \ питон \ python36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ keras \ двигатель \ training.py в соответствии (self, x, y, batch_size, эпохи, подробности, обратные вызовы, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, ** kwargs) 1507 steps_name = 'steps_per_epoch', 1508 steps = steps_per_epoch, -> 1509 validation_split = validation_split) 1510 1511 # Подготовить данные проверки.

C: \ Users \ Талал \ AppData \ Local \ программы \ питон \ python36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ keras \ двигатель \ training.py в _standardize_user_data (self, x, y, sample_weight, class_weight, batch_size, check_steps, steps_name, steps, validation_split) 991 х, у = следующий_элемент 992 x, y, sample_weights = self._standardize_weights (x, y, sample_weight, -> 993 class_weight, batch_size) 994 возврат x, y, sample_weights 995

C: \ Users \ Талал \ AppData \ Local \ программы \ питон \ python36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ keras \ двигатель \ training.py в _standardize_weights (self, x, y, sample_weight, class_weight, batch_size) 1110 feed_input_shapes, 1111
check_batch_axis = False, # Не применять размер пакета. -> 1112 exception_prefix = 'input') 1113 1114, если y не None:

C: \ Users \ Талал \ AppData \ Local \ программы \ питон \ python36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ keras \ двигатель \ training_utils.py в standardize_input_data (данные, имена, формы, check_batch_axis, exception_prefix) 314 ': ожидается' + имена [i] + 'иметь' + 315 стр (len (форма)) + «размеры, но есть массив» -> 316 'с формой' + str (data_shape)) 317, если не check_batch_axis: 318 data_shape = data_shape [1:]

ValueError: Ошибка при проверке ввода: ожидается, что lstm_18_input будет иметь 3 размера, но получил массив с формой (366, 4)

Ответы [ 3 ]

0 голосов
/ 11 января 2019
  1. LSTM ожидает ввода значений dim как (num_examples, seq_length, input_dims), поэтому на входе имеется одна ошибка.

  2. Вы прогнозируете выходные данные измерения 1, а выходные данные вашей модели равны 10. Попробуйте это.

    model.add(Dense(1, activation='linear'))

  3. Кроме того, вы прогнозируете цену, которая является проблемой регрессии. Но вы используете настройку классификации. Попробуйте это

    model.compile(loss='mse', optimizer='adam', metrics=['mean_squared_error'])

0 голосов
/ 11 января 2019

Ваше измерение неверно для X_train. LSTM принимает только 3-мерные входные данные. Вы говорите, что у вас есть 4 функции. Предполагая, что 366 - это количество временных меток для одного семпла, ваш ввод должен быть в форме (num_samples, 366,4) ура: -)

0 голосов
/ 11 января 2019

Ваш код почти в порядке.

Ваши y_test и y_train должны быть массивом с одним элементом или массивом формы (1,1), это не имеет значения.

Ваша входная форма неправильная, хотя первый LSTM должен быть:

model.add(LSTM(128, input_shape=(None,4), activation='relu', return_sequences=True))

Примечание None, поскольку длина вашего теста и последовательности поездов различна, вы не можете указать ее (и Keras принимает первое измерение без указания). Ошибка произошла из-за длин 366 и 104 соответственно. Если вы хотите использовать пакеты с RNN, вы должны выполнить заполнение нулями с помощью keras.preprocessing.sequence.pad_sequences.

Не нужно указывать input_shape с партией, с остальной сетью все должно быть в порядке.

И если вы выполняете регрессию, а не классификацию, как, вероятно, имеет место, вы должны выполнить два последних шага, написанных @Ankish Bansal, например, изменив потери на mean squared error и заставив последний слой вывести 1 значение вместо 10.

...