
本系列实验使用了PyTorch深度学习框架,相关操作如下:
conda create -n DL python=3.7 conda activate DLpip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.htmlconda install matplotlib conda install scikit-learn软件包 | 本实验版本 | 目前最新版 |
|---|---|---|
matplotlib | 3.5.3 | 3.8.0 |
numpy | 1.21.6 | 1.26.0 |
python | 3.7.16 | |
scikit-learn | 0.22.1 | 1.3.0 |
torch | 1.8.1+cu102 | 2.0.1 |
torchaudio | 0.8.1 | 2.0.2 |
torchvision | 0.9.1+cu102 | 0.15.2 |
ChatGPT:
前馈神经网络(Feedforward Neural Network)是一种常见的人工神经网络模型,也被称为多层感知器(Multilayer Perceptron,MLP)。它是一种基于前向传播的模型,主要用于解决分类和回归问题。 前馈神经网络由多个层组成,包括输入层、隐藏层和输出层。它的名称"前馈"源于信号在网络中只能向前流动,即从输入层经过隐藏层最终到达输出层,没有反馈连接。 以下是前馈神经网络的一般工作原理:
前馈神经网络的优点包括能够处理复杂的非线性关系,适用于各种问题类型,并且能够通过训练来自动学习特征表示。然而,它也存在一些挑战,如容易过拟合、对大规模数据和高维数据的处理较困难等。为了应对这些挑战,一些改进的网络结构和训练技术被提出,如卷积神经网络(Convolutional Neural Networks)和循环神经网络(Recurrent Neural Networks)等。
本系列为实验内容,对理论知识不进行详细阐释
(咳咳,其实是没时间整理,待有缘之时,回来填坑)

import torch__init__ def __init__(self, input_size, output_size):
self.params = {}
self.params['W'] = nn.Parameter(torch.randn(input_size, output_size, requires_grad=True))
self.params['b'] = nn.Parameter(torch.randn(1, output_size, requires_grad=True))
self.inputs = None
self.grads = {}params:用于保存模型的参数,包括权重矩阵 W 和偏置向量 b。inputs:保存输入数据的变量。grads:保存参数的梯度的变量。b. __call__(self, x)方法 __call__(self, x)方法使得该类的实例可以像函数一样被调用。它调用了forward(x)方法,将输入的x传递给前向传播方法。
def __call__(self, x):
return self.forward(x)forward def forward(self, inputs):
self.inputs = inputs
outputs = torch.matmul(self.inputs, self.params['W']) + self.params['b']
return outputs在前向传播中,输入数据经过线性变换操作得到输出:
nn.Parameter 将随机初始化的权重矩阵 W 和偏置向量 b 包装成可训练的参数。forward 方法中,输入数据 inputs 与权重矩阵 W 相乘,然后加上偏置向量 b,得到输出值 outputs。forward 方法返回计算得到的输出值。backward def backward(self, grads=None):
if grads == None:
grads = torch.ones(self.params['W'].shape)
self.grads['w'] = torch.matmul(self.inputs.T, grads)
self.grads['b'] = torch.sum(grads, dim=0)
return torch.matmul(grads, self.params['W'].T) backward(self, grads=None)方法执行线性变换的反向传播:
grads,用于传递输出的梯度。grads,则默认为全1的张量,表示对输出的梯度都为1。net = Linear(4, 2)
x = torch.tensor([1,1,1,1], dtype=torch.float32)
y = net(x)
z = net.backward()
print(z)Linear的实例net;x进行前向传播;net.backward()进行反向传播,得到输入x的梯度tensor([[-0.8962, -0.9053, -1.5650, -0.3181],
[-0.8962, -0.9053, -1.5650, -0.3181],
[-0.8962, -0.9053, -1.5650, -0.3181],
[-0.8962, -0.9053, -1.5650, -0.3181]], grad_fn=<MmBackward>)# 导入必要的工具包
import torch
class Linear:
def __init__(self, input_size, output_size):
self.params = {}
self.params['W'] = nn.Parameter(torch.randn(input_size, output_size, requires_grad=True))
self.params['b'] = nn.Parameter(torch.randn(1, output_size, requires_grad=True))
self.inputs = None
self.grads = {}
def __call__(self, x):
return self.forward(x)
def forward(self, inputs):
self.inputs = inputs
outputs = torch.matmul(self.inputs, self.params['W']) + self.params['b']
return outputs
def backward(self, grads=None):
if grads == None:
grads = torch.ones(self.params['W'].shape)
self.grads['w'] = torch.matmul(self.inputs.T, grads)
self.grads['b'] = torch.sum(grads, dim=0)
return torch.matmul(grads, self.params['W'].T)
net = Linear(4, 2)
x = torch.tensor([1,1,1,1], dtype=torch.float32)
y = net(x)
z = net.backward()
print(z)注意:
本实验仅实现了线性模型的前向传播和反向传播部分,缺少了模型的训练部分,欲知后事如何,请听下回分解。