练习线性函数和非线性函数,搭建一个小示例,看vgg16博客,reshape学习,了解了知识图谱和深度学习的关联
import torch
import torchvision
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
input = torch.tensor([[1, -0.5],
[-1, 3]]) # 注意tensor()中要加一个[]再用[]写张量
input = torch.reshape(input, (-1, 1, 2, 2)) # relu参数有维度要求,所以要reshape
print(input.shape)
dataset = torchvision.datasets.CIFAR10("./data", train= True, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size= 64)
class Dsc(nn.Module):
def __init__(self):
super().__init__()
self.relu1 = ReLU() # 参数inplace为True时会更新input, 当参数inplace为False时不会更新input, 而是返回一个值 inplace 默认为False
self.sigmod1 = Sigmoid()
def forward(self, input):
output = self.sigmod1(input)
return output
dsc = Dsc()
output = dsc(input)
print(output)
writer = SummaryWriter("log_relu")
step = 0
for data in dataloader:
imgs, targets = data
writer.add_images("input", imgs, global_step=step)
output = dsc(imgs)
writer.add_images("output", output, step)
step = step + 1
writer.close()
# data 下载的时候注意格式转换ToTensor要加()
# 有时tensorboard加载图片失败,刷新即可,感觉可能是网速问题
看博客的体会
1.神经网络中数据维度的变换很重要,其中的参数需要经过公式计算,来保证输出的维度是我们所需要的。
2.了解到了神经网络中的卷积一般不会重复使用,但是深度学习需要”深”,所以代码会很长,这里用到了nn.Sequential()容器,在实例中会用到。
3.nn.Sequential() 是PyTorch 中的一个容器,用于按顺序地将多个神经网络层组合在一起,构建一个神经网络模型。通过nn.Sequential(),你可以方便地定义一个神经网络模型,按照你指定的顺序依次添加神经网络层。
reshape学习为了解决昨天的疑问
例子
a = torch.arange(4)
print("a转化前", a)
a = torch.reshape(a, (2, 2))
print("a转化前", a)
b = torch.tensor([[1, 2],
[9, 6]])
print("b转化前", b)
b = torch.reshape(b, (-1,)) # -1这个操作应该算是一个trick把维度降为1
print("b转化前", b)
实例
复现的是CIFAR10的网络结构,是一个识别类的网络
结构图如下:
对于网络中的一些参数需要根据公式进行计算卷积参数计算公式如下:
注意其中Hin和Hout分别为输入和输出图像的大小不是通道数,dialation默认为1,stride一般不要太大(目前自己感觉stride太大会漏掉特征)
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter
class Dsc(nn.Module):
def __init__(self):
super().__init__()
# self.conv1 = Conv2d(3, 32, 5, padding=2, stride=1) # dialation默认为1,kernal_size=5
# self.maxpool1 = MaxPool2d(2)
# self.conv2 = Conv2d(32, 32, 5, padding=2, stride=1)
# self.maxpool2 = MaxPool2d(2)
# self.conv3 = Conv2d(32, 64, 5, padding= 2, stride=1)
# self.maxpool3 = MaxPool2d(2)
# self.flatten = Flatten()
# self.linear1 = Linear(1024, 64)
# self.linear2 = Linear(64, 10)
self.model1 = Sequential(
Conv2d(3, 32, 5, padding=2, stride=1),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2, stride=1),
MaxPool2d(2),
Conv2d(32, 64, 5, padding= 2, stride=1),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10)
)
#conv3这里有一部分疑问,按照公式计算输入尺寸32输出尺寸64,padding应该是18
#解决错误的带入了尺寸,公式中Hin、Hout表示的是输入、输出图片的大小带入8,计算padding得8
# self.linear 图片中将64*4*4转为1维的部分缺少了线性层
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)
x = self.model1(x)
return x
dsc = Dsc()
print(dsc)
input = torch.ones((64, 3, 32, 32))
output = dsc(input)
print(output.shape)
writer = SummaryWriter("logs_seq")
writer.add_graph(dsc, input)
writer.close