Python 加载保存的检查点并预测不会产生与培训中相同的结果

Python 加载保存的检查点并预测不会产生与培训中相同的结果,python,tensorflow,deep-learning,keras,Python,Tensorflow,Deep Learning,Keras,我正在根据我在网上找到的一个示例代码进行培训。测试的准确率为92%,检查点保存在一个目录中。同时(培训已经进行了3天),我想创建我的预测代码,这样我就可以学到更多,而不仅仅是等待 这是我深入学习的第三天,所以我可能不知道自己在做什么。以下是我试图预测的方式: ...import code model = generate_model(len(question), dataset['chars']) model.load_weights('models/weights.204-0.20.hdf5'

我正在根据我在网上找到的一个示例代码进行培训。测试的准确率为92%,检查点保存在一个目录中。同时(培训已经进行了3天),我想创建我的预测代码,这样我就可以学到更多,而不仅仅是等待

这是我深入学习的第三天,所以我可能不知道自己在做什么。以下是我试图预测的方式:

...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%

以下是我创建模型的方式:

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's 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
我不知道是什么问题。我的目录中有大约90个检查点,我正在根据准确性加载最后一个检查点。所有这些都通过
ModelCheckpoint
保存:

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

我卡住了。我做错了什么?

在predict.py文件中生成模型时:

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

您的第一个参数是否与培训文件中的相同?还是问题的长度是动态的?如果是这样,您将生成不同的模型,因此保存的检查点不起作用

可能是传递的数组/df的维数与您调用的函数所期望的不匹配。当被调用的方法预期为单一维度时,请尝试在您提供的回购中预期为单一维度的内容上进行
ravel
,训练和验证语句在输入到模型中之前会反转(如seq2seq学习中通常所做的)

如您所见,
inversed
的默认值为
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.

如果您还保存优化器状态,它是否有效?您可以通过在检查点中添加参数
save\u weights\u only=False
来实现这一点,我必须尝试一下。问题是,我可以通过给代码我的最后一个检查点来恢复训练,它以与以前相同的精度拾取,因此我的预测代码中一定有错误。您尝试预测的数据是否与用于训练的数据相同?如果不是,预测的低精度表明您的模型过度拟合了训练数据!我尝试了一个在培训期间使用的问题(并且得到了肯定的验证),结果仍然很糟糕。你已经尝试过我的建议了吗?因为如果不添加
save_weights
参数,则不会保存优化器状态。因此,如果你用重新加载的模型恢复训练,你的准确度会降低。我两种都试过了。我甚至从训练中使用的控制台中选择了一个问题。只要确保参数值在两种情况下(训练和推理)都相同即可。我几乎放弃了这件事。非常感谢。
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.