【问题标题】:Model Load get different result after restart runtime重新启动运行时后模型加载得到不同的结果
【发布时间】:2021-09-08 00:04:15
【问题描述】:

你好,我是神经网络中的新手,我在训练我的模型后使用 google colab 编写了一个模型 CNN 架构 Resnet50,然后保存模型,然后加载模型而不重新启动运行时间得到相同的结果,但是为什么当重新启动运行时 google colab 并运行 xtrain,ytest ,x_val,y_val 然后再次加载模型得到不同的结果

这里是我设置参数的代码

#hyperparameter and callback
batch_size = 128
num_epochs = 120
input_shape = (48, 48, 1)
num_classes = 7

#Compile the model.
from keras.optimizers import Adam, SGD
model = ResNet50(input_shape = (48, 48, 1), classes = 7)
optimizer = SGD(learning_rate=0.0005)
model.compile(optimizer= optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])

model.summary()
history = model.fit(
    data_generator.flow(xtrain, ytrain,),
    steps_per_epoch=len(xtrain) / batch_size,
    epochs=num_epochs, 
    verbose=1,
    validation_data= (x_val,y_val))

import matplotlib.pyplot as plt 
model.save('Fix_Model_resnet50editSGD5st.h5')

#plot graph
accuracy = history.history['accuracy']
val_accuracy = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
num_epochs = range(len(accuracy))
plt.plot(num_epochs, accuracy, 'r', label='Training acc')
plt.plot(num_epochs, val_accuracy, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.ylabel('accuracy')  
plt.xlabel('epoch')
plt.legend()
plt.figure()
plt.plot(num_epochs, loss, 'r', label='Training loss')
plt.plot(num_epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.ylabel('loss')  
plt.xlabel('epoch')
plt.legend()
plt.show()

#load model
from keras.models import load_model
model_load = load_model('Fix_Model_resnet50editSGD5st.h5')

model_load.summary()


testdatamodel = model_load.evaluate(xtest, ytest) 
print("Test Loss " + str(testdatamodel[0]))
print("Test Acc: " + str(testdatamodel[1]))

traindata = model_load.evaluate(xtrain, ytrain) 
print("Test Loss " + str(traindata[0]))
print("Test Acc: " + str(traindata[1]))

valdata = model_load.evaluate(x_val, y_val) 
print("Test Loss " + str(valdata[0]))
print("Test Acc: " + str(valdata[1]))

-在训练和保存模型之后运行加载模型而不重新启动运行时 google colab: 如您所见 测试得到损失:0.9411 - 准确度:0.6514

训练损失:0.7796 - 准确度:0.7091

ModelEvaluateTest & Train

重启runtime colab后再次运行加载模型:

测试获得损失:0.7928 - 准确度:0.6999

训练损失:0.8189 - 准确度:0.6965

after Restart Runtime Evaluate test and train

【问题讨论】:

    标签: python tensorflow machine-learning neural-network


    【解决方案1】:

    您需要设置随机种子,以便在同一会话中或重新启动后的每次迭代中获得相同的结果。

    tf.random.set_seed(
        seed
    )
    

    查看https://www.tensorflow.org/api_docs/python/tf/random/set_seed

    【讨论】:

    • 你能在我的代码中给我示例应用程序 tf.random.set_seed(seed) 吗?
    • import tensorflow as tf tf.random.set_seed(31)
    【解决方案2】:

    这取决于计算和训练过程中生成的随机数。

    例如,模型从数据中学习,您可以在输入模型之前对数据进行打乱。因此,它会随机打乱数据,每次重新启动会话时,模型的输入数据在每个批次和迭代中都会有所不同。

    随机性影响结果的另一个地方是模型的初始化权重。模型第一次初始化权重和偏差。因此,每次重新开始时,都会得到不同的数字作为开始,学习之旅可能会有不同的方式。

    所以,主要原因之一是随机性。您可以设置随机种子以便能够控制生成的数据。例如对于 tensorflow,您可以通过 tf.random.set_seed(0) 设置它。你给函数的数字是任意数字。或者,如果您使用 numpy 库,并且您的代码可能会基于 numpy 库生成一些数据。那么如果你想控制随机性,你可以通过numpy.random.seed(0) 设置它的种子。

    您可以将它设置在您的代码之上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-26
      • 2021-07-31
      • 2016-07-31
      • 2022-06-23
      • 1970-01-01
      • 2018-12-24
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多