import torchtorch.manual_seed(0)
print(torch.randn(1, 2))
print(torch.randn(1, 2))print("======================") # torch.manual_seed()控制torch中随机数的生成,并不控制numpy和random中
torch.manual_seed(0)
print(torch.randn(1, 2))
print(torch.randn(1, 2))


然后就有一个好玩的事情发生了

可以看到,我仅仅多设置了一个模型,导致这个随机种子不同了,这个原因到底在哪呢? 我之前的测试代码在这

import torch.nn as nn### 这里是最简单的simple autoencoder
def init_weights(m):""" initialize weights of fully connected layer"""if type(m) == nn.Linear:nn.init.xavier_uniform_(m.weight)m.bias.data.fill_(0.01)# Encoder
class Encoder(nn.Module):def __init__(self, num_inputs):super(Encoder, self).__init__()self.encoder = nn.Sequential(nn.Linear(num_inputs, 64),nn.ReLU(),nn.Linear(64,32))self.encoder.apply(init_weights)def forward(self, x):x = self.encoder(x)return x
# Decoder
class Decoder(nn.Module):def __init__(self, num_inputs):super(Decoder, self).__init__()self.decoder = nn.Sequential(nn.Linear(32, 64),nn.ReLU(),nn.Linear(64, num_inputs),nn.ReLU())self.decoder.apply(init_weights)def forward(self, x):x = self.decoder(x)return x
# Autoencoder
class autoencoder(nn.Module):def __init__(self, num_inputs):super(autoencoder, self).__init__()self.encoder = Encoder(num_inputs)self.decoder = Decoder(num_inputs)def forward(self, x):code = self.encoder(x)x = self.decoder(code)return code, x

不建立autoencoder,看dataloader的数据,第一次运行

from torch.utils.data import TensorDataset,DataLoader
import torch
from sklearn.datasets import load_iris
import random
import os
import numpy as np
def seed_torch(seed=42):random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.torch.backends.cudnn.badatahmark = Falsetorch.backends.cudnn.deterministic = Truetorch.backends.cudnn.enabled = Falseseed_torch(1)
X,y=load_iris(return_X_y=True)
myset=TensorDataset(torch.FloatTensor(X),torch.FloatTensor(y))
myloader=DataLoader(myset,batch_size=10,shuffle=True,num_workers=0)for idx, (X,y) in enumerate(myloader):print(X)print(y)break
print("=============================================================================================")
#model=autoencoder(1000)
for idx, (X,y) in enumerate(myloader):print(X)print(y)break

当再次执行这个代码,结果还是固定的

不建立autoencoder,看dataloader的数据,第二次运行

from torch.utils.data import TensorDataset,DataLoader
import torch
from sklearn.datasets import load_iris
import random
import os
import numpy as np
def seed_torch(seed=42):random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.torch.backends.cudnn.badatahmark = Falsetorch.backends.cudnn.deterministic = Truetorch.backends.cudnn.enabled = Falseseed_torch(1)
X,y=load_iris(return_X_y=True)
myset=TensorDataset(torch.FloatTensor(X),torch.FloatTensor(y))
myloader=DataLoader(myset,batch_size=10,shuffle=True,num_workers=0)for idx, (X,y) in enumerate(myloader):print(X)print(y)break
print("=============================================================================================")
#model=autoencoder(1000)
for idx, (X,y) in enumerate(myloader):print(X)print(y)break

目前这里还没有问题,一切都如所料

建立autoencoder,看dataloader的数据,第一次运行

from torch.utils.data import TensorDataset,DataLoader
import torch
from sklearn.datasets import load_iris
import random
import os
import numpy as np
def seed_torch(seed=42):random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.torch.backends.cudnn.badatahmark = Falsetorch.backends.cudnn.deterministic = Truetorch.backends.cudnn.enabled = Falseseed_torch(1)
X,y=load_iris(return_X_y=True)
myset=TensorDataset(torch.FloatTensor(X),torch.FloatTensor(y))
myloader=DataLoader(myset,batch_size=10,shuffle=True,num_workers=0)for idx, (X,y) in enumerate(myloader):print(X)print(y)break
print("=============================================================================================")
model=autoencoder(1000)
for idx, (X,y) in enumerate(myloader):print(X)print(y)break

这个时候,结果如下
可以看到,这个时候就不对劲了,我加入了一个autoencoder的模型,可以看到,之后生成的dataloader就开始变化了,不再是以前的顺序了

建立autoencoder,看dataloader的数据,第二次运行

from torch.utils.data import TensorDataset,DataLoader
import torch
from sklearn.datasets import load_iris
import random
import os
import numpy as np
def seed_torch(seed=42):random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.torch.backends.cudnn.badatahmark = Falsetorch.backends.cudnn.deterministic = Truetorch.backends.cudnn.enabled = Falseseed_torch(1)
X,y=load_iris(return_X_y=True)
myset=TensorDataset(torch.FloatTensor(X),torch.FloatTensor(y))
myloader=DataLoader(myset,batch_size=10,shuffle=True,num_workers=0)for idx, (X,y) in enumerate(myloader):print(X)print(y)break
print("=============================================================================================")
model=autoencoder(1000)
#torch.manual_seed("1")
for idx, (X,y) in enumerate(myloader):print(X)print(y)breakfor idx, (X,y) in enumerate(myloader):print(X)print(y)break

虽然这个结果与加入autoencoder后第一次运行的结果相同,但是这个结果还是与没有加入autoencoder前的生成数据不同了

问题所在

你可以理解 torch.manual_seed()只能用一次,你最开始设置的随机种子在没有加入模型前测试中,作用在了dataloader上,而加入模型后,你的随机种子首先作用于设置模型的权重,然后再是dataloader,这个顺序也就变了,所以要想获得建立模型后,还与之前一样的dataloader的抽样结果,就在dataloaer之前 重新设置torch.manual_seed()

from torch.utils.data import TensorDataset,DataLoader
import torch
from sklearn.datasets import load_iris
import random
import os
import numpy as np
def seed_torch(seed=42):random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.torch.backends.cudnn.badatahmark = Falsetorch.backends.cudnn.deterministic = Truetorch.backends.cudnn.enabled = Falseseed_torch(1)
X,y=load_iris(return_X_y=True)
myset=TensorDataset(torch.FloatTensor(X),torch.FloatTensor(y))
myloader=DataLoader(myset,batch_size=10,shuffle=True,num_workers=0)# for idx, (X,y) in enumerate(myloader):
#     print(X)
#     print(y)
#     break
print("=============================================================================================")
model=autoencoder(1000)
torch.manual_seed("1")
for idx, (X,y) in enumerate(myloader):print(X)print(y)breakfor idx, (X,y) in enumerate(myloader):print(X)print(y)break


可以看到这个结果与之前没有加入autoencoder的结果是一致的,是不是很神奇

torch.mannul_seed()使用和踩坑总结相关推荐

  1. 【踩坑】深度学习 Torch 爆显存的原因(显存不够用等问题)

    简介 在深度学习过程中,使用显卡的情况主要有两个过程:一.网络模型训练过程:二.网络模型测试过程.在这两个过程中,都可能存在爆显存或者爆内存的情况.在编程过程中,有很多同学应该都遇到这种情况,本文提供 ...

  2. 分布式深度学习最佳入门(踩坑)指南

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨Lyon@知乎(已授权) 来源丨https://zhuanla ...

  3. Cityscapse 数据集使用 + 训练 STDC踩坑

    官网地址:Cityscapes Dataset – Semantic Understanding of Urban Street Scenes (cityscapes-dataset.com) get ...

  4. anaconda+cuda+cudnn+pytorch安装踩坑大全

    windows环境下anaconda+pycharm+cuda+cudnn+pytorch安装踩坑大全 anaconda安装 pycharm安装 cuda cudnn pytorch gym环境安装 ...

  5. Detectron2 win10踩坑记录

    Detectron2 win10踩坑记录 安装CUDA clone到本地 修改cocoeval.cpp第483行(不同版本行数不一样) 创建虚拟环境 安装pycocotools 安装VS2019或者生 ...

  6. pytorch .item_从数据到模型,你可能需要1篇详实的pytorch踩坑指南

    原创 · 作者 | Giant 学校 | 浙江大学 研究方向 | 对话系统.text2sql 熟悉DL的朋友应该知道Tensorflow.Pytorch.Caffe这些成熟的框架,它们让广大AI爱好者 ...

  7. Windows 2016 server NVIDIA cuda toolkit11.3 pytorch-gpu 踩坑教程

    Windows 2016 server NVIDIA k20c cuda toolkit11.3 pytorch-gpu 踩坑教程 巨坑 兄弟们 各种bug,按照文档一步一步来. 1. 环境 操作系统 ...

  8. 复现CLOCs中spconv v1.0 (commit 8da6f96)踩坑记录

    最近看了一篇基于KITTI做2D和3D后融合的论文,CLOCs: Camera-LiDAR Object Candidates Fusion for 3D Object Detection.作者在Gi ...

  9. YOLOV7分割新手WIN10踩坑过程

    一.前言 踩了三天的坑,终于成功配置好YOLOV7的分割部分了,泪目.网上的教程太少了,一开始卡在detetron2的安装问题上,然后卡在数据集的制作上,最后靠查github的Issues然后去找数据 ...

最新文章

  1. SHUoj 字符串进制转换
  2. 哈希链表的原理及算法实现
  3. Spring注解方式配置切面类
  4. Vue项目实战01: vue里父传子 传事件(easy)
  5. ArchSummit深圳APM专场总结:性能监控与调优实践干货分享
  6. 代码实现sql编译器_TiDB-Wasm 原理与实现 | Hackathon 优秀项目介绍
  7. python 多文件知识
  8. AES算法重点详解和实现
  9. 简单的php探针,php探针程序的推荐
  10. ShadeGraph教程之节点详解8:UV Nodes
  11. python2.7环境变量的配置_Windows7下python2.7.6环境变量配置
  12. linux改狗命令,linux安装安全狗
  13. 【信息系统项目管理师】第7章-项目成本管理 知识点详细整理
  14. distributeed 1.21.8 requires msgpack,which is not installed 分布式1.21.8需要msgpack,未安装
  15. css 适配mac 字体,CSS:仅在mac上使用字体
  16. C51单片机串口通信之上位机交互
  17. 嗖嗖移动业务大厅项目_会员合作项目:10086移动外呼业务
  18. js实现简单的点名器随机色
  19. arcgis中mxd批量导图(tif,png,jpg,pdf)
  20. 抓取网络源码python_python中的复仇者网络抓取实体提取和网络图

热门文章

  1. 毕业设计 基于STM32单片机的二轮平衡小车
  2. 宇视网络视频录像机添加摄像机常规方法
  3. vue项目某个APP页面实现手机物理按键返回、路由拦截、localStorage存取参数
  4. Thread.Sleep线程休眠
  5. lcy老师的训练反思
  6. VC驿站《实用C++》教程开篇
  7. 学计算机用多大的u盘合适,装w764位系统需要多大u盘呢?
  8. 大一C语言图形界面点餐系统
  9. 学编程看书好还是看视频好?
  10. JavaWeb商城项目笔记--- Day1 (热门商品,热销商品)