Сохраните и продолжите обучение сети LSTM - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь заставить модель LSTM продолжить работу, если ее последний запуск был остановлен.Все компилируется нормально, пока я не попытаюсь приспособиться к сети.Затем выдает ошибку:

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

Я проверилразличные статьи, такие как это и это , но я не вижу, что не так в моем коде.

from keras import Sequential
from keras.preprocessing.sequence import pad_sequences
from sklearn.model_selection import train_test_split
from keras.models import Sequential,Model
from keras.layers import LSTM, Dense, Bidirectional, Input,Dropout,BatchNormalization
from keras import backend as K
from keras.engine.topology import Layer
from keras import initializers, regularizers, constraints

from keras.callbacks import ModelCheckpoint
from keras.models import load_model
import os.path
import os
filepath="Train-weights.best.hdf5"
act = 'relu'

model = Sequential()
model.add(BatchNormalization(input_shape=(10, 128)))
model.add(Bidirectional(LSTM(128, dropout=0.5, activation=act, return_sequences=True)))
model.add(Dense(1,activation='sigmoid'))

if (os.path.exists(filepath)):
   print("extending training of previous run")
   model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
   with open('model_architecture.json', 'r') as f:
      model = model_from_json(f.read())
   model.load_weights(filepath)
else:
   print("First run")      
   model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
   model.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=100, batch_size=32, callbacks=callbacks_list, verbose=2)
   model.save_weights(filepath)
   with open('model_architecture.json', 'w') as f:
       f.write(model.to_json())

 checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
 callbacks_list = [checkpoint]

 model.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=100, batch_size=32, callbacks=callbacks_list, verbose=0)

1 Ответ

0 голосов
/ 21 ноября 2018

Попробуйте model.summary(), и вы увидите, что выходная форма последнего слоя (т.е. плотного слоя) в сети равна (None, 10, 1).Поэтому метки, которые вы указываете для модели (т. Е. y_train), также должны иметь форму (num_samples, 10, 1).

Если выходная форма (None, 10, 1) - это не то, что вам нужно (например, вы хотите (None, 1))в качестве выходной формы вашей модели), то вам нужно изменить определение модели.Одна простая модификация для достижения этой цели - удаление аргумента return_sequences=True со слоя LSTM.

...