Keras之模型初始化问题np.random.seed & tf.random.set_seed

np.random.seed(42)
tf.random.set_seed(42)

这两行代码真是让我着迷了一个晚上。
最近在上手机器学习的东西,然后就需要书写一写tensorflow的代码。
毕竟第一次用tensorflow,也不太明白,也是一直在看文档,但是是照着样例来做的。
然后就照常搭建网络(根据Keras的文档)

import pandas as pd
from sklearn.datasets import fetch_california_housing
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# To plot pretty figures
%matplotlib inline
import matplotlib.pyplot as plt
np.random.seed(42)
tf.random.set_seed(42)
#mnist = keras.datasets.mnist
mnist = keras.datasets.fashion_mnist
#文件存放路径,文件默认位置为:~/.keras/datasets
(X_train_full, y_train_full), (X_test, y_test) = mnist.load_data()

#归一化
X_valid, X_train = X_train_full[:5000] / 255., X_train_full[5000:] / 255.
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]
X_test = X_test / 255.

#定义神经网络
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))

#编译模型
model.compile(loss=keras.losses.sparse_categorical_crossentropy,
                  optimizer=keras.optimizers.SGD(learning_rate = 0.001),
                  metrics=[keras.metrics.SparseCategoricalAccuracy()])
#训练模型 
history = model.fit(X_train, y_train, epochs=5,
                validation_data=(X_valid, y_valid))

在这里插入图片描述
结果还算正常(这里为了能够快速获得结果,我就训练5次),至此我没有意识到问题的严重性,因为我忽略了文章开头的写的两行代码,我本以为就是产生随机数的,不过也确实,也就是 产 生 随 机 数 的。

但是当我偶然多执行了几次model.fit,却发现结果不是我想的那样——就是每次的loss应该都是1.4968,。

下面这是第二次fit的结果:
在这里插入图片描述
下面这是第三次fit的结果:
在这里插入图片描述
这就导致了什么结果呢???
直到我将这个模型用测试集验证了一下,结果。。。。。。
损失loss直接破1了。。。。(其实在最后fit的过程中loss已经0.1了,过拟合了已经,结果在testset上loss直接到了80)

为什么呢,为什么在fit的过程中loss一直变小呢?我对此不断地调试,结果连续肝了一个晚上,终于,我还是吃了没有仔细读文档和英语不行的亏

我就在网上找啊,找到了下面这个问题

在这里插入图片描述
然后我又到了Keras的官网文档,里面提到了这个问题:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这不正是我的问题吗,这个随机数真的有用的啊!!!!!!!!

然后我又一次次地去尝试,到底是哪个地方需要参数,终于发现原来是建立模型的时候出现的问题

fit方法中有两个参数引起了我的注意:
在这里插入图片描述
还是没有提到什么随机数的问题,直到我发现了这个
在这里插入图片描述
或许这个genetator就是问题的关键了。
这也就是为什么要确定随机化的原因了吧。

总结:

要想是每一次都要获得一样结果,就需要每次建立模型,编译,在训练,必须是这个步骤,要不然不是从新开始学习的,是接着上次的学习结果来继续训练的。
也就是说下面的代码要全部执行才能保证是从新开始训练的:

#定义神经网络
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))

#编译模型
model.compile(loss=keras.losses.sparse_categorical_crossentropy,
                  optimizer=keras.optimizers.SGD(learning_rate = 0.001),
                  metrics=[keras.metrics.SparseCategoricalAccuracy()])
#训练模型 
np.random.seed(42)
tf.random.set_seed(42)
history = model.fit(X_train, y_train, epochs=5,
                validation_data=(X_valid, y_valid))

(ps:但是至于是否真的是因为这个地方,我觉得还有待考证,希望大家有问题可以留言指出,一起学习呀)

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用TensorFlow中的tf.random.set_seed函数时,可能遇到无法复现的情况。这是因为TensorFlow中的随机数生成器依赖于与计算图相关的操作。即使设置了随机数种子,但如果计算图的结构或操作的顺序发生了变化,随机数的生成可能会产生不同的结果。 可能导致无法复现的另一个原因是,TensorFlow的后端可能使用高效的随机数生成库,如cuDNN,这些库可能会在运行时对随机数生成器进行优化,从而导致难以复现的结果。 为了尽可能地实现结果的复现,可以采取以下措施: 1. 在设置随机数种子之前,尽量确保计算图的结构和操作的顺序是固定的。这可以通过设置tf.keras.backend.set_learning_phase(0)来冻结随机性相关的操作,以确保它们不会影响结果的复现。 2. 尽可能指定明确的设备信息,如:设置CUDA_VISIBLE_DEVICES环境变量,使得TensorFlow在同一个GPU上运行。 3. 使用GPU加速时,可以尝试禁用某些优化选项,如TensorFlow配置中的intra_op_parallelism_threads和inter_op_parallelism_threads参数。 4. 尝试设置其他可能影响随机数生成器的环境变量,如:PYTHONHASHSEED、OMP_NUM_THREADS等。 总之,虽然tf.random.set_seed函数用于设置随机数种子以实现结果的复现,但要在TensorFlow中完全复现结果可能会受到多个因素的影响。因此,最终的复现结果并不能保证与设置种子时的结果完全一致。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值