PyTorch 笔记 (三)

2023-11-14

# AutoGrad 自动求导机制
import pandas as pd
import torch
import torch.nn as nn
import numpy as np
from torch.autograd import Variable
from torch.utils.data import Dataset, DataLoader
from torch import optim
from torchvision import datasets, transforms
from torch.utils.data.dataloader import default_collate
from torchvision.datasets import ImageFolder
from torchvision.datasets.folder import default_loader


x = torch.randn(3, 4, requires_grad = True)
print(x)

b = torch.randn(3, 4, requires_grad = True)
t = x + b
y = t.sum()
print(y)
y.backward()
print(b.grad)
print(x.requires_grad, b.requires_grad, t.requires_grad )

# 做一个线性回归模型
# 定义训练参数
x_values = [i for i in range(11)]
x_train = np.array(x_values, dtype = np.float32)
x_train = x_train.reshape(-1, 1)
print(x_train.shape)
# 定义结果
y_values = [2 * i + 1 for i in x_values]
y_train = np.array(y_values, dtype = np.float32)
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
learning_rate = 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()

    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')  # 保存的是 w 和 b
model.load_state_dict(torch.load('model.pkl'))

# tensor 常见形式
# scalar  vector  matrix  n-dimensional tenson

# hub 模块 包括所有的现成模型

'''
PyTorch 的 torch.nn 包提供了很多与实现神经网络中的具体功能相关的类,
这些类涵盖了深度神经网络模型在搭建和参数优化过程中的常用内容。

troch.nn.Sequential  是 torch.nn 中的一种序列容器,通过在容器中嵌套各种实现神经网络中具体功能相关的
类,来完成对神经网络模型的搭建,最主要的是,参数会按照我们定义好的序列自动喘息下去。
模块的加入一般由两种方式,一种是在代码中直接嵌套,另一种是以  orderdict  有序字典
的方式进行传入

第一种
hidden_layer = 100
input_data = 1000
outout_data = 10

models = torch.nn.Sequential (
    torch.nn.Linear(input_data, hidden_layer),
    torch.nn.ReLU(),
    torch.nn.Linear(hidden_layer, output_data)
)

第二种
使用 orderdict 有序字典进行传入来搭建的模型

from collections import OrderedDict
modles = torch.nn.Sequential(OrderDict([
    ("Linel", torch.nn.Linear(input_data, hidden_layer)),
    ("ReLU", torch.nn.ReLU()),
    ("Line2", torch.nn.Linear(hidden_layer, output_data))
]))

torch.nn.Linear  用于定义模型的线性层,即完成不同层之间的线性转换,
参数为3, 输入特征束,输出特征束,是否使用偏置

torch.nn.ReLU  属于非线性激活函数,在定义时默认不传入参数
可以选择的有  PReLU  LeakyReLU  Tanh  Sigmoid   Softmax

torch.nn.MSFLoss  使用均方误差函数对损失值进行计算
torch.nn.L1Loss   使用平均绝对无法函数对损失值进行计算
torch.nn.CrossEntropyLoss    计算交叉熵

更新参数
for param in models.paramters() :
    param.data -= param.grad.data * learning_rate
    
    
在 PyTorch 的 troch.optim 包中提供了非常多的可实现参数自动优化的类
比如 SGD  AdaGrad  RMSProp  Adam
optimizer = torch.optim.Adam(models.parameters()m lr = learning_rate)

optimzer.zero_grad 来完成对模型参数梯度的归零
optimzer.step  主要功能是使用计算得到的梯度值对各个节点的参数进行梯度更新
'''

'''
Variable  和  Tensor 本质上没有区别,不过 Variable  会被放入一个计算图中,然后进行
前向传播、反向传播、自动求导
torch.autograd.Variable 
Variable(a)
'''

'''
torch.utils.data.Dataset 是代表这一数据的抽象类,可以定义数据类来继承和重写这个抽象类
只需要定义 __len__ 和 __getitem__ 两个函数
'''
class myDataset(Dataset) :
    def __init__(self, csv_file, txt_file, root_dir, other_file):
        self.csv_data = pd.read_csv(csv_file)
        with open(txt_file, 'r') as f:
            data_list = f.readline()
        self.txt_data = data_list
        self.root_dir = root_dir

    def __len__(self):
        return len(self.csv_data)

    def __getitem__(self, idx):
        data = (self.csv_data[idx], self.txt_data[idx])
        return data

# 使用多个线程去读取数据
# torch.utils.data.DataLoader 定义一个新的迭代器
# dataiter = DataLoader(myDataset, bach_size = 32, shuffle = True, collate_fn = default_collate)

# 计算机视觉的数据读取类 ImageFolder
# dset = ImageFolder(root = 'root_path', transform = None, loader = default_loader)


'''
PyTorch 里边编写的神经网络所有的层结构和损失函数都来自 torch.nn
所有模型都继承子 nn.Module
'''

'''
使用 gpu 训练模型
if torch.cuda.is_available():
    model = LinearRegression().cuda()
else:
    model - LinearRegression()    
'''

# 测试结果
# model.eval()  将模型变成测试模式

# torch.cat() 实现 Tensor 的拼装
# torch.squeeze 对数据的维度记性压缩
# torch.unsqueeze 对数据维度进行扩充,在指定维度加上维数

def make_features(x):
    x = x.unsqueeze(1)
    return torch.cat([x ** i for i in range(1, 4)], 1)

W_target = torch.FloatTensor([0.5, 3, 2.4]).unsqueeze(1)
b_target = torch.FloatTensor([0.9])
print('w target : {}, \nb_target : {}'.format(W_target, b_target))

def f(x):
    return x.mm(W_target) + b_target[0]

# 随机得到一些数作为训练集
def get_batch(batch_size = 32):
    random = torch.randn(batch_size)
    x = make_features(random)
    # print('\nx : {} \n shape {}'.format(x, x.shape))
    y = f(x)
    return Variable(x), Variable(y)

print('\nget batch : {}'.format(get_batch()))

# Define model
class poly_model(nn.Module):
    def __init__(self):
        super(poly_model, self).__init__()
        self.poly = nn.Linear(3, 1)

    def forward(self, x):
        out = self.poly(x)
        return out

model = poly_model()

criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr = 1e-3)

epoch = 0
while True:
    batch_x, batch_y = get_batch()
    output = model(batch_x)
    loss = criterion(output, batch_y)
    print_loss = loss.item()
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    epoch += 1
    if print_loss < 1e-3:
        break


# nn.BCELoss 是二分类的损失函数
# 分类的准确性通过 结果 大于 0.5 或小于 0.5

# 多层全连接神经网络实现 MNIST 手写数字分类

class simpleNet(nn.Module):
    def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
        super(simpleNet, self).__init__()
        self.layer1 = nn.Linear(in_dim, n_hidden_1)
        self.layer2 = nn.Linear(n_hidden_1, n_hidden_2)
        self.layer3 = nn.Linear(n_hidden_2, out_dim)

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        return x

# 添加激活函数
# 改进网络,添加激活函数增加网络的非线性
class Activation_Net(nn.Module):
    def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
        super(Activation_Net, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Linear(in_dim, n_hidden_1),
            nn.ReLU(True)
        )
        self.layer2 = nn.Sequential(
            nn.Linear(n_hidden_1, n_hidden_2),
            nn.ReLU(True)
        )
        self.layer3 = nn.Sequential(
            nn.Linear(n_hidden_2, out_dim)
        )

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        return x

# 添加批标准化
# 最后一个加快收敛速度的方法 ---- 批标准化
class Batch_Net(nn.Module):
    def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
        super(Batch_Net, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Linear(in_dim, n_hidden_1),
            nn.BatchNorm1d(n_hidden_1),
            nn.ReLU(True)
        )
        self.layer2 = nn.Sequential(
            nn.Linear(n_hidden_1, n_hidden_2),
            nn.BatchNorm1d(n_hidden_2),
            nn.ReLU(True)
        )
        self.layer3 = nn.Sequential(
            nn.Linear(n_hidden_2, out_dim)
        )

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        return x
# 批标准化一般放在全连接层的后面,非线性(激活函数)的前面

# 训练网络
# MNIST 数据集是一个手写字体数据集,包含 0 - 9 这 10 个数字,
# 其中 55000 张训练集,10000 张测试集,5000 张验证集,
# 图片大小是 28 x 28 的灰度图

# 定义一些超参数
# 超参数 Hyperparmeters
batch_size = 64
learning_rate = 1e-3
num_epoches = 20

# 数据预处理,
# torchvision.transforms 提供了很多图片预处理的方法,
# transform.ToTensor()  将图片转换成 PyTorch 中处理的对象 Tensor,在转换过程自动将图片标准化,
#   也就是说 Tensor 的范围是 0 - 1
# transforms.Normalize()  需要传入两个参数,第一个参数是均值,第二个参数是方法,
#   做的处理就是 减均值,再除以方差,用均值和标准差归一化张量图像,将 0 - 1 变换成 -1 - 1
# trochvision.transforms 是 pytorch 中的图像预处理包,一般用 Compose 把多个步骤
#   整合到一起
# 图片是灰度图,所以只有一个通道,如果是彩色图像,有三个通道,
# transforms.Normalize([a, b, c], [d, e, f]) 来表示每个通道对应的均值和方法

data_tf = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize([0.5], [0.5])] # image = (image - mean) / std  -->  -1 ~ 1
)

# 读取数据集
# 下载训练集 MNIST 手写数字训练集
# 通过 PyTorch 的内置函数 torchvision.datasets.MNIST 导入数据集,传入数据预处理,
# 接着使用 torch.utils.data.DataLoader 建立一个数据迭代器,传入数据集和 batch_size,
# 通过 shuffle = True 来表示每次迭代数据的时候是否将数据打乱
train_dataset = datasets.MNIST(
    root = './data',
    train = True,
    transform = data_tf,
    download = True
)
test_dataset = datasets.MNIST(
    root = './data',
    train = False,
    transform = data_tf
)
train_loader = DataLoader(train_dataset, batch_size = batch_size, shuffle = True)
test_loader = DataLoader(test_dataset, batch_size = batch_size, shuffle = False)

# 导入网络,定义损失函数和优化方法
# model = simpleNet(28 * 28, 300, 100, 10)
# model = Activation_Net(28 * 28, 300, 100, 10)
model = Batch_Net(28 * 28, 3000, 1000, 10)
if torch.cuda.is_available():
    model = model.cuda()

criterion = nn.CrossEntropyLoss()  # 交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr = learning_rate)

# 训练网络
# for epoch in range(epochs):
#     epoch += 1


# 训练模型
for epoch in range(num_epoches) :
    epoch += 1
    for train_data in train_loader:
        img, label = train_data
        img = img.view(img.size(0), -1)
        if torch.cuda.is_available():
            img = Variable(img).cuda()
            label = Variable(label).cuda()
        else:
            img = Variable(img)
            label = Variable(label)

        optimizer.zero_grad()
        outputs = model(img)
        loss = criterion(outputs, label)
        loss.backward()
        optimizer.step()

    print('epoch {}, loss {}'.format(epoch, loss.item()))


# model.eval ()
# eval_loss = 0
# eval_ace = 0
# for data in test_loader:
#     img, label = data
#     img = img.view(img.size(0), -1)
#     if torch.cuda.is_available() :
# 工口可 = Tariable (img, volatile=True) . cuda ()
# label = Variable (label, volatile=True) .cuda ()
# 10 else:
# 11 img = Variabel (iπ volatile=True)
# 12 label =飞Tariable (label, volat le=True)
# 13 out = model (img)
# 14 loss = criterion(out, label)
# 15 eval loss += loss.data[O] * label.size(O)
# 16 _, pred = torch.max(out, 1)
# 11 num_correct = (pred == label) .sum()
# 1s eval ace += num correct.data[O]
# 19 print (’Test Loss: {: 6f} , Ace: {: .6 剖’. forrr t(
# 20 eval loss I (len (test dataset)) ,
# 21 val ace I (len(test dataset))))























































































本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyTorch 笔记 (三) 的相关文章

随机推荐

  • SpringMVC拦截器(资源和权限管理)

    原文地址 http blog csdn net tonytfjing article details 39207551 1 DispatcherServlet SpringMVC具有统一的入口DispatcherServlet 所有的请求都
  • 大数据技术Flink详解

    一 有状态的流式处理 Apache Flink 是一个分布式流处理器 具有直观和富有表现力的API 可实现有状态的流处理应用程序 它以容错的方式有效地大规模运行这些应用程序 Flink 于2014 年4 月加入Apache 软件基金会作为孵
  • 基于BSC测试网收益聚合器Beefy协议的编译、测试、部署

    前言 文章主要介绍了收益聚合器Beefy协议在币安智能链测试网网上的编译测试部署流程 以Pancake上的USDC BUSD最新Curve版流动池的农场质押为例 详细介绍了完整的操作流程 准备工作 Node js环境 https nodej
  • 在Struts2里面嵌入Spring

    第一步 在web xml中加入下面的listener
  • Linux虚拟地址空间

    目录 父子进程地址相同的变量值不同问题 运行结果 Linux下进程虚拟地址空间分布 什么是虚拟地址空间 进程直接访问物理内存 无虚拟空间 再述虚拟地址空间 虚拟地址空间结构体是如何区域划分 解答最初的问题 延伸问题 一个pid变量怎么可能保
  • [Unity3D]使用触发器实现简单的场景跳转

    学习Unity脚本推荐 Unity3D官网索引 首先一点 你要确保有一个想要跳转的目标场景 在本案例中 目标场景是ending 第一步 创建一个碰撞体 放置在需要的触发场景跳转的位置 第二步 删除多余的脚本 并且新建自己的脚本 第三步 查阅
  • 基数排序图解与代码

    适用范围与背景 前几天写了 计数排序 刚好学习基数排序 我认为基数排序是计数排序的一个补充或者说延伸 因为计数排序不适合 数列元素间差值较大的情况 而基数排序就解决了此情况 它适用于大整数排序 算法思想 不像传统排序算法 两个元素间相互比较
  • Odoo 16最新saas版本说明及源码下载( SaaS-16.3)

    Odoo 16最新saas版本说明及源码下载 SaaS 16 3 Odoo 16最新功能体验 Odoo saas 16 3 下载源码包见文末 新的改变 Odoo 16发布正式版以来 最大改变 超过以前版本的变化 全新的界面设计 将会带来全新
  • FireFly 服务端 Unity3D黑暗世界 客户端 问题

    启动服务端成功截图 连接成功截图 测试服务端是否启动成功 在Web输入 http localhost 11009 按回车 查看cmd启动的服务端 是否多出如下显示 服务端启动成功 PC unity3d客户端 连接也成功 但在手机端连接不成功
  • 5G QoS控制原理专题详解(15)-PDR的定义和UL PDR

    UPF数据包转发原理基本已经写完了 后续修改整理一下错别字就没问题了 这两天会陆续发出来 这样 5G核心网方面的内容写到这里基本就算整理完了 其实如果数据包转发原理部分都弄明白了 PDU Session创建流程的后续部分走马观花的看一看就可
  • 网络编程day5作业

    1 根据select TCP服务器流程图编写服务器 上交 include
  • C语言程序设计·数据类型(例题和知识点)

    1 假设有变量赋值语句x 10 常量10的类型为short 2 假设有变量赋值语句x 2 2 常量2 2的类型是double 3 short int 类型变量的存储数据范围是 32768 32767 4 赋值语句x 082是错误的 5 语句
  • linux下smbd服务,Linux下资源共享服务之samba 的讲解!

    一 Samba 简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件 由服务器及客户端程序构成 samba是一个工具套件 在Unix上实现SMB Server Message Block 协议 或者称之为NETBIOS
  • Centos7.6安装confluence7.4.6

    文章目录 环境 JDK安装 MySQL安装 下载confluence 安装 页面配置 实例健康检查 页面乱码问题 环境 名称 配置 centos 7 5 1804 jdk 1 8 0 121 mysql 5 7 confluence 7 4
  • 编译Poco-1.6.0

    下载openssl 下载poco openssl 1 0 2l tar gz config fPIC prefix home developer openssl enable shared make j 4 make install 可选扩
  • javaScript基础面试题 ---对象考点

    1 对象是通过new操作符构建出来的 所以对象之间不相等 2 对象注意引用类型 如果是引用类型 就可能会相等 3 现在对象本身查找 gt 构造函数中找 gt 对象原型中找 gt 构造函数原型中找 gt 对象上一层原型 1 对象是通过new操
  • C语言学习记录-C语言内置类型以及strlen获取长度原则

    C语言内置类型 1 整型int short long long long unsigned int unsigned short unsigned long 2 浮点型float float double long double 3 字符型
  • vue3前端页面添加水印

    在页面中 往往会添加水印来展示一些信息 例如在一些页面中加上自己特有的信息 使得别人在截图转发时也能看到这些信息 又好比一家公司的内部系统 可以在页面添加访问者的水印 使得用户在截图转发敏感信息之后 通过截图中的水印可以追寻到泄露信息之人
  • myBatis测试条件查询,条件参数为中文取不到数据

    在用myBatis做模糊查询的时候 发现当传入参数为中文时 就算数据库中有符合条件的数据 但取出的也是空的 但将查询参数变成英文或数字后 又可以正常查询 解决办法 因数据库采用utf 8编码 所以在修改数据库配置文件 加上编码 就可以正常查
  • PyTorch 笔记 (三)

    AutoGrad 自动求导机制 import pandas as pd import torch import torch nn as nn import numpy as np from torch autograd import Var