首页 > 解决方案 > 训练模型和负载模型的精度不同

问题描述

我已经尝试过model.save_weights()and model.save(),以及它们相应的加载语句(model.load_weights()and load_model())。如果我只是在训练代码的末尾推送我所有的评估代码,一切都会很好。

问题在于停止 Python,启动新的 Python 脚本,并读取权重/模型以使用它们进行推理。我在加载时尝试过的主要方法是:定义模型(使用训练运行中保存权重的相同代码),然后运行model.load_weights(),然后编译模型。这是行不通的。然而,正如我所说,走model.save()andload_model()路线会产生类似的垃圾输出。

我的代码:

from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Flatten, Dense, Embedding, Conv1D, GlobalMaxPooling1D, Dropout
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint

model = Sequential()
model.add(Embedding(vocab_size, embedding_dim, input_length=train_padded.shape[1]))

model.add(Conv1D(48, 5, activation='relu', padding='valid'))
model.add(GlobalMaxPooling1D())
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dropout(0.5))

model.add(Dense(11, activation='softmax'))
model.compile(loss= 'categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

epochs = 50
batch_size = 32
history = model.fit(train_padded, training_labels, shuffle=False ,
                    epochs=epochs, batch_size=batch_size,
                    validation_split=0.2,
                    callbacks=[ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=0.0001),
                               EarlyStopping(monitor='val_loss', mode='min', patience=2, verbose=1),
                               EarlyStopping(monitor='val_accuracy', mode='max', patience=5, verbose=1)])
score = model.evaluate(train_padded, training_labels, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], score[1]*100))

#save model
tf.keras.models.save_model(model,'model.h5',overwrite=True)
#load model
model = tf.keras.models.load_model('model.h5')
score = model.evaluate(train_padded, training_labels, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], score[1]*100))

#or
#save weights
model.save_weights('model.h5')
#load weights
model.load_weights('model.h5')
model.compile(loss= 'categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
score = model.evaluate(train_padded, training_labels, verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[1], score[1]*100))

输出

83.14% #training model
17.60% #load_model
21.37% #load_weights

请帮助我..训练模型和负载模型的权重相同,但准确性不同。在相同数据上,使用 load_model() 的准确率从 ~80%(训练模型)提高到 ~20%。

谢谢

标签: pythontensorflowkeras

解决方案


我的问题通过修复使用 NumPy 随机生成器的 keras 的种子得到解决,并且由于我使用 Tensorflow 作为后端,我还修复了它的种子。我在文件顶部添加了这 4 行,其中还定义了模型。

from numpy.random import seed 
seed(1) # keras seed fixing import

import tensorflow
tensorflow.random.set_seed(2) # tensorflow seed fixing

有关更多信息,请查看 - https://machinelearningmastery.com/reproducible-results-neural-networks-keras/


推荐阅读