• 深度学习之pytorch第一课


    学习使用pytorch,然后进行简单的线性模型的训练与保存
    学习代码如下:

    import numpy as np
    import torch
    import torch.nn as nn
    x_value = [i for i in range(11)]
    x_train = np.array(x_value,dtype=np.float32)
    print(x_train.shape)
    x_train = x_train.reshape(-1,1)  # 将数据转换成矩阵
    print(x_train.shape)
    y_value = [2*i+1 for i in x_value]
    y_train = np.array(y_value,dtype=np.float32)
    print(y_train.shape)
    y_train = y_train.reshape(-1,1) # 将数据转换成矩阵
    print(y_train.shape)
    
    class LinearRegressionModel(nn.Module):  # 我们只需要在此类中写道我们用到了哪些层
        def __init__(self,input_dim,output_dim):
            super(LinearRegressionModel, self).__init__()
            self.linear = nn.Linear(input_dim, output_dim) # 输入输出的维度 这是我们要更改的内容
        def forward(self, x): # 在深度学习中走的层
            out = self.linear(x) #这是我们要改的内容
            return out
    input_dim = 1
    output_dim = 1
    model = LinearRegressionModel(input_dim,output_dim)
    print(model)
    # 指定好参数以及算是函数
    epochs = 1000 # 一共执行了1000次
    learning_rate = 0.01  # 学习率是0.01
    optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)  # 指定相应的优化器,优化的是模型计算的参数
    criterion = nn.MSELoss()  # 损失函数
    
    # 下面是训练模型
    for epoch in range(epochs):
        epoch += 1
        # 注意训练模型要转换成tensor形式
        inputs = torch.from_numpy(x_train)
        labels = torch.from_numpy(y_train)
    
        # 梯度每次迭代用完都要进行清零,不然就会累加
        optimizer.zero_grad()
    
        # 前向传播
        outputs = model(inputs)
    
        # 计算损失
        loss = criterion(outputs,labels)
    
        #反向传播
        loss.backward()
    
        # 更新权重参数
        optimizer.step()
    
        if epoch % 50 == 0:
            print('epoch{}, loss{}'.format(epoch, loss.item()))
    
    # 测试模型预测结果
    predicted = model(torch.from_numpy(x_train).requires_grad_()).data.numpy()
    print(predicted)
    
    # 模型的保存与读取
    torch.save(model.state_dict(),'model.pkl')# 将模型的参数保存在model.pkl里面,以字典的形式进行保存
    a = model.load_state_dict(torch.load('model.pkl'))# 读取model.pkl的参数
    print(a)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    这是用cpu跑的,但是一般都是使用gpu跑的
    只需要将数据和模型传入cuda内行了
    改版
    需要写入
    device = torch.device(“cuda:0"if torch.cuda.is_available() else"cpu”)
    model.to(device)

    import numpy as np
    import torch
    import torch.nn as nn
    x_value = [i for i in range(11)]
    x_train = np.array(x_value,dtype=np.float32)
    print(x_train.shape)
    x_train = x_train.reshape(-1,1)  # 将数据转换成矩阵
    print(x_train.shape)
    y_value = [2*i+1 for i in x_value]
    y_train = np.array(y_value,dtype=np.float32)
    print(y_train.shape)
    y_train = y_train.reshape(-1,1) # 将数据转换成矩阵
    print(y_train.shape)
    device = torch.device("cuda:0" if torch.cuda.is_available() else"cpu")
    
    class LinearRegressionModel(nn.Module):  # 我们只需要在此类中写道我们用到了哪些层
        def __init__(self,input_dim,output_dim):
            super(LinearRegressionModel, self).__init__()
            self.linear = nn.Linear(input_dim, output_dim) # 输入输出的维度 这是我们要更改的内容
        def forward(self, x): # 在深度学习中走的层
            out = self.linear(x) #这是我们要改的内容
            return out
    input_dim = 1
    output_dim = 1
    model = LinearRegressionModel(input_dim,output_dim)
    
    # 将模型放入cuda内进行训练
    model.to(device)
    print(model)
    # 指定好参数以及算是函数
    epochs = 1000 # 一共执行了1000次
    learning_rate = 0.01  # 学习率是0.01
    optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)  # 指定相应的优化器,优化的是模型计算的参数
    criterion = nn.MSELoss()  # 损失函数
    
    # 下面是训练模型
    for epoch in range(epochs):
        epoch += 1
        # 注意训练模型要转换成tensor形式
        # 将数据放入cuda内
        inputs = torch.from_numpy(x_train).to(device)
        labels = torch.from_numpy(y_train).to(device)
    
        # 梯度每次迭代用完都要进行清零,不然就会累加
        optimizer.zero_grad()
    
        # 前向传播
        outputs = model(inputs)
    
        # 计算损失
        loss = criterion(outputs,labels)
    
        #反向传播
        loss.backward()
    
        # 更新权重参数
        optimizer.step()
    
        if epoch % 50 == 0:
            print('epoch{}, loss{}'.format(epoch, loss.item()))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
  • 相关阅读:
    vue - - - - vite创建vue3项目(不使用TS)
    html实现爱情浪漫表白甜蜜时刻(附源码)
    云游戏未来展望
    论文解析[4] UNET 3+: A FULL-SCALE CONNECTED UNET FOR MEDICAL IMAGE SEGMENTATION
    【React】《React 学习手册 (第2版) 》笔记-Chapter5-在 React 中使用 JSX
    在线图片生成工具:定制化占位图片的利器
    《C++ Primer》第6章 函数(二)
    java基于springboot中小企业合同管理系统
    《vue3第四章》Composition API 的优势,包含Options API 存在的问题、Composition API 的优势
    万字长文详解开源流式湖仓服务Arctic
  • 原文地址:https://blog.csdn.net/qq_38404903/article/details/134340337