pytorch入门

相比起keras和tensorflow,个人感觉pytorch更好一些
相比起程序语言本身,个人感觉,记住解决问题的步骤和方法更重要
import torch
t=torch.tensor(1)
t.size()
t1=torch.rand((3,4))
torch.Tensor?
torch.empty((3,3))
device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')#实例化device
torch.zeros((2,3),device=device)
a=torch.zeros((2,3))
a.to(device)
# device=torch.device('cpu')#cpu设备,放tensor到cpu上跑
a.to(device)#下面不带device='cuda:0'
x=torch.ones((2,2),requires_grad=True)
print(x)#需要梯度
y=x+2#grad_fn里面保存了当前操作,add
print(y)
z=y*y*3#grad_fn里面保存了当前操作,复合运算
print(z)
out=z.mean()#grad_fn求均值的操作,Mean
print(out)
a=torch.rand(2,2)# requires_grad默认是False
a=(a*3)/(a-1)
print(a.requires_grad,type(a))
a.requires_grad=True
print(a.requires_grad)
b=(a*a).sum()
with torch.no_grad():# 指定不保留计算梯度的操作
    c=(a*a).sum()
    print(c,c.requires_grad)
out.backward()# 此时能计算出out对x的导数
print(a,a.data)#a的requires_grad=True时,只显示a的数据a.data
a.numpy()# 当requires_grad=True时,用tensortensor.detach().numpy(),相当于深拷贝
import numpy as np
np.set_printoptions(suppress=True)
x=np.random.rand(500,1)
#准备数据,输入和输出
x=torch.rand(500,1)
y=3*x+0.8 #y_true
#初始化w,b
w=torch.rand((1,1),requires_grad=True)#w必须初始化为一个2维的tensor
b=torch.rand(1,requires_grad=True)
w_i=torch.rand(1,requires_grad=True)# 一维的tensor
w_i.dim()# 
learning_rate=1e-2
np.set_printoptions(suppress=True)
#迭代,反向传播,更新参数
for i in range(2000):
    #计算预测值和损失
    y_pre=torch.matmul(x,w)+b
    loss=(y-y_pre).pow(2).mean()
    if w.grad is not None:# .data属于浅拷贝,改变的话,原数据也改变
        w.grad.data.zero_()#如果w.grad不为None,就归0,不然会累加
    if b.grad is not None:
        b.grad.data.zero_()
    loss.backward()# 反向传播
    w.data-=learning_rate*w.grad#更新梯度
    b.data-=learning_rate*b.grad
    if i%50==0:
        print('w,b,loss:',w.item(),b.item(),loss.item())
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.rcParams['font.size']=20
plt.scatter(x.numpy(),y.numpy(),c='red')# detach属于深拷贝
plt.plot(x,y_pre.detach().numpy(),c='blue')# y_pre.detach().numpy()
plt.show()
from torch import nn
#定义模型
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel,self).__init__()
        self.linear=nn.Linear(1,1)#输入特征,输出特征
    def forward(self,x):# 前向传播
        output=self.linear(x)
        return output#预测值
from torch import optim
device=torch.device('cuda'\
if torch.cuda.is_available() else 'cpu')#实例化device
x=torch.rand(500,1).to(device)# 可以变成gpu或cpu下的tensor
y_true=(3*x+0.8)# 因为x是gpu下tensor,y也被变了
print(x[:5],y_true[:5])
model=MyModel().to(device)#其他在模型内的参数等也会变成gpu下的tensor
yhq=optim.SGD(model.parameters(),5e-3)#优化器,parameters()在模型内,也被变成gpu tensor
loss_fn=nn.MSELoss()
#迭代,梯度下降,参数更新
for i in range(5000):
    y_pre=model(x)# 预测值,自动调用_call方法,_call调用forward方法
    loss=loss_fn(y_true,y_pre)#更新损失
    yhq.zero_grad()#梯度归0
    loss.backward()#反向传播
    yhq.step()#更新参数
    if i%100==0:
        print('loss,params:',loss.item(),\
              list(model.parameters())[0].item(),\
              list(model.parameters())[1].item())
# model.eval()# 表示设置模型为预测模式
# model.train(True)#表示设置模型为训练模式
from torch.utils.data import Dataset
data_path=r'C:\Users\li\Downloads\train.txt'
class MyDataset(Dataset):
    def __init__(self):
        self.lines=open(data_path,encoding='utf8').readlines()
    def __getitem__(self,index):
        line= self.lines[index].strip()
#         print(line)
        text,label=line.split('\t')
        return text,label
    def __len__(self):
        return len(self.lines)
from torch.utils.data import DataLoader
mydataset=MyDataset()
dataloader=DataLoader(mydataset,batch_size=32,shuffle=True)
from torchvision.datasets import MNIST
from torchtext.datasets import IMDB
# root是存放数据集的路径,可以没有,没有就自动创建,download,True下载数据集
mnist=MNIST(root='./datasets',train=True,download=False)
plt.figure(figsize=(1,1))
plt.imshow(mnist[0][0],cmap='grey')
data=np.random.randint(0,255,24)
img=data.reshape(2,4,3)# 模拟的一个图片,h,w,c,图片数据在0-255
from torchvision import transforms
# 用transforms将图片数据转换成tensor(c,h,w),用了permute()方法
img_tensor=transforms.ToTensor()(img)
tensor=torch.Tensor(img)
# print(tensor)
# tensor.transpose(2,0)
tensor.permute(2,0,1)#可以交换轴
 ret=transforms.ToTensor()(mnist[0][0])# 将ndarray转换成c,h,w这样的结构
# print(ret.size())
from torch.optim import Adam#梯度和梯度加总都做了ema处理
def get_dataloader(flag=True,batch_size=128):# 每批次128个
        # 数据集,手写辨识,变成了tensor,做了标准化处理
    mnist=MNIST(root='./datasets',train=flag,download=False,
               transform=transforms.Compose(
               [transforms.ToTensor(),#把原来的ndarray(h,w,c)变成饿了(c,h,w)
                #传入的均值和标准差必须和数据集中图片的通道数一致,3通道得3个
                transforms.Normalize((0.1307,),(0.3081,))
               ])
               )
    print(len(mnist))
    return DataLoader(mnist,batch_size=batch_size,shuffle=True)
class MnistNet(nn.Module):
    def __init__(self):
        super(MnistNet,self).__init__()
        self.fc1=nn.Linear(1*28*28,28)#全连接1层28*28--->28
        self.fc2=nn.Linear(28,10)# 输出层28-->10
    def forward(self,input_):
        # -1是batchsize,但batchsize是向上取整,最后那个不一样,写-1,让电脑弄
        # 要么input_.size(0),view相当于reshape
        #修改数据形状,相当于keras中的Flattern
        x=input_.view(-1,28*28*1)#这里不能写死了,因为test时,batch_size大
        # 全连接
        x=self.fc1(x)# 这样内部就进行矩阵操作,输出28*1,线性运算
        x=nn.functional.relu(x)# 激活函数处理,形状不变
        # 输出层
        output=self.fc2(x)# 经过输出层处理,28-->10
        #交叉熵损失,对输出值计算概率和取对数
        return nn.functional.log_softmax(output,dim=-1)
import os
my_model=MnistNet()
#训练,loss:min_loss:0.0556986965239048,loss:0.05224079266190529
optimizer=Adam(my_model.parameters(),lr=5e-4)# parameters()带括号
# 如果路径存在就加载模型,不存在就是新建的模型
if os.path.exists('./model/mnist_model_best_6_5.pkl'):
    my_model.load_state_dict(torch.load('./model/mnist_model_best_6_5.pkl'))
    optimizer.load_state_dict(torch.load('./results/mnist_optim_best_6_5.pkl'))
def train(epoch):
    # 每次epoch都会初始化成这个值,但一次epoch内这个值会
    #取最小
    min_loss=torch.tensor(1000)
    dataloader=get_dataloader()#默认是train=True,batchsize=128
    print('epoch:',epoch+1,len(dataloader))#迭代次数,批次
    for inx,(data,label) in enumerate(dataloader):
        optimizer.zero_grad()# 把之前的梯度归零
        y_pre=my_model(data)#根据data预测,会调用模型的forward方法
        # 真实值乘概率的对数,计算损失,多元交叉熵
        cur_loss=nn.functional.nll_loss(y_pre,label)
        cur_loss.backward()#反向传播,对x求导的过程
        optimizer.step()# 更新梯度
        #小于min_loss才改值,确保min_loss是最小值
        if cur_loss<min_loss:# 如果loss比min_loss小,保存模型
            torch.save(my_model.state_dict(),\
                       './model/mnist_model_best_7_{}.pkl'\
                       .format(epoch+1))#保存模型参数,state_dict必须带括号
            torch.save(optimizer.state_dict(),\
                       './results/mnist_optim_best_7_{}.pkl'\
                       .format(epoch+1))# 保存优化器
            print('模型保存成功,之前的min_loss:{:.6f},当前loss:{:.6f}'\
                  .format(min_loss.item(),cur_loss.item()))
            min_loss=cur_loss# 更改min_loss为当前loss
        if inx%50==0:# 每隔50个batch打印
            print('train epoch:{}[{}/{}({:.0f}%)]\tLoss:{:.6f}'\
                 .format(epoch+1,(inx+1)*len(data),len(dataloader.dataset),\
                 100.*(inx+1)/len(dataloader),cur_loss.item()        
            ))
  for i in range(5):# 迭代5次
    train(i)
def test(model):
    loss_lst=[]
    acc_lst=[]
    model.eval()
    test_dataloader=get_dataloader(flag=False,batch_size=1000)
    with torch.no_grad():#不计算梯度,测试状态
        for idx,(data,label) in enumerate(test_dataloader):
                output=model(data)# 输出(样本数,10)
                #计算的是一个batch的损失
                cur_loss=nn.functional.nll_loss(output,label)
    #             print(output.shape)
                y_pred=output.max(dim=-1)[-1]# 长度2,最大值和对应的类别
                # float()之后有1有0,求它的均值就是求和之后/总样本数
                cur_acc=y_pred.eq(label).float().mean()
    #             print(cur_acc)
        #         print(label[0])# 一维张量
                loss_lst.append(cur_loss)
                acc_lst.append(cur_acc)
        return np.mean(loss_lst),np.mean(acc_lst)
for i in range(5):
    my_model=MnistNet()
    optimizer=Adam(my_model.parameters(),lr=5e-4)# parameters()带括号
    my_model.load_state_dict(torch\
                 .load('./model/mnist_model_best_6_{}.pkl'.format(i+1)))
    optimizer.load_state_dict(torch\
                  .load('./results/mnist_optim_best_6_{}.pkl'.format(i+1)))
    loss,acc=test(my_model)
    print(loss,acc)
    del my_model


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/737608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬网页,不确定网页的编码,不需要用第三方库

Python爬网页&#xff0c;不确定网页的编码&#xff0c;不需要用第三方库&#xff0c;自己写个判断&#xff0c;乱拳打死老师傅 detect试了&#xff0c;不好用 apparent_encoding试了&#xff0c;不好用 encoding试了&#xff0c;不好用 headers里get试了&#xff0c;不好用…

户口本怎么翻译成英文

户口本翻译件一般用于出国旅游签证、商务签证、移民留学等业务时&#xff0c;申请人所需提交的文件之一。户口本翻译件需要正规有资质的翻译机构翻译并加盖翻译专用章,这样才能得到有关部门的认可。那么&#xff0c;英国签证户口本翻译&#xff0c;中译英怎么翻译比较好&#x…

鸿蒙Harmony应用开发—ArkTS声明式开发(模态转场设置:全屏模态转场)

通过bindContentCover属性为组件绑定全屏模态页面&#xff0c;在组件插入和删除时可通过设置转场参数ModalTransition显示过渡动效。 说明&#xff1a; 从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 不支持横竖屏切换。…

TCP三次握手,四次挥手状态转移过程

1.TCP状态转移过程 TCP连接的任意一端都是一个状态机,在TCP连接从建立到断开的整个过程中,连接两端的状态机将经历不同的状态变迁.理解TCP状态转移对于调试网络应用程序将有很大的帮助. 2.三次握手状态转换 3.四次挥手状态转换 4.TIME WAIT状态详解 为什么要有一个"TIME…

数据标注专业团队

数据标注服务 在跟一些淘宝、多多商家老板合作后&#xff0c;客户一般付款后&#xff0c;中介是有20%左右的提成&#xff0c;我们主要是希望可以实现数据标注无中介化&#xff0c;有需求可以直接联系数据标注团队直接负责人&#xff0c; 若有意愿请添加添加v&#xff1a;shu_ju…

9. 内核、文件系统加载工具

内核、文件系统加载工具 内核、文件系统加载工具是嵌入式开发必备的工具 1. 烧写BootLoader 1.1 通过超级终端方式 烧写 Bootloader 可以使用超级终端的“传送” |“发送文件”命令进入发送文件对话框&#xff0c;使用 Xmodem 协议和 Kermit 协议发送 Bootloader 的各个文件…

docker安装rocketMq

在搭建之前&#xff0c;我们需要做一些准备工作&#xff0c;这里我们需要使用 docker 搭建服务&#xff0c;所以需要提前安装 docker。 此外&#xff0c;由于 rocketmq 需要部署 broker 与 nameserver &#xff0c;考虑到分开部署比较麻烦&#xff0c;这里将会使用docker-comp…

网络模块使用Hilt注入

retrofit的异步回调方法已经做了线程切换&#xff0c;切换到了主线程 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"><uses-permission android:name"andr…

JS原型链面试题

题目1 function Person(name) {this.name name; }Person.prototype.sayHello function() {console.log(Hello, this.name); };var john new Person(John); john.sayHello();请问上述代码的输出结果是什么&#xff1f; 答案1 输出结果是&#xff1a;Hello, John 题目2 …

如何通过Python代码连接OceanBase Oracle租户

背景 目前&#xff0c;连接数据库的Oracle租户&#xff0c;只能通过Java和C的驱动程序&#xff0c;无法通过其他语言的驱动程序。为了满足社区中用户希望在Python代码中连接Oracle租户的需求&#xff0c;这里提供一种替代方案。通过结合使用JayDeBeApi和JDBC&#xff0c;我们可…

Docker使用及部署流程

文章目录 1. 准备Docker环境2. 准备应用的Docker镜像3. 在服务器上运行Docker容器方法一:Docker Hub方法二:从构建环境传输镜像4. 管理和维护使用Docker Compose(可选)主要区别步骤 1: 安装Docker ComposeLinuxWindowMac步骤 2: 创建docker-compose.yml文件步骤 3: 使用Doc…

牛客网KY266 反序数

题目 描述&#xff1a; 设N是一个四位数&#xff0c;它的9倍恰好是其反序数&#xff08;例如&#xff1a;1234的反序数是4321&#xff09;求N的值。 输入描述&#xff1a; 程序无任何输入数据。 输出描述&#xff1a; 输出题目要求的四位数&#xff0c;如果结果有多组&#xff…

超越 Siri 和 Alexa:探索LLM(大型语言模型)的世界

揭秘LLM&#xff1a;语言模型新革命&#xff0c;智能交互的未来趋势 近年来&#xff0c;虚拟助手的世界发生了重大转变。 虽然 Siri 和 Alexa 本身就是革命性的&#xff0c;但一种称为大型语言模型 (LLM) 的新型人工智能正在将虚拟助手的概念提升到一个全新的水平。 在这篇博文…

JS自动跳转手机移动网页

JavaScript 中实现自动检测用户是否使用移动设备&#xff0c;并据此跳转到对应的手机移动网页&#xff0c;通常可以通过检查 ​​navigator.userAgent​​ 属性来识别用户代理字符串中包含的设备信息。以下是一个简单的示例&#xff0c;展示如何基于用户使用的浏览器类型进行判…

主流接口测试框架对比,究竟哪个更好用

公司计划系统的开展接口自动化测试&#xff0c;需要我这边调研一下主流的接口测试框架给后端测试&#xff08;主要测试接口&#xff09;的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求&#xff0c;看哪个框架更适合我们。 需求 1、接口编写…

[IAGC] Kafka消费者组的负载均衡策略

在Apache Kafka中&#xff0c;负载均衡是通过将主题的每个分区分配给消费者组中的一个消费者来实现的。Kafka的负载均衡算法会尽可能平均地将分区分配给每个消费者。 文章目录 分配策略Kafka的重新平衡扩展性参考资源 分配策略 在Kafka中&#xff0c;有两种内置的分区分配策略…

2-LINUX--Linux 系统文件类型与文件权限

一.文件类型 Linux 下所有的东西都可以看做文件&#xff0c;Linux 将文件分为以下几种类型&#xff1a; 1. 普通文件 ‘-’ 2. 目录文件 ‘d’ 3. 管道文件 ‘p’ 4. 链接文件 ‘l’ 5. 设备文件&#xff08;块设备 ’b’ 、字符设备 ‘c’&#xff09; 6. 套接字…

算法竞赛例题讲解:[蓝桥杯 2023 国 B] 班级活动

[蓝桥杯 2023 国 B] 班级活动 题目描述 小明的老师准备组织一次班级活动。班上一共有 n n n 名&#xff08; n n n 为偶数&#xff09;同学&#xff0c;老师想把所有的同学进行分组&#xff0c;每两名同学一组。为了公平&#xff0c;老师给每名同学随机分配了一个 n n n 以…

.NET 简介:跨平台、开源、高性能的开发平台

.NET 简介 .NET 是微软开发的一个免费、开源、跨平台的开发人员平台&#xff0c;用于构建各种类型的应用程序。它可以运行使用多种语言编写的程序&#xff0c;其中 C# 是最常用的语言。.NET 依赖于许多大规模应用在生产中使用的高性能运行时。 .NET 平台具有以下特点&#xf…

伟骅英才|二月二:龙年龙抬头

二月二龙抬头&#xff0c;是中国民间传统节日&#xff0c;人们期盼通过对龙的祈求来实现降雨的目的&#xff0c;寄托了老百姓对美好生活的向往。这一天&#xff0c;人们通常会去理个发&#xff0c;寓意着“二月二剃龙头&#xff0c;一年都有精神头”。现如今的二月二&#xff0…