神经网络学习小记录75——Keras设置随机种子Seed来保证训练结果唯一

神经网络学习小记录75——Keras设置随机种子Seed来保证训练结果唯一

学习前言

好多同学每次训练结果不同,最大的指标可能会差到3-4%这样,这是因为随机种子没有设定导致的,我们一起看看怎么设定吧。
在这里插入图片描述

为什么每次训练结果不同

模型训练中存在很多随机值,最常见的有:
1、随机权重,网络有些部分的权重没有预训练,它的值则是随机初始化的,每次随机初始化不同会导致结果不同。
2、随机数据增强,一般来讲网络训练会进行数据增强,特别是少量数据的情况下,数据增强一般会随机变化光照、对比度、扭曲等,也会导致结果不同。
3、随机数据读取,喂入训练数据的顺序也会影响结果。
……
应该还有别的随机值,这里不一一列出,这些随机都很容易影响网络的训练结果。

如果能够固定权重、固定数据增强情况、固定数据读取顺序,网络理论上每一次独立训练的结果都是一样的。

什么是随机种子

随机种子(Random Seed)是计算机专业术语。一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。

按照这个理解,我们如果可以设置最初的 真随机数(种子),那么后面出现的随机数将会是固定序列。

以random库为例,我们使用如下的代码,前两次为随机生成,后两次为设置随机数生成器种子后生成。

import random

# 生成随机整数
print("第一次随机生成")
print(random.randint(1,100))
print(random.randint(1,100))

# 生成随机整数
print("第二次随机生成")
print(random.randint(1,100))
print(random.randint(1,100))

# 设置随机数生成器种子
random.seed(11)

# 生成随机整数
print("第一次设定种子后随机生成")
print(random.randint(1,100))
print(random.randint(1,100))

# 重置随机数生成器种子
random.seed(11)

# 生成随机整数
print("第二次设定种子后随机生成")
print(random.randint(1,100))
print(random.randint(1,100))

结果如下,前两次随机生成的序列不同,后两次设定种子后随机生成的序列相同:

第一次随机生成
66
37
第二次随机生成
93
56
第一次设定种子后随机生成
58
72
第二次设定种子后随机生成
58
72

训练中设置随机种子

一般训练会用到多个库包含有关random的内容。

在keras构建的网络中,一般都是使用下面三个库来获得随机数,我们需要对三个库都设置随机种子:
1、tensorflow库;
2、numpy库;
3、random库。
这是因为keras一般基于tensorflow1,我们对tensorflow进行random随机数设置就相当于对keras进行随机数设置。

在这里写了一个函数,:

#---------------------------------------------------#
#   设置种子
#---------------------------------------------------#
def seed_everything(seed=11):
    random.seed(seed)
    np.random.seed(seed)
    tf.set_random_seed(seed)

只需要在所有初始化前,调用该seed初始化函数即可。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
下面是一个使用Keras实现BP神经网络模型学习的示例代码,包括训练模型、显示训练结果和保存模型: ```python from keras.models import Sequential from keras.layers import Dense from keras.optimizers import SGD import numpy as np # 构建一个简单的BP神经网络模型 model = Sequential() model.add(Dense(units=10, input_dim=2, activation='relu')) model.add(Dense(units=1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1), metrics=['accuracy']) print(model.summary()) # 生成训练数据 X = np.random.rand(1000, 2) y = np.array([int(x1+x2>1) for x1,x2 in X]) # 训练模型 history = model.fit(X, y, epochs=50, batch_size=32, validation_split=0.2) # 显示训练结果 import matplotlib.pyplot as plt plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy']) plt.title('Model Accuracy') plt.ylabel('Accuracy') plt.xlabel('Epoch') plt.legend(['train', 'test'], loc='upper left') plt.show() # 保存模型 model.save('my_model.h5') ``` 在这个示例中,我们首先使用Keras的Sequential模型构建了一个简单的BP神经网络模型,包含一个10个神经元的隐层和一个输出为1个神经元的输出层。然后,我们编译模型并打印模型的摘要信息。 接下来,我们生成了1000个随机的2维数据作为训练数据,并使用生成的数据训练了模型。在训练过程中,我们设置了50个epochs,每批次32个样本,验证集占训练集的20%。 在训练完成后,我们使用matplotlib库绘制了训练结果图表,并保存了模型。最后,我们可以使用 `model.load_weights('my_model.h5')` 加载保存的模型权重,并使用该模型进行预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bubbliiiing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值