0 前言
0.1、课程链接:
《PyTorch深度学习实践》完结合集
有大佬已经写好了笔记:大佬的笔记
pytorch=0.4
0.2、课件下载地址:
链接:https://pan.baidu.com/s/1_J1f5VSyYl-Jj2qIuc1pXw
提取码:wyhu
6、逻辑回归
Linear Regression
损失函数值需要是一个标量值
以下代码可以作为深度学习的一个框架,可以在此基础上进行拓展,作为比较大的模型的拓展。
以后都是在这4步上面进行拓展
1、prepare dataset
2、Design model using Class
3、Construct loss and optimizer
4、Training cycle
准备数据:
所有符合()的函数都称为sigmoid函数,sigmoid函数中最出名的函数就是logistic函数,有些框架中直接将logistic函数称为sigmoid函数。
有些材料里面介绍1/1+e-x就是sigmoid函数,是因为这个函数是sigmoid函数中最具有典型性的函数。
1/1+e-x学名叫logistic函数,在pytorch库中称其为sigmoid函数(约定俗称的叫法)。
在深度学习的论文中西格玛函数就是logistic函数
它在论文中使用的比较多,是因为它能保证输出值在(0,1)之间
线性回归和逻辑回归之间的关系:
线性回归和逻辑回归在二分类任务中的损失函数比较:
线性回归的损失函数度量的是两个实数之间的距离,逻辑回归的损失函数度量的是两个分布之间的距离。
在数理统计中计算两个分布之间的距离:KL散度、cross-entropy
交叉熵的定义:
现在有两个分布PD1(x)、PD2(x)
交叉熵就是ΣPD1(x)lnPD2(x)
用这个式子来表示两个分布之间差异的大小
例如:
希望这个值能够越大 越好
y=1的时候,loss = -ylogy_hat= -logy_hat,这个loss越小越好,即logy_hat越大越好,即y_hat越大越好,即y_hat越接近1越好
y=0的时候,loss = -log(1-y_hat),这个loss越小越好,即log(1-y_hat)越大越好,即1-y_hat越大越好,即y_hat越接近0越好
这个函数叫做BCE函数,
在西格玛函数那里不需要参数,因此在初始化函数那里不用初始化,只需要在forward函数中添加该函数
sigmoid函数在torch.nn.functional.sigmoid中
BEC就是而分类的交叉熵损失函数(cross entropy函数),Binary Classification Erro
size_average = False这个是说小批量样本的损失值是否求均值。求不求只会影响学习率的设置。如果算了损失值的平均值,损失值在对参数w求导数的时候,这个导数上面也会带上这个1/N,因此学习率的设置也会受到相应影响。
编写任何一个深度学习模型都可以使用以上的代码结构
准备数据集: 读取数据可能很复杂,封装到一个模块中,并提供一些工具函数或工具类
模型构造: 定义相应的模型,如果模型很复杂就直接放在单独的一个文件中,构造这个模型,然后在主程序中import进来
损失函数和优化器: 设计自己的损失函数需要继承nn.module模块,设计自己的损失函数,优化器也一样
主程序中的训练循环: 预测值、损失值都弄好了就使用上面的代码顺序做就好了
模型的测试:
代码
import torch.nn.functional as F
import torch
import matplotlib.pyplot as plt
# 准备数据集
data_x = torch.Tensor([[1],[2],[3]])
data_y = torch.Tensor([[0],[0],[1]])
# 使用一个类设计一个模型
class LRModel(torch.nn.Module):
def __init__(self):
super(LRModel,self).__init__()
self.linear = torch.nn.Linear(1,1)
def forward(self, x):
z = self.linear(x)
y_pred = F.sigmoid(z)
return y_pred
model = LRModel()
# 建立损失函数和优化器
# criterion是标准的意思
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
epoch_list = []
loss_list = []
# 建立训练循环
for epoch in range(100):
y_pred = model(data_x)
loss = criterion(y_pred, data_y)
print(epoch, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
epoch_list.append(epoch)
loss_list.append(loss)
c = torch.Tensor([[6]])
print("(在训练后)输入:",6,"预测:",model(c).item())
plt.plot(epoch_list, loss_list)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.show()