深度学习代码一样,但是每次跑的结果都不同(甚至相差很大)

一、前言:

由于在跑代码时,发现自己每次跑的结果相差很大,于是询问其他同学的代码,他们的代码每次跑也不一样,但是结果相差是一个合理范围,而我的结果,就明显不合理。

我把自己的代码看了一遍,也没找到原因,然后去网上找找别人会不会有这样的情况,结果还是有人给我一样的情况,万千世界,无奇不有。

以下解决办法,不确保对你的有用,但是可以尝试。

二、解决办法

1.设置随机种子

因为代码在运行时,会产生随机数,如果不设置随机种子,很有可能每次出现随机数不同,进而可能导致结果出现差异。

请看下面这个实验:

import numpy as np
import torch

print("Numpy随机数:不设置随机种子")
for i in range(5):
    print(np.random.rand(1))

print('-' * 50)

print("Numpy随机数:设置随机种子")
for j in range(5):
    np.random.seed(42)  
    print(np.random.rand(1))

print('-' * 50)

print("PyTorch随机数:不设置随机种子")
for i in range(5):
    print(torch.rand(1))

print('-' * 50)

print("PyTorch随机数:设置随机种子")
for j in range(5):
    torch.manual_seed(42)
    print(torch.rand(1))

下面是结果:

Numpy随机数:不设置随机种子
[0.6510666]
[0.24762528]
[0.25380042]
[0.2385413]
[0.40977083]
--------------------------------------------------
Numpy随机数:设置随机种子
[0.37454012]
[0.37454012]
[0.37454012]
[0.37454012]
[0.37454012]
--------------------------------------------------
PyTorch随机数:不设置随机种子
tensor([0.1280])
tensor([0.1837])
tensor([0.0940])
tensor([0.5511])
tensor([0.5864])
--------------------------------------------------
PyTorch随机数:设置随机种子
tensor([0.8823])
tensor([0.8823])
tensor([0.8823])
tensor([0.8823])
tensor([0.8823])

注意:随机种子理论上是随便设置,有人设置"0","1234", "2024","42"等。但是不同的随机种子可能会导致结果的好坏,这里面有一点玄学成分。

上面实验中,我设置的随机种子是**"42",下面实验,我设置为"0"**,看看生成的随机数有什么不同。

Numpy随机数:不设置随机种子
[0.69071155]
[0.99423298]
[0.23947714]
[0.25467987]
[0.23614593]
--------------------------------------------------
Numpy随机数:设置随机种子
[0.5488135]
[0.5488135]
[0.5488135]
[0.5488135]
[0.5488135]
--------------------------------------------------
PyTorch随机数:不设置随机种子
tensor([0.6033])
tensor([0.5968])
tensor([0.8032])
tensor([0.9530])
tensor([0.7456])
--------------------------------------------------
PyTorch随机数:设置随机种子
tensor([0.4963])
tensor([0.4963])
tensor([0.4963])
tensor([0.4963])
tensor([0.4963])

可以看出,随机种子不同,生成的随机数也不同,造成结果好坏的原因可能是:随机种子“0”生成的随机数”0.4963“比随机种子“42”生成的随机数“0.8823”更适合你的程序。

因此,在你程序最开始的地方,调用一下这个函数

def set_random_seed(seed, deterministic=False):
    random.seed(seed)  
    np.random.seed(seed)
    torch.manual_seed(seed)  # 为一个GPU设置随机种子
    torch.cuda.manual_seed_all(seed)  # 为多个GPU设置同一随机种子
    if deterministic:  # 以下操作涉及cudnn,一般为False,也可以设置为True,尝试一下。
        torch.backends.cudnn.deterministic = True
        torch.backends.cudnn.benchmark = False

2.多运行几次取平均值

这个解决办法,就是无奈之举了。

比如:跑5次或者10次取个平均值。

还可以取最高的一次,这个还是要询问一下,导师或者领导的意见吧!

参考文献

1.https://blog.csdn.net/yyywxk/article/details/121606566?

2.https://blog.csdn.net/qq_28531269/article/details/121109486?

3.https://blog.csdn.net/baidu_39389949/article/details/121412455

### MATLAB深度学习模型训练结果稳定的原因分析 在使用MATLAB进行深度学习时,如果遇到每次训练的结果一致的情况,这可能是由多个因素引起的。随机初始化权重、批处理顺序的不同以及超参数设置当都可能导致这种现象[^1]。 #### 随机种子设定 为了确保实验可重复性稳定性,在开始任何深度学习项目之前应该固定随机种子。这样可以在不同的运行之间保持相同的初始条件,从而使得结果更加稳定。可以通过以下方式来实现: ```matlab rng(0); % 设置全局随机数生成器的状态为指定整数值 ``` #### 数据预处理标准化 数据集本身的质量也会影响最终模型的表现。对于输入特征而言,对其进行适当缩放是非常重要的一步。标准做法是对所有样本执行零均值单位方差变换或其他形式的归一化操作。这样做有助于加速收敛过程,并减少由于尺度差异带来的负面影响。 ```matlab % 假设Xtrain是训练数据矩阵 mu = mean(Xtrain, 1); sigma = std(Xtrain, 0, 1); % 对训练集做标准化 Xtrain_standardized = (Xtrain - mu) ./ sigma; % 测试集也需要按照相同的方式转换 Xtest_standardized = (Xtest - mu) ./ sigma; ``` #### 批量大小调整 批量大小的选择同样会对训练效果产生影响。较小批次可能带来更高的波动性;而较大批次虽然能提供更稳定的梯度估计,但也增加了内存占用需求。因此找到合适的平衡点至关重要。 #### 正则化技术应用 正如所提到的那样,正则化是防止过拟合的有效手段之一。L2正则化(即权重衰减)、Dropout等都是常用的方法。它们通过引入额外约束或扰动机制抑制复杂模式的记忆效应,进而增强泛化性能[^3]。 ```matlab layers = [ ... fullyConnectedLayer(numHiddenUnits,'WeightLearnRateFactor',weightLF,... 'BiasLearnRateFactor',biasLF,'WeightLSF',l2factor) ]; options.TrainValidationPatience = patienceValue; % 提前停止策略 options.L2Regularization = l2regStrength; % L2正则强度 ``` #### 使用早停法(Early Stopping) 当观察到验证集上的错误率再下降甚至上升时,应当及时终止训练以防过度拟合。这种方法被称为“提前停止”。它可以帮助我们自动确定最佳迭代次数,避免必要的计算开销。 ```matlab validationData = {Xval,Yval}; trainingOptions = trainingOptions(solverName, ... 'MaxEpochs',maxEpochs,... 'MiniBatchSize',miniBatchSize,... 'Plots','training-progress',... 'Verbose',false,... 'Shuffle','every-epoch',... 'ValidationFrequency',validationFreq,... 'ValidationData',validationData,... 'EarlyStoppingPatience',patience); net = trainNetwork(trainImages,trainLabels,layers,options); ``` #### 参数初始化改进 除了简单的高斯分布外,还有其他几种有效的权值初始化方案可供选择,比如He Normal/Xavier Uniform等。合理选取可以加快收敛速度并改善整体表现。 ```matlab layer.GraphInputLayer(inputSize,'Name','input'); ... fullyConnectedLayer(outputSize,'WeightsInitializer','he') ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WinterWanderer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值