Подтвердить что ты не робот

Сохранять сохраненную контрольную точку и прогнозировать не получение таких же результатов, как при обучении

Я тренируюсь на основе кода, который я нашел в Интернете. Точность тестирования составляет 92%, а контрольные точки сохраняются в каталоге. Параллельно (обучение работает уже 3 дня) Я хочу создать свой код предсказания, чтобы я мог узнать больше, а не просто ждать.

Это мой третий день глубокого обучения, поэтому я, вероятно, не знаю, что делаю. Вот как я пытаюсь предсказать:

  • Создайте модель, используя тот же код, что и при обучении
  • Загрузите последнюю контрольную точку
  • Попробуйте предсказать

Код работает, но результаты не достигают 90%.

Вот как я создаю модель:

INPUT_LAYERS = 2
OUTPUT_LAYERS = 2
AMOUNT_OF_DROPOUT = 0.3
HIDDEN_SIZE = 700
INITIALIZATION = "he_normal"  # : Gaussian initialization scaled by fan_in (He et al., 2014)
CHARS = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ .")

def generate_model(output_len, chars=None):
    """Generate the model"""
    print('Build model...')
    chars = chars or CHARS
    model = Sequential()
    # "Encode" the input sequence using an RNN, producing an output of HIDDEN_SIZE
    # note: in a situation where your input sequences have a variable length,
    # use input_shape=(None, nb_feature).
    for layer_number in range(INPUT_LAYERS):
        model.add(recurrent.LSTM(HIDDEN_SIZE, input_shape=(None, len(chars)), init=INITIALIZATION,
                         return_sequences=layer_number + 1 < INPUT_LAYERS))
        model.add(Dropout(AMOUNT_OF_DROPOUT))
    # For the decoder input, we repeat the encoded input for each time step
    model.add(RepeatVector(output_len))
    # The decoder RNN could be multiple layers stacked or a single layer
    for _ in range(OUTPUT_LAYERS):
        model.add(recurrent.LSTM(HIDDEN_SIZE, return_sequences=True, init=INITIALIZATION))
        model.add(Dropout(AMOUNT_OF_DROPOUT))

    # For each of step of the output sequence, decide which character should be chosen
    model.add(TimeDistributed(Dense(len(chars), init=INITIALIZATION)))
    model.add(Activation('softmax'))

    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

В отдельном файле predict.py я импортирую этот метод для создания моей модели и попытаюсь предсказать:

...import code
model = generate_model(len(question), dataset['chars'])
model.load_weights('models/weights.204-0.20.hdf5')

def decode(pred):
    return character_table.decode(pred, calc_argmax=False)


x = np.zeros((1, len(question), len(dataset['chars'])))
for t, char in enumerate(question):
    x[0, t, character_table.char_indices[char]] = 1.

preds = model.predict_classes([x], verbose=0)[0]

print("======================================")
print(decode(preds))

Я не знаю, в чем проблема. У меня около 90 контрольных точек в моем каталоге, и я загружаю последний, основываясь на точности. Все они сохранены с помощью ModelCheckpoint:

checkpoint = ModelCheckpoint(MODEL_CHECKPOINT_DIRECTORYNAME + '/' + MODEL_CHECKPOINT_FILENAME,
                         save_best_only=True)

Я застрял. Что я делаю неправильно?

4b9b3361

Ответ 1

В предоставленном репо предложения обучения и валидации перевернуты перед подачей в модель (как это обычно делается при обучении seq2seq).

dataset = DataSet(DATASET_FILENAME)

Как вы можете видеть, значение по умолчанию для inverted равно True, и вопросы инвертируются.

class DataSet(object):
    def __init__(self, dataset_filename, test_set_fraction=0.1, inverted=True):
        self.inverted = inverted

    ...

        question = question[::-1] if self.inverted else question
        questions.append(question)

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

x = np.zeros((1, len(question), len(dataset['chars'])))
for t, char in enumerate(question):
    x[0, len(question) - t - 1, character_table.char_indices[char]] = 1.

Ответ 2

Когда вы создаете модель в файле pred.py:

model = generate_model(len(question), dataset['chars'])

- ваш первый параметр такой же, как в вашем учебном файле? Или динамика вопроса? Если это так, вы создаете другую модель, поэтому сохраненная контрольная точка не работает.

Ответ 3

Это может быть размерность передаваемых массивов /df, не соответствующих ожидаемым функциями, которые вы вызываете. Если для вызываемого метода ожидается одноразмерность, попробуйте ravel на то, что вы ожидаете как одномерное значение