引言
- 这个系列用于记录笔者在学习深度学习中遇到的一些知识点
- 所谓深度学习, 一开始或许是心血来潮吧, 但好像变得一发不可收拾了(笑), 虽然还在入门阶段就是了
- 说是博客其实大概只是写给自己看的吧(笑), 我想应该不会有人看得懂我写的, 如果依托于我贫弱的文字表达能力的话
- 大概会一直更新下去吧, 如果能记得更新博客的话(笑)
- 顺带一提, 本系列大概一切代码都会依托于pytorch框架
正文
本文需要一定的机器学习基础和数学基础, 理论上应该大致了解多层感知机以及掌握部分线性代数知识, 加分项是概率论哦
1. 神经网络的层与块
对于一个神经网络, 一层中包含了若干 参数(params) ,例如 权重(weights) 和 偏差(bias)
我们可以用以下代码简单地创建一个神经网络对象
import torch
from torch import nn
net = nn.Sequential(nn.Linear(10, 256), nn.ReLU(), nn.Linear(256, 20), nn.Linear(20, 1))
这样会创建一个三层的神经网络, 其中第一层为隐藏层, 后两层为线性层
此时,形如第一层与第二层组合而成的网络可被称为 块
在实际应用中, 人们逐渐发现将独立出一种比整个神经网络小, 但是比一层大的结构非常好用, 于是产生了块的概念, 关于块的作用在今后的文章会有所提及(其实是我还没学会)
2.自定义网络
使用torch内置的模块nn.Sequential创建神经网络非常方便, 但是缺乏自由度
于是我们可以这样自定义神经网络
import torch
from torch import nn
class MySequential(nn.Module):
def __init__(self):
super().__init__()
self.hidden = nn.Linear(10, 256)
self.relu = nn.ReLU()
self.linear = nn.Linear(256, 20)
self.out = nn.Linear(20, 1)
def forward(self, X):
X = self.hidden(X)
X = self.relu(X)
X = self.linear(X)
X = self.out(X)
while X.abs().sum() > 1: # 可以做一些小巧思处理
X /= 2
return X
net = MySequential() #等同于 net = nn.Sequential(nn.Linear(10, 256), nn.ReLU(), nn.Linear(256, 20), nn.Linear(20, 1))
在调用 net(X) 时, 对象会自动调用forward方法,我们可以在该方法加入一些nn.Sequential无法进行的处理
3.自定义层
有时某个torch未定义的操作需要被我们反复使用, 此时就需要创建一个自定义层确保每次需要可以方便地调用它
import torch
from torch import nn
class MyLayer(nn.Module):
def __init__(self, inputs, outputs):
super().__init__()
# 随机初始化权重和偏差
self.weights = nn.Parameter(torch.rand(inputs, outputs))
self.bias = nn.Parameter(torch.zeros(outputs, ))
def forward(self, X):
X = torch.matmul((X, self.weights)) + self.bias
return X
net = nn.Sequential(nn.Linear(10, 256), MyLayer(256, 1))
# 或者创建一个无参数的层
class LayerNoParams(nn.Module):
def __init__(self):
super().__init__()
def forward(self, X):
X = X - X.mean()
return X
net = nn.Sequential(MyLayer(10, 1), LayerNoParams())
尾声
- 笔者对神经网络的理解程度较低,若文中有任何错误,欢迎批评斧正!

![[更新ing] 深度学习神经网络设计基础 1.简单的自定义神经网络](/images/tenshi/tenshi_cool1_1920x1080.jpg)