目录
神经骨架的使用
首先我们进官网进行相关信息的查询:
container(相当于一个骨架)之中有六个模块,最常用的是module模块,因为对所有神经网络提供了一个最基本的类。
根据module的介绍,我们知道自己创建的model也需要继承该类 。
from torch import nn
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
创建一个类,并且进行继承。init代码可以手打,如果使用的是pycharm,则还可以点击菜单栏中的code,找到generate:
选择是重写该方法还是实现这个方法。选择重写该方法:
选择init即可生成。接着定义好forward函数,就定义好了神经网络的模板:
class Model(nn.Module):
def __init__(self) -> None:
super().__init__()
def forward(self,input):
return input + 1
接着,使用该神经网络:
import torch
model = Model()
x = torch.tensor(1.0)
print(model(x))
输出tensor(2.)
基本神经结构的使用
convolution layers就是卷积层,conv1d代表是一维,同2d、3d,其他不是很常用。此处以2d为例,在左侧选择torch.nn.function可以了解跟细致的操作。torch.nn相当于torch.nn.function的一个封装。
input就是输入,weight是权重,bias是偏置,stride是步径,padding为拓展
比如输入一个5*5的图像,3*3的一个卷积核。
卷积,第一次如上图所示,对应位相乘之和便是对应位置的结果,第一次结果为10。接着,会进行移动,移动的格数便和stride有关,如果stride为1,则先向右移动一位:
计算结果为12,接着再向右移动一位,算得12;因为再向右移便超出范围,所以不能向右移,而是先向下移动:
然后接着向右移动,直到向右、向下移动都会超出边界,得到计算结果:
stride – the stride of the convolving kernel. Can be a single number or a tuple (sH, sW). Default: 1
由stride的描述,可以知道,如果如果为一个数m,则向右向下移动距离一样,也可以分开设置。接着使用代码进行验证:
import torch
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]])
通过函数的介绍,知两个数据的形状不符合函数参数的要求,则进行转换:
input = torch.reshape(input, [1, 1, 5, 5])
kernel = torch.reshape(kernel, [1, 1, 3, 3])
卷积核中的 in_channels
与 需要进行卷积操作的数据的 channels
一致(图片样本的 channels
,取决于图片类型,比如RGB类型有3个通道)
import torch.nn.functional as F
output = F.conv2d(input=input, weight=kernel, stride=1)
print(output)
输出: tensor([[[[10, 12, 12],
[18, 16, 16],
[13, 9, 3]]]])
若stride为2,则输出:tensor([[[[10, 12],
[13, 3]]]])
根据参数padding的介绍,知能在输入的周边进行一个扩充,如果padding为1:
接着以之前相同的方式进行计算(扩充处默认为0):
output = F.conv2d(input=input, weight=kernel, stride=1, padding=1)
print(output)
输出 tensor([[[[ 1, 3, 4, 10, 8],
[ 5, 10, 12, 12, 6],
[ 7, 18, 16, 16, 8],
[11, 13, 9, 3, 4],
[14, 13, 9, 7, 4]]]])