0 前言
0.1、课程链接:
《PyTorch深度学习实践》完结合集
有大佬已经写好了笔记:大佬的笔记
pytorch=0.4
0.2、课件下载地址:
链接:https://pan.baidu.com/s/1_J1f5VSyYl-Jj2qIuc1pXw
提取码:wyhu
7、处理多维特征的输入
以前的输入只是一个实数
这一集讲解输入有多个维度
本节使用的数据集:糖尿病的分类
一行叫做一个sample
一列叫做一个feature即特征
sklearn的糖尿病数据集可以Anaconda/lib/sklearn/data下看,文件格式为.gz文件
mini-batch
pytorch中的函数继承自module的函数都支持向量化函数,即是按元素的
,看下图:
变成向量化这样的方式可以提高计算的速度
将linear改成输入为8输出为1的即可
构造多层的网络怎么搞?
单层的是输入特征维度为8,输出特征维度为1,所以有下面的写法
假如写成了linear(8,2),输入维度为8,输出维度则为2,维度为2这样不符合任务的类型,我们的任务输出维度应该是1.此时添加一个linear(2,1)即可
可以将矩阵看作是一种空间到另一种空间线性变换的转换函数。
将N维空间映射到M维空间中去。
因此linear(8,2):指的是将一个8维空间线性映射
到一个2维空间中
注意:现实中需要做的任务经常要做的空间变换不都是线性的,一般是非常复杂的非线性,所以我们需要用多个线性变换层,通过找到最优的权重,把这些层给组合起来,来模拟非线性的变换。因此,神经网络本质上是在寻找一种非线性的空间变换函数。
神经网络的本质
本质:神经网络本质上是在寻找一种非线性的空间变换函数。
我们的目标是找到8维到1维的非线性变换。
linear可以做到空间维度变换。
linear之后跟上非线性变换西格玛。
激活函数给线性变换增加非线性因子(因素),这样就使得可以拟合相应的非线性变换。
多层的线性层非线性化然后进行任意组合
变换的维度和层数决定了网络的复杂程度,具体值取什么比较好,这就是典型的超参数搜索问题。
一般来说隐层的数量越多,神经元越多,对非线性的变换就学习的越强。
不是学习能力越强越好。
学习能力太强会把输入数据中的噪声的规律也给学会,这个噪声和应用场景中的噪声是不一样的,因此要学习的东西是数据真值本身的规律。
学习能力必须要有泛化的能力才是最好的。
1、读文档能力
2、基本的架构理解(cpu、主机、编译原理等)
(核心能力)
我们需要的是能抓住问题核心的模型,不要学习能力太强(连噪声都不放过)的模型
举例:
Y:表示一年后这个人的糖尿病病情是否会加重
这种预测也会发生在保险业
N卡GPU中只支持32位float的数据,比较贵的显卡如特斯拉系列的显卡才支持双精度的数据格式。
:-1
:表示最后一列元素不要
[-1]:拿出最后一列,写中括号是为了是一个矩阵,直接写-1,出来的是一个向量
这个会出来两个Tensor
修改激活函数,只需要改变下面两个位置就可以了
代码:
import numpy as np
import torch
import matplotlib.pyplot as plt
# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1]) # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = torch.from_numpy(xy[:, [-1]]) # [-1] 最后得到的是个矩阵
# design model using class
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8, 6) # 输入数据x的特征是8维,x有8个特征
self.linear2 = torch.nn.Linear(6, 4)
self.linear3 = torch.nn.Linear(4, 1)
self.sigmoid = torch.nn.Sigmoid() # 将其看作是网络的一层,而不是简单的函数使用
def forward(self, x):
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x)) # y hat
return x
model = Model()
# construct loss and optimizer
# criterion = torch.nn.BCELoss(size_average = True)
# criterion = torch.nn.BCELoss(reduction='mean')
criterion = torch.nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(100000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss.item())
epoch_list.append(epoch)
loss_list.append(loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()
100epoch:
1000epoch:
10000epoch:
100000epoch: