对于训练模型和负荷模型得到了不同的准确率



我已经尝试了model.save_weights()model.save(),以及它们相应的负载声明(model.load_weights()load_model())。如果我把所有的求值代码放在训练代码的末尾,事情就会很顺利。

问题在于停止Python,启动一个新的Python脚本,并读取权重/模型以使用它们进行推理。加载时我尝试的主要方法:定义模型(使用相同的代码从训练运行,节省了权重),然后运行model.load_weights(),然后编译模型。这就是行不通的地方。然而,正如我所说,使用model.save()load_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/

相关内容

最新更新