网站移动端自适应,宁德市医院东侨院区,宁波网站建设 慕枫科技,大连网站制作代理价格DNN概述
深度神经网络DNN来自人脑神经元工作的原理#xff0c;通过在计算机中逻辑抽象出多个节点#xff0c;接收处理并向后传递信息#xff0c;实现计算机的自我学习#xff0c;类比结构见下图#xff1a; 该方法通过预测输出与实际值的差异不断调整节点参数#xff0…DNN概述
深度神经网络DNN来自人脑神经元工作的原理通过在计算机中逻辑抽象出多个节点接收处理并向后传递信息实现计算机的自我学习类比结构见下图 该方法通过预测输出与实际值的差异不断调整节点参数从而一步步调整整体预测效果节点预测输出的过程称为前向传播根据差异调整参数的过程称为反向传播而又因为节点计算公式ywxb为线性的如果每个节点都向后传递该值那最终的输出也可以表示为wxb故要体现每个节点的特殊性需要引入非线性处理即激活函数根据在该过程中对学习率步长的设置调整、更新参数依靠样本的选择等区别产生了多种不同的优化算法。
一般的机器学习流程如下图
DNN网络训练
首先导入一般需要的包
import torch.nn as nn
import torch
import pandas as pd
import numpy as np所有参数和模型的文档都可以在官网查看查找前记得在选项中选择自己使用pytorch的版本
数据集导入
大致流程为 1使用pandas从文件中读取数据 2将带标签的数据退化为数组并转换类型 3将数组转换为张量 4数据搬到显卡上进行加速
代码分别如下
dfpd.read_csv(文件路径)
arrdf.values.astype(np.float32)
tstorch.tensor(arr)
tsts.to(cuda)划分训练集与测试集
首先根据比例划分训练集与测试集大小为了避免数据前后关联最好打乱样本的顺序然后分别按行读取样本到数据集集合中代码如下
tran_sizeint(len(ts)*0.8) # 训练集大小0.8为比例系数
test_sizelen(ts)-tran_size # 测试集大小
tsts[torch.randperm(ts.size(0)),:] # 打乱数据
train_datats[:tran_size] # 训练集数据
test_datats[tran_size:] # 测试集数据搭建网络
根据输入和输出特征搭建网络需注意相邻网络的输入输出需对应网络需继承nn.Module模块继承后重写网络模型到初始化函数中定义向前传播forward调用网络并返回预测示例代码如下
class DNN(nn.Module):def __init__(self):super(DNN, self).__init__() # 初始化父类self.network nn.Sequential(nn.Linear(28*28, 512), # 第一层线性层nn.ReLU(), # 第一层激活函数nn.Linear(512, 1024), # 第二层线性层nn.Sigmoid(), # 第二层激活函数)def forward(self, x):x self.network(x) # 第三层无激活函数return xDNNDNN() # 创建网络对象实例优化器算法
首先定义损失函数loss_fn具体的选项见官方文档然后设置学习速率learning_rate和optimizer优化器通过torch.optim设置优化算法示例代码如下
loss_fnnn.MSELoss()
learning_rate0.001
optimizertorch.optim.Adam(DNN.parameters(), lrlearning_rate)训练网络
网络的训练往往要经过多次循环所以通常先设置一个epochs循环次数为了将学习成果可视化一般也设置一个列表用于存储损失函数的变化过程然后对数据的输入输出特征进行划分将数据除最后一列的值作为输入最后一列的值升级为二维作为输出代码如下
epochs100
loss_list[]xtrain_data[: , : -1] # 取出所有行除最后一列的所有列
ytrain_data[: , -1].reshape((-1,1)) # 取出所有行最后一列,升级为二维最后在循环中计算前向传播预测值使用损失函数计算损失反向传播计算梯度优化模型参数最后清空梯度示例代码如下
for epoch in range(epochs):y_predDNN(x)lossloss_fn(y_pred, y)loss.backward() # 反向传播optimizer.step() # 更新参数optimizer.zero_grad() # 清空梯度缓存print(fEpoch: {epoch}, Loss:{loss}) # 打印当前epoch和损失值loss_list.append(loss.item()) # 将损失值添加到列表中测试方法为首先声明关闭梯度计算功能将预测值与真实值进行比较统计正确信息示例代码如下
with torch.no_grad(): # 关闭自动求导功能test_xtest_data[: , : -1]test_ytest_data[: , -1].reshape((-1,1))pred_yDNN(test_x)制作数据集DataSet
前面我们使用的是批量梯度下降每次参数更新使用所有样本为了提高训练效率我们在实践中多使用小批量梯度下降这要求我们分批加载数据加上我们为了复用代码和更好地管理数据数据集应该也使用框架管理起来该功能可以借助DataSet实现。
我们的数据集必须继承DataSet类同时要重写__init__加载数据集、__getitem__获取数据索引和__len__获取数总量方法示例代码如下
from torch.utils.data import Dataset, DataLoaderclass Data(Dataset):def __init__(selffilename): # 根据文件路径加载数据集super(Data, self).__init__()df pd.read_csv(filename)arr df.values.astype(np.float32)ts torch.tensor(arr)ts ts.to(cuda)tran_sizeint(len(ts)*0.8)tsts[torch.randperm(ts.size(0)),:]self.xts[:tran_size,:-1]self.yts[:tran_size,-1].reshape((-1,1))self.xlengthlen(self.x)self.ylengthlen(self.y)def __getitem__(self, index):return self.x[index], self.y[index]def __len__(self):return self.xlength,self.ylength加载数据集时使用DataData(路径)创建数据集对象train_size,test_size len(dataset)读取文件长度使用train_loaderDataLoader(dataset,batch_size100,shuffleTrue)和test_loaderDataLoader(dataset,batch_size100,shuffleFalse)分别读取训练集和测试集shuffle表示是否洗牌训练集可用测试集无需洗牌。
使用该方法加载数据集训练测试时直接可用for (x,y) in train_loader循环因为其中已经包含了两个元素代码更简洁。
CNN卷积神经网络
该网络顺应机器学习的图像处理潮流而生传统神经网络需要将图像展为一列该方式会忽略图像原本二维排布时的关系更不必说如今的彩色图像可能有多个通道传统方法更无法处理基于保留临近位置像素点关系的想法产生了卷积神经网络。
卷积核
该方法本质上是神经网络的变形只是其表现形式有所区别原本的权重w变成了卷积核图像像素与卷积核逐位相乘求和再进行偏置计算原本的激活函数此时变成了池化层pool直观展示如下 构建网络时使用nn.Conv2d(输入通道数输出通道卷积核大小填充步长)来添加卷积层由于卷积核的数值也是训练的一部分故无需手动设置由随机初始化完成使用示例如下
model nn.Sequential(nn.Conv2d(1,20,5),nn.ReLU(),nn.Conv2d(20,64,5),nn.ReLU())其他卷积层见官方文档。
池化层
该层功能与激活函数类似用于获取特征比如选出最大值求平均等操作如nn.MaxPool1d()详见官方文档可惜是英文的而且信息量太大每个函数都值得学一会。
输出尺寸计算
此外为了使图像与卷积核大小相符增加了填充padding和卷积核的移动步长stride现在整合所有参数输入图像尺寸(H,W)卷积核大小(FH,FW)填充p步幅s输出图像大小(OH,OW)的计算方法如下
滤波器
彩色图像等多通道时使用相应通道数的卷积核即可但此时卷积核又有了新的名字——滤波器Filter即输入数据与滤波器通道设置为相同的值时输出仍为一维输出时再使用滤波器即可实现升维。
经典网络
LeNet-5 AlexNet GoogLeNet ResNet
答疑—清空梯度
上次模型构建我们讨论了反向传播的具体作用这次我又对清空梯度这步有了疑问每个epoch梯度清空那是否i多次实验彼此独立又如何收敛呢经过查询得出如下结论。
首先重申清空的是梯度而非模型参数pytorch默认使用的是梯度累加的方法即多次训练的梯度累加计算并允许手动清零该方式允许硬件条件不允许的项目使用小的batch_size多次循环累加梯度可以实现较好的效果而我们手动清零后可以避免多个数据集对模型参数优化的影响实现全新的二次训练。
总结
本次算是初学pytorch的第二次实践对于一些方法和原理有了更进一步的理解 清空梯度避免干扰小批量时可不清空 继承方法建立模型和数据集 卷积核用于保存图像空间上的相邻关系池化层选特征 多通道用滤波器降维学习后再升维。
至此觉得可以算是入门了但仍然路漫漫学习网络模型结构的搭建各种优化算法和损失函数池化操作步长卷积核大小的设置这些的工作才是大头此外将深度学习与什么相结合这更是关键。