pytorch的基础学习(每日一更)day01

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"))


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值