gpt4 book ai didi

python - 训练模型和负载模型的精度不同

转载 作者:行者123 更新时间:2023-12-05 05:57:43 31 4
gpt4 key购买 nike

我已经尝试了 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/

关于python - 训练模型和负载模型的精度不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68738674/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com