pytorch 学习知识笔记
相关代码github链接:
https://github.com/yunjey/pytorch-tutorial
实操(七个例子)
梯度优化(example 1)
##############################################
#1.basic autograd example 1
##############################################
x=torch.tensor(1.,requires_grad=True)
w=torch.tensor(2.,requires_grad=True)
b=torch.tensor(3.,requires_grad=True)
print(x)
#创建一个计算图
y=w*x+b
#backward
y.backward()
#输出梯度gradient
print(x.grad) #tensor(2.)
print(w.grad) #tensor(1.)
print(b.grad) #tensor(1.)
梯度优化(example 2)(假设只有一个FC层):
①Linear对象 -》参数是维度
②损失函数对象(criterion)
③优化器对象(第一个参数就是NN中的layer的参数)
④正向传播forward —》得到预测值
⑤计算损失(记得第一个参数是预测值,第二个参数是真实值)
⑥反向传播 backward(只要requires_grad=True就可以调用这个)
⑦可以输出一次梯度观察
layers的对象.weight.grad
layers的对象.bias.grad
⑧进行梯度优化
优化器对象.step()
⑨执行④与⑤计算损失(通过1次迭代后的损失)
################################################
#2.basic autograd example 2
################################################
# 创建张量Tensor形状分别是(10,3)(10,2)
x=torch.randn(10,3)
y=torch.randn(10,2)
#创建全连接层FC
linear=nn.Linear(3,2) #这里的(3,2)是为了使其余x计算后得到与y尺寸一样的张量
print("w",linear.weight)
print("b",linear.bias)
# w Parameter containing:
# tensor([[-0.3387, -0.5115, 0.0482],
# [ 0.1824, 0.2397, -0.3205]], requires_grad=True)
# b Parameter containing:
# tensor([-0.0500, 0.0984], requires_grad=True)
#设置损失函数costFunction 和 optimizer 优化器
criterion=nn.MSELoss()
optimers=torch.optim.SGD(linear.parameters(),lr=0.01)
#forward
pred=linear(x)
#计算损失
loss=criterion(pred,y)
print('loss after 0 step optimization : ',loss.item())
#loss after 0 step optimization : 1.9934968948364258
#backward
loss.backward()
#输出梯度
print('dL/dw: ',linear.weight.grad)
print('dL/db: ',linear.bias.grad)
#第一次梯度优化
optimers.step()
#打印一次梯度迭代后的损失
pred=linear(x)
loss=criterion(pred,y) #使用item获取tensor值
print("loss after 1 step optimization : ",loss.item())
#loss after 1 step optimization : 1.1416056156158447
#(与之前的0次比较,下降了一些)
numpy 与 tensor之间的数据类型转换
1.用到的torch的方法有:
①from_numpy(numpy的对象)—>tensor对象
②tensor对象.numpy()----》得到numpy的对象
################################################
#3.loading data from numpy
################################################
#使用numpy创建数据(3,2)
x=np.array([[1,3],[3,4]])
print(x)
# [[1 3]
# [3 4]]
#利用torch将numpy的对象转为tensor对象
y=torch.from_numpy(x)
print(y)
# tensor([[1, 3],
# [3, 4]], dtype=torch.int32)
#再将tensor对象转换为numpy的对象
z=y.numpy()
print(z)
# [[1 3]
# [3 4]]
数据的下载和创建
################################################
#4.input pipline
################################################
#下载和创建训练集
train_data=torchvision.datasets.CIFAR10(root="data",
train=True,
transform=transforms.ToTensor(),
download=True)
#从硬盘中读数据
image,label=train_data[0]
print(image.size()) #torch.Size([3, 32, 32])
print(label) #6
#设置加载器加载数据
train_loader=torch.utils.data.DataLoader(dataset=train_data,
batch_size=64,
shuffle=True)
# #
# #当迭代开始时,队列和线程开始从文件中加载数据
# data_iter=iter(train_loader)
# #利用next从可迭代对象iter()中取出一组数据(batch_size个)
# image,label=data_iter.next()
# #上两句代码只是例子
#实际使用如下
for images,labels in train_loader:
# print(labels)
pass
补充:
transform.ToTensor()
CIFAR-10数据集
DataLoader
1.transform.ToTensor()函数说明
"""Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor.
See ``ToTensor`` for more details.
Args:
pic (PIL Image or numpy.ndarray): Image to be converted to tensor.
Returns:
Tensor: Converted image.
"""
原文链接:https://blog.csdn.net/wuqingshan2010/article/details/110133046
2.关于CIFAR-10数据集的说明
CIFAR-10数据集由10个类的60000个32*32彩色图像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像。
数据集分为五个训练批次和一个测试批次,每个批次有10000个图像。测试批次包含来自每个类别的恰好1000个随机选择的图像。训练批次以随机顺序包含剩余图像,但一些训练批次可能包含来自一个类别的图像比另一个更多。总体来说,五个训练集之和包含来自每个类的正好5000张图像。
3.关于DataLoader的说明
torch.utils.data.DataLoader(dataset,batch_size,shuffle)
自定义数据的input piplines
################################################
#4.input pipline
################################################
#下载和创建训练集
train_data=torchvision.datasets.CIFAR10(root="data",
train=True,
transform=transforms.ToTensor(),
download=True)
#从硬盘中读数据
image,label=train_data[0]
print(image.size()) #torch.Size([3, 32, 32])
print(label) #6
#设置加载器加载数据
train_loader=torch.utils.data.DataLoader(dataset=train_data,
batch_size=64,
shuffle=True)
# #
# #当迭代开始时,队列和线程开始从文件中加载数据
# data_iter=iter(train_loader)
# #利用next从可迭代对象iter()中取出一组数据(batch_size个)
# image,label=data_iter.next()
# #上两句代码只是例子
#实际使用如下
for images,labels in train_loader:
# print(labels)
pass
预训练模型
################################################
#6.pretrained model(预训练模型)
################################################
#我们下载ResNet-18的预训练模型
resnet=torchvision.models.resnet18(pretrained=True)
#1.如果我们只是(finetune the top layer of the model)微调模型的顶层,例如:如下设置:
for param in resnet.parameters():
param.requires_grad=False
#2.添加一个FC层
resnet.fc=nn.Linear(resnet.fc.in_features,100) #100只是随便的例子,只要看最后我们需要多少节点数
#3.我们随机设置一个Tensor作为一组大小为batch_size的图片
images=torch.randn(64,3,224,224)
#调用模型传播输入X--》得到prev(outputs)
outputs=resnet(images)
print(outputs.size()) #torch.Size([64, 100]) 100与我们设置的FC层的节点数相同
在RESNET的预训练模型加上一层:
resnet.fc.in_features
resnet.fc=nn.Linear(resnet.fc.in_features,100) #100只是随便的例子,只要看最后我们需要多少节点数
保存和加载模型(在1.6基础上)
################################################
#7.save and load model
################################################
#在6的基础上
#1.保存和加载整个模型
#保存
torch.save(resnet,"model.ckpt")
#加载
torch.load("model.ckpt")
#2.只保存和加载模型参数(推荐)
torch.save(resnet.state_dict(),"params.ckpt")
resnet.load_state_dict(torch.load("params.ckpt"))