本节对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 返回两个值,一个是位置,一个是值
#训练过程中,对图片增强,增加一些旋转,裁剪,在测试时,一般不做裁剪处理。多个图结构之间可以相互调用,具体参考残差网络的连接方式。
# 优化器可以在训练过程中修改,比如修改学习率等等,比较自由