pytorch学习总结

本节对pytorch的参考资料以及相关内容进行总结

参考资料1 pytorch tutorial
参考资料2 莫烦tutorial
参考资料3 pytorch官方文档
参考资料4 pytorch中文文档

安装

参考传送门,我装的是cuda7.5的版本(注意:不支持window下的安装)

注意要点

  • 如果你要保存map,请务必保存成numpy格式的数据,因为torch格式的数据非常占用内存资源,这是一个很神奇的现象。不然会内存炸裂的。
    这里写图片描述

  • pytorch解除占用时,请用

fuser -v /dev/nvidia* 查看所有进程 
  • pytorch保存模型时,请先转到cpu下,否则会out of memory
model.cpu()
torch.save(model.state_dict(), modelPath)
model.cuda(args.cuda)
  • pytorch加载模型到cpu上,请使用
model.load_state_dict(torch.load(model_file, map_location=lambda storage, loc: storage))
  • pytorch对模型验证,请使用
model.eval()

基本语法

#删除网络最后一列
resnet = models.resnet152(pretrained=True)
modules = list(resnet.children())[:-1]      # delete the last fc layer.
self.resnet = nn.Sequential(*modules) # 从list转model

#定义类时,class modelT_1(object)和modelT_1(nn.Module)是不一样的。一个可以直接用net(input)调用forward里面的函数,另一个必须用net.forward(input)才能调用forward里面的函数。否则会报错:not callable

#torch和np.array()之间的转换
torch_data = torch.from_numpy(np_data) # np.array -> tensor
tensor2array = torch_data.numpy() # tensor -> array
variable.data() # variable -> tensor
variable.data[0] # variable -> number
tensor = torch.FloatTensor(data) # 转成float类型

#基本操作
torch.mm(tensor, tensor) # 矩阵内积
tensor.dot(tensor) # 必须是一维输入才可以处理

#变量定义
from torch.autograd import Variable
tensor = torch.FloatTensor([[1,2],[3,4]])
variable = Variable(tensor, requires_grad=True) # 参与误差反向传播

#要搭建一个计算图 computational graph 进行整体的误差反向传播,需要利用variable进行搭建。计算误差反向传播时,计算的梯度是边上的梯度,不是结点的梯度,结点的误差需要需要利用链式法则继续传递到之前的结点。
v_out = torch.mean(variable*variable)# 逐个元素平方
v_out.backward()  # 计算关于variabled的梯度

# 获取batch是根据的输入数据,一般这种加载数据的方式只用在用train得到batch的数据上才可以。一般输入tensor形式的lable和data,读入也是tensor形式的,只有在训练时候才转化成variable,有一点需要注意,torch中的cnn,通道在前面,
torch_dataset = Data.TensorDataset(data_tensor=x, target_tensor=y)
loader = Data.DataLoader(
    dataset=torch_dataset,      # torch TensorDataset format
    batch_size=BATCH_SIZE,      # mini batch size
    shuffle=True,               # random shuffle for training
    num_workers=2,              # subprocesses for loading data
)
for epoch in range(3):   # train entire dataset 3 times
    for step, (batch_x, batch_y) in enumerate(loader):  # for each training step

# zip函数,用于得到类似tuple(a,b,c)

# volatile=True是让test数据不参与梯度的计算,加速测试;test的输入是一个tensor,train的输入由于要梯度反传,所以应该是一个variable.
test_x = Variable(torch.unsqueeze(test_data.test_data, dim=1), volatile=True).type(torch.FloatTensor)[:2000]/255.

# 返回[batch,1,a,b]大小的tensor
enumerate(train_loader) #这里才会执行enumrate时候的normalize
for images, labels in test_loader # 就可以读取一个元组
x.view(-1, 28, 28),就是resize函数


# 测试方法
print xx.size()
break 进入torch网络内部
type(param.data) # 显示模型类型

# 损失,需要a,b维度相同
nn.MSELoss(a,b)

# 连续预测,将上一步的hidden状态输入到下一步中。pytorch的图是动态的,rnn的输入时刻可以是动态的。
h_state = Variable(h_state.data)

#看懂了我的第一个代码,gan和cgan,大致对其有了了解,gan就是一个多目标优化问题,这种类型的代码都可以参照它完成。

#使用gpu,就是加入.cude(),包括三部分,tensor,model以及运算。

#dropout层的加入很简单,
torch.nn.Dropout(0.5) # drop 50% of the neuron
测试的时候需要转成net_overfitting.eval(),得到输出test_pred_ofit = net_overfitting(test_x)。训练的时候要转成net_dropped.train(),两种模式切换。

#Batch normalization也需要设定net.eval()和net.train()两种方式。BatchNorm2d(),对于卷积,设置为channel个数。每个batch计算均值和方差。常见结构:卷积+bn+relu+pool
!!注意eval()只在bn和dropout上有用!!

# 使用预训练的模型结构
resnet = torchvision.models.resnet18(pretrained=True)# 挺好用的,下载时还会显示下载进度。

# 冻结模型一些层
for param in resnet.parameters(): param.requires_grad = False

# 替换开头几层,例如将fc层替换为新的fc。直接定义的层,in_features和out_features给出单元数目
resnet.fc = nn.Linear(resnet.fc.in_features, 100)

模型训练和预测都用了variable类型

# 保存建议保存参数
# Save and load the entire model.
torch.save(resnet, 'model.pkl')
model = torch.load('model.pkl')
# Save and load only the model parameters(recommended).
torch.save(resnet.state_dict(), 'params.pkl')
resnet.load_state_dict(torch.load('params.pkl'))

读入数据的格式是[batch,channel,height,width],可以用view进行reshape,

torch.max 返回两个值,一个是位置,一个是值

#训练过程中,对图片增强,增加一些旋转,裁剪,在测试时,一般不做裁剪处理。多个图结构之间可以相互调用,具体参考残差网络的连接方式。

# 优化器可以在训练过程中修改,比如修改学习率等等,比较自由



  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值