深度学习,从零实现多层感知机——李沐老师的课程笔记
对于深度学习,非常推荐李沐老师的课程,受益匪浅
课程视频10 多层感知机 + 代码实现 - 动手学深度学习v2_哔哩哔哩_bilibili
这里对源码做一些注释,希望大家可以更好理解这里面的意思
没有基础不知道软件如何安装的可以看Python深度学习:安装Anaconda、PyTorch(GPU版)库与PyCharm_哔哩哔哩_bilibili
有基础的也可以直接看代码,来加深理解
若有差错,请与我联系探讨pwp
首先是概念:
单层感知机用wx+b来模拟分割线,进行分类,而遇到图中这种情况,则无法正确分类;
这个时候得用多层感知机的理念:
首先用两层分割线,第一层分割线X(h=sigmoid(wx+b))划分出3,4为负,1,2为正,
然后第二层分割线Y(o=w‘h+b)将1转为负,3转为正,此时就可以分辨了
但是这里注意,Y轴很好解决,但是x轴就不好解决了,因为相同x值(如点1,3)要得到两个不同的y值,用线性函数做不到,所以要用非线性函数,这个非线性函数作为激活函数来使如同X轴分割。
比如h不用sigmoid函数,那么把o中h代换,得到的w‘wx的w’w也是一个普通线性,所以不行
##激活函数
sigmoid
Tanh
ReLU:最常用的,简单,快速,不用算指数
然后是代码:
这里把W1和W2全部用zero来设置初始为0,会使得loss降不下来,巨高无比,大概在2.3,图像中都显示不出来,关于d2l报错和不显示loss看我上一篇softmax
import torch
from torch import nn
from d2l import torch as d2l
batch_size = 256
train_iter , test_iter = d2l.load_data_fashion_mnist(batch_size)
num_inputs , num_outputs , num_hiddens = 784 , 10 , 256
# 这个nn.parameter是为了让他变为leaf tensor,因为乘了0.01,有了操作就不是leaf tensor
W1 = nn.Parameter(
torch.randn(num_inputs, num_hiddens, requires_grad=True) * 0.01)
# W1 = torch.zeros(num_inputs , num_hiddens , requires_grad = True)
b1 = torch.zeros(num_hiddens , requires_grad = True)
W2 = nn.Parameter(
torch.randn(num_hiddens , num_outputs , requires_grad = True)* 0.01)
# W2 = torch.zeros(num_hiddens , num_outputs , requires_grad = True)
b2 = torch.zeros(num_outputs , requires_grad = True)
params = [W1, b1, W2, b2]
def relu(X):
a = torch.zeros_like(X)
return torch.max(X, a)
def net(X):
X = X.reshape((-1, num_inputs))
H = relu(X @ W1 + b1)
return H @ W2 +b2
num_epochs, lr = 10, 0.1
loss = nn.CrossEntropyLoss(reduction='none')
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)