pytorch

总结:

  dir()函数,能让我们知道工具箱,以及工具箱中的分隔区有什么东西。

  help()函数,能让我们知道每个工具是如何使用的,工具是使用方法。

 

 

代码是以块为一个整体运行的话:

  python文件:python文件的块的所有行的代码   优:通用,传播方便,通用于大型项目      缺:需要从头运行a

  python控制台:以任意行为块,运行的              优:显示每个变量属性                              缺:不利于代码阅读及修改

  Jupyter   :  优:利于代码阅读及修改            缺:环境需要配置

 

加载数据(Dataset,Dataloader)

   Dataset:提供一种方式去获取数据及其label

   Dataloader:为后面的网络提供不同的数据形式

 

TensorBoard :

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("logs")

for i in range(100):
    writer.all_writers("y=x",i,i)

writer.close()

  需要下载一个tensorboard:pip install tensorboard(在Local中可下载)

  然后 tensorboard --logdir=logs --port=6007

  点击跳转到tensorboard界面

 

 

 

 

 

Python中 __call__的用法

# call可以直接通过括号进行传参
class Person:
    def __call__(self, name):
        print("__call__"+"hello" + name)

    def helllo(self,name):
        print("hello"+name)

person = Person()
person.helllo("list")
person.__call__("ppp")
person("fff")

 

 

# 作者:  喻凌超
# 创建时间:  2022/5/7 10:15

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

writer = SummaryWriter("logs")
img = Image.open("images/IMG_9929.JPG")
print(img)


# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor",img_tensor)

# Normalize   可以熏染照片
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
# 并不是上面的img
immg_norm = trans_norm(img_tensor)
print(immg_norm[0][0][0])
writer.add_image("Normalize",immg_norm)

writer.close()

 

                                                                   Compose()用法

  Compose() 中的参数需要是一个列表,Python中,列表的表示形式为[数据1,数据2,。。。。]

  在Compose中,数据需要是 transforms类型,所得的,Compose([transforms参数1,transforms参数2,....])

 

 

trochvision数据集使用:

# 作者:  喻凌超
# 创建时间:  2022/5/8 14:49

import torchvision
from torch.utils.tensorboard import SummaryWriter

dataset_transform = torchvision.transforms.Compose([
    torchvision.transforms.ToTensor() # 将每一张图片转换为trans数据类型
])

train_set = torchvision.datasets.CIFAR10(root="./dataset",train=True,transform=dataset_transform,download=True)
test_set = torchvision.datasets.CIFAR10(root="./dataset",train=False,transform=dataset_transform,download=True)
#
# print(test_set[0])
# print(test_set.classes)
#
# img,target = test_set[0]
# print(img)
# print(target)
# img.show()

# print(train_set[0])

writer = SummaryWriter("p10")
for i in range(10):
    img,target = test_set[i]
    writer.add_image("test_set",img,i)

writer.close()

 

Dataloader使用:

# 作者:  喻凌超
# 创建时间:  2022/5/8 15:40
import torchvision

# batch-size   一次抽取几张图片
# shuffle 在同样的取数据中取出来的数据不相同
# num_workers   是否为多线程
# drop_last  最后数据是否取舍

# 准备的测试数据集
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

test_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor)
test_loader = DataLoader(dataset=test_data,batch_size=64,shuffle=True,num_workers=0,drop_last=True)

# 测试数据集中第一张图片集target
img,target = test_data[0]
print(img,target)
print(target)

writer = SummaryWriter("dataloader")
for epoch in range(2):
    step = 0
    for data in test_loader:
        imgs,targets = data
        writer.add_images("Epoch:{}".format(epoch),imgs,step)
        step = step + 1

writer.close()

 

神经网络--nn.Modul的使用

# 作者:  喻凌超
# 创建时间:  2022/5/8 16:34
import torch
from torch import nn


class Ylc(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, input):
        output = input + 1
        return output

ylc = Ylc()
x = torch.tensor(1.0)
output = ylc(x)
print(output)

 卷积:

 

 

 

import torch
import torch.nn.functional as F

input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])

kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

# 将上面数组转换为5*5的矩阵
input = torch.reshape(input,[1,1,5,5])
kernel = torch.reshape(kernel,[1,1,3,3,])

print(input.shape)
print(kernel.shape)

output = F.conv2d(input,kernel,stride = 1)
print(output)

# padding输入的图像的矩阵上下左右都增加1
output = F.conv2d(input,kernel,stride = 2,padding=1)
print(output)

 

 

 

神经网络--卷积层

 

 

 

from turtle import shape

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10("../data",train=False,transform=torchvision.transforms.ToTensor(),download=True)

dataloader = DataLoader(dataset,batch_size=64)

class Tudui(nn.Module):

    def __init__(self) -> None:
        super(Tudui,self).__init__()
        self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        x = self.conv1(x)
        return x

tudui = Tudui()

writer = SummaryWriter("../logs")

step = 0

for data in dataloader:
    imgs,targets = data
    output = tudui(imgs)
    print(imgs,shape)
    writer.add_images("input",imgs,step)

    torch.reshape(output,())
    writer.add_images("output",output,step)

    step = step + 1

 

 神经网络--最大池化的使用   (# 可在input池中通过卷积核来筛选出最大的通过output输出

 

 

 

# 可在input池中通过卷积核来筛选出最大的通过output输出
# 保护原有信息,但是比较模糊
import torch from torch import nn from torch.nn import MaxPool2d input = torch.tensor([[1,2,0,3,1], [0,1,2,3,1], [1,2,1,0,0], [5,2,3,1,1], [2,1,0,1,1]],dtype=torch.float32) input = torch.reshape(input,(-1,1,5,5)) print(input.shape) class Tuidui(nn.Module): def __init__(self) -> None: super(Tuidui,self).__init__() self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False) def forward(self,input): output = self.maxpool1(input) return output tuidui = Tuidui() output = tuidui(input) print(output)

 

 神经网络--线性层

 

 

 

 

from turtle import shape

import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10("../data",train=False,transform=torchvision.transforms.ToTensor(),
                                       download=True)

dataloader = DataLoader(dataset,batch_size=64)


class Tudui(nn.Module):

    def __init__(self) -> None:
        super(Tudui,self).__init__()
        self.linear1 = Linear(196688,10)

    def forward(self,input):
        output = self.linear1(input)
        return output

tuidui = Tudui()

for data in dataloader:
    imgs,targets = data
    print(imgs,shape)
    output = torch.reshape(imgs,(1,1,1,-1))
    print(output.shape)
    output = tuidui(output)
    print(output.shape)

 

神经网络--搭建小实战

# 作者:  喻凌超
# 创建时间:  2022/5/10 13:59
import torch
from torch import nn
from torch.nn import Conv2d,MaxPool2d,Flatten,Linear


class Tuidui(nn.Module):
    def __init__(self) -> None:
        super(Tuidui,self).__init__()
        self.conv1 = Conv2d(3,32,5,padding=2)
        self.maxpool1 = MaxPool2d(2)
        self.conv2 = Conv2d(32,32,5,padding=2)
        self.maxpool2 =MaxPool2d(2)
        self.conv3 = Conv2d(32, 32, 5, padding=2)
        self.maxpool3 = MaxPool2d(2)
        self.flatten = Flatten()
        self.linear1 = Linear(1024,64)
        self.linear2 = Linear(64,10)


    def forward(self,x):
        x = self.conv1(x)
        x = self.maxpool1(x)
        x = self.conv2(x)
        x = self.maxpool2(x)
        x = self.conv3(x)
        x = self.maxpool3(x)
        x = self.flatten(x)
        x = self.linear1(x)
        x = self.linear2(x)
        return x


tuidui = Tuidui()
print(tuidui)
input = torch.ones((64,3,32,32))
output = tuidui(input)
print(output.shape)
# 作者:  喻凌超
# 创建时间:  2022/5/10 14:10

import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential


class Tuidui(nn.Module):
    def __init__(self):
        super(Tuidui,self).__init__()
        self.model1 = Sequential(
            Conv2d(3,32,5,padding=2),
            MaxPool2d(2),
            Conv2d(3, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(3, 64, 5, padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024,64),
            Linear(64,10),


        )


    def forward(self,x):
        x = self.model1(x)
        return x


tuidui = Tuidui()
print(tuidui)
input = torch.ones((64,3,32,32))
output = tuidui(input)
print(output.shape)

 

 

损失函数和反向传输

损失函数的作用
损失函数的作用,就是计算神经网络每次迭代的前向计算结果与真实值的差距,从而指导下一步的训练向正确的方向进行。

如何使用损失函数呢?具体步骤:

  1. 用随机值初始化前向计算公式的参数;
  2. 代入样本,计算输出的预测值;
  3. 用损失函数计算预测值和标签值(真实值)的误差;
  4. 根据损失函数的导数,沿梯度最小方向将误差回传,修正前向计算公式中的各个权重值;
  5. goto 2, 直到损失函数值达到一个满意的值就停止迭
# 作者:  喻凌超
# 创建时间:  2022/5/10 15:58

import torch
from torch.nn import L1Loss
from torch import nn


inputs = torch.tensor([1,2,3],dtype=torch.float32)
targets = torch.tensor([1,2,5],dtype=torch.float32)

inputs = torch.reshape(inputs,(1,1,1,3))
targets = torch.reshape(targets,(1,1,1,3))

loss = L1Loss(reduction='sum')
result = loss(inputs,targets)

loss_mse = nn.MSELoss()
result_mse = loss_mse(inputs,targets)

print(result)
print(result_mse)

x = torch.tensor([0.1,0.2,0.3])
y = torch.tensor([1])
x = torch.reshape(x,(1,3))
loss_cross = nn.CrossEntropyLoss()
result_cross = loss_cross(x,y)
print(result_cross)

 

优化器:

# 作者:  喻凌超
# 创建时间:  2022/5/10 16:56
import torchvision
import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10("../data",train=False,transform=torchvision.transforms.ToTensor(),
                                       download=True)

dataloader = DataLoader(dataset,batch_size=1)

class Tuidui(nn.Module):
    def __init__(self):
        super(Tuidui,self).__init__()
        self.model1 = Sequential(
            Conv2d(3,32,5,padding=2),
            MaxPool2d(2),
            Conv2d(3, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(3, 64, 5, padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024,64),
            Linear(64,10),


        )


    def forward(self,x):
        x = self.model1(x)
        return x

loss = nn.CrossEntropyLoss()
tuidui = Tuidui()
# 创建一个优化器
optiom = torch.optim.SGD(tuidui.parameters(),lr=0.01)
for epoch in range(20):
    running_loss = 0.0
    for data in dataloader:
        imgs,targets = data
        outputs = tuidui(imgs)
        result_loss = loss(outputs,targets)
        # 将阶数归零
        optiom.zero_grad()
        # 调用阶数
        result_loss.backward()
        # 进行优化
        optiom.step()
        running_loss = running_loss + result_loss
    print(running_loss)

 

 现有网络模型的使用和修改:

# 作者:  喻凌超
# 创建时间:  2022/5/10 17:30

import torchvision

from torch import nn

vgg16_false = torchvision.models.vgg16(pretrained=False)
vgg16_true = torchvision.models.vgg16(pretrained=True)

print(vgg16_true)
print(vgg16_false)

train_data = torchvision.datasets.CIFAR10('../data',train=True,transform=torchvision.transforms.ToTensor(),
                                          download=True)

vgg16_true.classifier.add_module('add_linear',nn.Linear(1000,10))
print(vgg16_true)

print(vgg16_false)
vgg16_false.classifier[6] = nn.Linear(4096,10)
print(vgg16_false)

 

 网络模型的加载和保存

# 作者:  喻凌超
# 创建时间:  2022/5/10 22:58
import torch
import torchvision

# 方式一  加载模型
model = torch.load("vgg16_method1.path")
# print(model)

# 方式二  加载模型
vgg16 = torchvision.models.vgg16(pretrained=False)
vgg16.load_state_dict(torch.load("vgg16_method.path"))
# model = torchvision.load("vgg16_method.path")
print(vgg16)
# 作者:  喻凌超
# 创建时间:  2022/5/10 22:52

import torch
import torchvision


vgg16 = torchvision.models.vgg16(pretrained=False)
# 模型结构+模型参数
torch.save(vgg16,"vgg16_method1.path")


# 模型参数(官方推荐)
torch.save(vgg16.state_dict(),"vgg16_method.path")

 

 

 

posted on 2022-05-12 09:01  只想做加法(ylc)  阅读(142)  评论(0)    收藏  举报

导航