python - 训练模型和负载模型的精度不同
问题描述
我已经尝试过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%。
谢谢
解决方案
我的问题通过修复使用 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/
推荐阅读
- fonts - 为什么我无法更改导入的 Google 字体的字体粗细?
- python - 将 x 更改为 2D 以制作线性回归图
- reactjs - 是否可以从 CSV 字符串而不是 CSV 文件加载 webdatarocks 数据源?
- javascript - 如何使用metro-ui在点击时关闭弹出框
- node.js - 打字稿中没有重载匹配此调用 decrpyt 字符串?
- python - 我正在使用一个子进程来调用一个 python 脚本,当它运行时它给了我这个错误。我已经使用 pip 安装了所有库
- javascript - Gatsby - wrapPageElement 中的布局不更新状态
- javascript - Jquery blur 事件监听器只激活一次
- c++ - 如何存储值以供以后使用?
- python - OpenCV 帧到 FFMPEG