




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
掌握构造DataLoader掌握构造多层感知机掌握构造卷积神经网络掌握构造循环神经网络掌握训练深度学习模型掌握使用深度模型预测样本参考书目《机器学习技术任务驱动式教程》基于深度学习的分类预测模块10机器学习技术目录多层感知机预测糖尿病CNN识别图像时间戳循环神经网络预测国际旅行客流量小结习题十基于深度学习的分类预测模块10机器学习技术本任务使用PinaIndians糖尿病发病情况数据集,样本来自国家糖尿病、消化和肾脏疾病研究所。特别是,这里的所有病人都是至少21岁的皮马印第安人血统的女性。这个数据集描述了PimaIndians的患者医疗记录数据,以及他们是否在五年内发生糖尿病。数据集包括几个医学预测变量和一个目标变量,即结果。预测变量包括怀孕次数、体重指数、胰岛素水平、年龄等。详细的字段描述见下表。1.1任务描述1.多层感知机预测糖尿病1.1任务描述构造训练多层感知机,训练模型拟合数据集样本,并可视化训练过程中模型性能的变化。任务目标字段类型允许为空标签?例子怀孕次数int否否62小时口服葡萄糖耐量试验中血浆葡萄糖浓度int否否148舒张压int否否72三头肌皮褶皱厚度int否否352小时血清胰岛素
int否否0身体质量指数float否否33.6糖尿病谱系功能float否否0.627年龄int否否50是否患糖尿病int否否0:否,1:是1.多层感知机预测糖尿病1.2
任务分解import方式引入依赖的模块文件读入DataFrame,抽样检查样本值和数据分布数据封装成PyTorch库的DataLoader对象依赖库导入数据观察数据转换从探查数据内容开始,经过数据转换和数据集分离,定义多层感知机,迭代训练网络模型拟合数据集样本,可视化训练过程中训练性能和测试性能变化。1.多层感知机预测糖尿病1.2
任务分解定义一个包含2个隐藏层和1个输出层的多层感知机采用反向传播方式,更新各层的梯度值,找到模型的最优或次优参数模型构建模型训练接上可视化模型在2个数据集上的准确率变化训练过程可视化1.多层感知机预测糖尿病1.3
任务实施1.3.1依赖库导入步骤1:定义2级标题。##<fontcolor="black">依赖库导入</font>按“SHIFT+Enter”,运行结果如下:使用PyTorch深度学习框架实施模型创建和训练,支持在强大GPU上运行矩阵运算,也支持反向传播过程中的自动求导功能。1.多层感知机预测糖尿病1.3
任务实施步骤2:导入依赖库。importnumpyasnpimportpandasaspdfrommatplotlibimportpyplotaspltimportmatplotlibasmplfromtorchimportnnfromsklearn.model_selectionimporttrain_test_splitfromtorch.utils.dataimportTensorDataset,DataLoaderimporttorch1.多层感知机预测糖尿病1.3
任务实施1.3.2数据观察文件读入DataFrame对象后,需要观察属性值和数据分布。步骤1:定义2级标题。##<fontcolor="black">数据观察</font>按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病1.3
任务实施步骤2:把数据从文件读入DataFrame对象。df=pd.read_csv("../data/pima-indians-diabetes.csv",header=0)df.shape按“SHIFT+Enter”,运行结果如下:步骤3:查看头5条记录。df.head()1.多层感知机预测糖尿病1.3
任务实施按“SHIFT+Enter”,运行结果如下:步骤4:查看各字段的统计特征。df.describe()1.多层感知机预测糖尿病1.3
任务实施按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病1.3
任务实施1.3.3数据转换步骤1:定义2级标题。##<fontcolor="black">数据转换</font>按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病1.3
任务实施步骤2:DataFrame对象转换到Numpy类型。X=df.iloc[:,:-1].valuesy=df.iloc[:,-1].values.reshape(-1,1)X.shape,y.shape按“SHIFT+Enter”,运行结果如下:Series对象的values方法返回是1维Numpy对象。PyTorch训练时要求输入和标签都至少2维,因此使用reshape方法转换到2维的Numpy对象作为标签。1.多层感知机预测糖尿病1.3
任务实施步骤3:数据集切分为2部分:训练集和测试集,测试集占20%。X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)X_train.shape,X_test.shape,y_train.shape,y_test.shape按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病1.3
任务实施步骤4:把训练集封装为DataLoader。train_data=TensorDataset(torch.Tensor(X_train),torch.Tensor(y_train))train_dataloader=DataLoader(train_data,batch_size=10,shuffle=True)test_data=TensorDataset(torch.Tensor(X_test),torch.Tensor(y_test))test_dataloader=DataLoader(test_data,batch_size=10,shuffle=True)在处理大数据集时,一次将整个数据加载到内存中变得非常难,DataLoader将数据分批加载到内存中,一次读入少量数据。DataLoader初始化时一般要设置batch_size控制每个批次的样本数量;shuffle设置是否随机抽取样本。1.多层感知机预测糖尿病1.3
任务实施1.3.4模型构建步骤1:定义2级标题。##<fontcolor="black">模型构建</font>按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病1.3
任务实施步骤2:定义一个简单的多层感知机类,激化函数使用ReLU,输出层使用Sigmoid函数计算糖尿病的概率。classNeuralNetwork(nn.Module):
def__init__(self):
super().__init__() self.flatten=nn.Flatten() self.linear_relu_stack=nn.Sequential(
nn.Linear(8,16),#全连接层
nn.ReLU(),#激活层1.多层感知机预测糖尿病1.3
任务实施 nn.Linear(16,8),#全连接层
nn.ReLU(),#激活层
nn.Linear(8,1),#输出层
nn.Sigmoid())defforward(self,x):
x=self.flatten(x)
logits=self.linear_relu_stack(x)
returnlogits接上1.多层感知机预测糖尿病激活函数隐藏层和输出层的神经元通过激活函数(ActivationFunction),将输入端的加权和转换成神经元输出值。在没有激活函数的作用下,无论怎么调整网络参数,输出值仍为线性,因此一般激活函数都是非线性的。常用的激活函数有:
监督学习性能指标
监督学习性能指标
1.3
任务实施步骤3:创建多层感知机。model=NeuralNetwork()model按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病多层感知机多层感知机(MultilayerPerceptron,MLP)是一种基于前馈神经网络的结构,由输入层、隐藏层和输出层组成,其中隐藏层可以有多层。每一层的神经元与相邻层的神经元相连,通过不断调整神经元之间的权重,实现对复杂问题的学习和预测。它是一种前向反馈网络,具有强大的处理能力和表达能力,广泛应用于分类、回归、识别等各种任务中。单隐藏层的多层感知机如下图所示:1.3
任务实施1.3.5模型训练步骤1:定义2级标题。##<fontcolor="black">模型训练</font>按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病步骤2:定义函数封装在训练数据集上训练1代的过程。deftrain(dataloader,model,loss_fn,optimizer): size=len(dataloader.dataset)1.3
任务实施 model.train()#设置模型在训练状态 forbatch,(X,y)inenumerate(dataloader): pred=model(X)#正向传播
loss=loss_fn(pred,y)#计算损失
loss.backward()#反向传播 optimizer.step()#根据当前参数值和梯度更新参数值 optimizer.zero_grad()#参数偏导设置为0
ifbatch%10==0:
loss,current=loss.item(),(batch+1)*len(X) print(f"loss:{loss:>7f}[{current:>5d}/{size:>5d}]")1.多层感知机预测糖尿病1.3
任务实施1.多层感知机预测糖尿病步骤3:定义函数封装测试过程。deftest(dataloader,model,loss_fn):
size=len(dataloader.dataset)
num_batches=len(dataloader)
model.eval()
test_loss,correct=0,0
withtorch.no_grad():#测试过程不涉及梯度计算
forX,yindataloader:
pred=model(X)
1.3
任务实施 test_loss+=loss_fn(pred,y).item()#缩进三层
correct+=((pred>=0.5)==y).type(torch.float).sum().item()acc=correct/sizereturnacc,test_loss/num_batches1.多层感知机预测糖尿病步骤4:使用BCELoss损失函数评价预测值和真实值之间的差距。loss_fn=nn.BCELoss()模型状态转换model.train()改变模型到训练状态,model.eval()改变模型到测试状态,2个状态转换函数主要是对BN层和Dropout层有影响。BN层执行model.train()之后,BN层对之后输入的每个batch独立计算其均值和方差,BN层的参数不断发生变化。训练过程中每个batch的μ和σ都保存下来,然后加权平均当做整个训练数据集的μ和σ用于测试。执行model.eval()之后,BN层使用统计的μ和σ做测试,不再发生变化。
Dropout层执行model.train()后,忽略一些神经元。执行model.train()后,使用所有神经元。激活函数损失函数就是用来度量模型的预测值与真实值的差距,损失函数越小,模型的鲁棒性就越好。每个批次的训练数据送入模型后,通过前向传播输出预测值,然后损失函数会计算出预测值和真实值之间的差距,也就是损失值。得到损失值之后,模型通过反向传播去更新各个参数,来降低真实值与预测值之间的损失,使得模型生成的预测值往真实值方向靠拢,从而达到学习的目的。常用的损失函数有:
监督学习性能指标
优化器优化器是深度学习中用于优化神经网络模型的一类算法,其主要作用是根据模型的损失函数来调整模型的参数,使得模型能够更好地拟合训练数据,提高模型的性能和泛化能力。优化器在训练过程中通过不断更新模型的参数,使模型逐步接近最优解。常用的优化器有:随机梯度下降(SGD)RMSpropAdamAdaGrad1.3
任务实施步骤5:使用Adam优化器更新模型权重。optimizer=torch.optim.Adam(model.parameters(),lr=1e-3)1.多层感知机预测糖尿病步骤6:迭代更新网络模型权重,达到模型拟合训练样本的效果。epochs=20train_accs=[]test_accs=[]按“SHIFT+Enter”,检查输出无异常。1.3
任务实施1.多层感知机预测糖尿病fortinrange(epochs): print(f"Epoch{t+1}\n--------------------") train(train_dataloader,model,loss_fn,optimizer) acc,one_loss=test(train_dataloader,model,loss_fn) print(f"训练:\n准确率:{(100*acc):>0.1f}%,损失:{one_loss:>8f}") train_accs.append(acc) acc,one_loss=test(test_dataloader,model,loss_fn) print(f"测试:\n准确率:{(100*acc):>0.1f}%,损失:{one_loss:>8f}") test_accs.append(acc)1.3
任务实施按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病……1.3
任务实施1.3.6训练过程可视化步骤1:定义2级标题。##<fontcolor="black">训练过程可视化</font>按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病步骤2:设置Matplotlib正常显示中文字体和减号。mpl.rcParams["font.sans-serif"]=["SimHei"]mpl.rcParams["axes.unicode_minus"]=False1.3
任务实施步骤3:可视化训练过程。plt.plot(range(1,epochs+1),train_accs,color="blue",label="训练准确率")plt.plot(range(1,epochs+1),test_accs,color="green",label="测试准确率")plt.xlabel("代")plt.xticks(range(1,epochs+1))plt.legend(loc=0)plt.title("训练过程")plt.show()1.多层感知机预测糖尿病1.3
任务实施按“SHIFT+Enter”,运行结果如下:1.多层感知机预测糖尿病监控照片的左上方有拍摄时间(时间戳),要求识别出时间戳中的年/月/日/时/分/秒。训练用的数据集包含0~9的手写数字,每个字母3个样本。2.1任务描述2.CNN识别图像时间戳2.1任务描述基于上图的图片数据集样本,建立和训练CNN模型,使用模型识别监控照片中的年/月/日/时/分/秒。任务目标2.CNN识别图像时间戳2.2
任务分解import方式引入依赖的模块图片目录封装为DataLoader创建包含卷积层、池化层、全连接层和Softmax层的CNN模型依赖库导入数据转换模型构建把目标目录下的图片样本封装为DataLoader,构建CNN模型后多次训练使得模型拟合图片数据集,然后应用该模型识别监控图片中的数字。2.CNN识别图像时间戳2.2
任务分解采用反向传播方式更新各层的梯度值,找到CNN模型的最优或次优参数模型训练接上CNN模型识别监控图片的时间戳时间戳识别2.CNN识别图像时间戳2.3
任务实施2.3.1依赖库导入步骤1:定义2级标题。##<fontcolor="black">依赖库导入</font>按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳2.3
任务实施步骤2:导入依赖库。fromtorch.utils.dataimportDataset,DataLoaderfromtorchvisionimporttransforms,datasetsfrommatplotlibimportpyplotaspltimporttorchfromtorchimportnnimportnumpyasnp2.CNN识别图像时间戳2.3
任务实施2.3.2数据转换步骤1:定义2级标题。##<fontcolor="black">数据转换</font>按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳2.3
任务实施步骤2:构建变换列表作为转换通道。transforms_train=transforms.Compose([
transforms.Grayscale(),#转到灰度图 transforms.ToTensor()#转到Tensor类型,值变换到[0,1] ])2.CNN识别图像时间戳按“SHIFT+Enter”,检查输出无异常。2.3
任务实施步骤3:从目标目录建立图片数据集。2.CNN识别图像时间戳ds_train=datasets.ImageFolder("../data/image/digit/",transform=transforms_train,target_transform=lambdat:torch.tensor([t]))print(ds_train)print(ds_train.classes)按“SHIFT+Enter”,运行结果如下:2.3
任务实施2.CNN识别图像时间戳步骤4:通过DataLoader加载ImageFolder。这里的num_workers为了避免出错,尽量设置为0。train_dataloader=DataLoader(ds_train,batch_size=2,shuffle=True,num_workers=0)按“SHIFT+Enter”,检查输出无异常。2.3
任务实施步骤5:抽样检查样本。2.CNN识别图像时间戳plt.figure(figsize=(5,5))foriinrange(9):
img,label=ds_train[i]
print(img.shape)#图像是c*w*h->w*h*c
img=img.permute(1,2,0)
ax=plt.subplot(3,3,i+1)
ax.imshow(img.numpy())2.3
任务实施2.CNN识别图像时间戳 ax.set_title("label=%d"%label.item(),fontsize=8) ax.set_xticks([]) ax.set_yticks([])plt.show()接上按“SHIFT+Enter”,运行结果如下:2.3
任务实施2.CNN识别图像时间戳2.3
任务实施2.3.3模型构建步骤1:定义2级标题。##<fontcolor="black">模型构建</font>按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳2.3
任务实施步骤2:定义CNN(卷积神经网络),输出概率向量。classImageNet(nn.Module):
def__init__(self):
super(ImageNet,self).__init__() self.conv1=nn.Conv2d(in_channels=1,out_channels=32,kernel_size=3,padding=1) self.relu1=nn.ReLU()
self.pool1=nn.MaxPool2d(kernel_size=2,stride=2)
self.conv2=nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,padding=1) self.relu2=nn.ReLU() self.pool2=nn.MaxPool2d(kernel_size=2,stride=2)2.CNN识别图像时间戳2.3
任务实施
self.conv3=nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,padding=1)self.relu3=nn.ReLU()self.pool3=nn.MaxPool2d(kernel_size=2,stride=2)self.flatten=nn.Flatten()self.fc1=nn.Linear(4096,512)self.relu4=nn.ReLU()
self.fc2=nn.Linear(512,10)
self.softmax=nn.Softmax(dim=-1)#对最后1列执行Softmax操作2.CNN识别图像时间戳2.3
任务实施defforward(self,x): x=self.conv1(x) x=self.relu1(x) x=self.pool1(x)
x=self.conv2(x)
x=self.relu2(x)
x=self.pool2(x) x=self.conv3(x) x=self.relu3(x)
2.CNN识别图像时间戳2.3
任务实施
x=self.pool3(x)
x=self.flatten(x)
x=self.fc1(x)
x=self.relu4(x)
x=self.fc2(x)
x=self.softmax(x)
returnx2.CNN识别图像时间戳按“SHIFT+Enter”,检查输出无异常。卷积神经网络多卷积神经网络(ConvolutionalNeuralNetwork,CNN)是一种特殊的人工神经网络结构,它在图像识别、语音识别、自然语言处理等领域有着广泛的应用。CNN的特点在于其能够自动提取输入数据的特征,从而实现对输入数据的高效分类和识别。CNN结构如下图所示:卷积神经网络CNN的关键组件有:卷积层(ConvolutionalLayer):卷积层是CNN的核心组件之一,它通过卷积运算对输入数据进行特征提取。卷积运算是一种数学运算,通过在输入数据上滑动一个卷积核(也称为滤波器),并计算卷积核与输入数据的局部区域的点积,从而生成新的特征图。池化层(PoolingLayer):池化层用于降低特征图的维度,从而减少计算量。常见的池化操作有最大池化(MaxPooling)和平均池化(AveragePooling)。全连接层(FullyConnectedLayer,FC):全连接层是传统神经网络中的标准层,它将卷积层和池化层提取的特征进行整合,并通过激活函数进行非线性变换。输出层:将全连接层得到的一维向量经过计算后得到识别值的一个概率。2.3
任务实施步骤3:创建ImageNet模型。net=ImageNet()net按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳2.3
任务实施步骤3:创建ImageNet模型。net=ImageNet()net按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳2.3
任务实施2.3.4模型训练步骤1:定义2级标题。##<fontcolor="black">模型训练</font>按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳2.3
任务实施步骤2:使用交叉熵损失函数评价预测值和真实值之间的差距。loss_fn=nn.CrossEntropyLoss()2.CNN识别图像时间戳按“SHIFT+Enter”,检查输出无异常。步骤3:使用Adam优化器更新参数。optimizer=torch.optim.Adam(net.parameters(),lr=1e-3)按“SHIFT+Enter”,检查输出无异常。2.3
任务实施步骤4:定义函数封装训练1代过程。deftrain(dataloader,model,loss_fn,optimizer):'''使用一次数据集训练模型'''size=len(dataloader.dataset)train_loss=0train_acc=0model.train()forbatch,(X,y)inenumerate(dataloader):#做一次正向传播和反向传播2.CNN识别图像时间戳2.3
任务实施pred=model(X)#正向传播y=y.squeeze()#去除维数为1的的维度
loss=loss_fn(pred,y)#计算损失
loss.backward()#反向传播,计算梯度
optimizer.step()#根据当前参数值和梯度更新参数值
optimizer.zero_grad()#梯度置零
#记录误差
train_loss=loss.item()2.CNN识别图像时间戳2.3
任务实施
#计算分类的准确率out_t=pred.argmax(dim=1)#取输出向量元素最大值的索引num_correct=(out_t==y).sum().item()
train_acc+=num_correct/len(X)
ifbatch%5==0:
current=(batch+1)*len(X)
print(f"损失:{train_loss/len(X):>7f}[{current:>5d}/{size:>5d}]")print(f"准确率:{train_acc/len(dataloader):>7f}")returnmodel2.CNN识别图像时间戳2.3
任务实施步骤5:迭代在数据集上训练,更新模型参数。epochs=20fortinrange(epochs):print(f"Epoch{t+1}\n-----------")model=train(train_dataloader,net,loss_fn,optimizer)2.CNN识别图像时间戳按“SHIFT+Enter”,运行结果如下:1.3
任务实施1.多层感知机预测糖尿病…步骤6:保存模型参数到硬盘,包括权重和偏置。torch.save(model.state_dict(),'net_params.pth')按“SHIFT+Enter”,当前目录看到文件”net_params.pth”。2.3
任务实施时间戳识别是在单独程序运行,需要重新导入依赖库,加载模型到内存。2.3.5时间戳识别步骤1:定义2级标题。##<fontcolor="black">依赖库导入</font>按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳2.3
任务实施步骤2:导入依赖库。importtorchfromtorchimportnnimportnumpyasnpfromPILimportImagefrommatplotlibimportpyplotasplt2.CNN识别图像时间戳按“SHIFT+Enter”,检查输出无异常。2.3
任务实施步骤3:定义2级标题。##<fontcolor=“black”>模型加载</font>按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳2.3
任务实施步骤4:定义ImageNet模型。classImageNet(nn.Module):
def__init__(self):
super(ImageNet,self).__init__() self.conv1=nn.Conv2d(in_channels=1,out_channels=32,kernel_size=3,padding=1) self.relu1=nn.ReLU()
self.pool1=nn.MaxPool2d(kernel_size=2,stride=2)
self.conv2=nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,padding=1) self.relu2=nn.ReLU() self.pool2=nn.MaxPool2d(kernel_size=2,stride=2)2.CNN识别图像时间戳2.3
任务实施
self.conv3=nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,padding=1)self.relu3=nn.ReLU()self.pool3=nn.MaxPool2d(kernel_size=2,stride=2)self.flatten=nn.Flatten()self.fc1=nn.Linear(4096,512)self.relu4=nn.ReLU()
self.fc2=nn.Linear(512,10)
self.softmax=nn.Softmax(dim=-1)#对最后1列执行Softmax操作2.CNN识别图像时间戳2.3
任务实施defforward(self,x): x=self.conv1(x) x=self.relu1(x) x=self.pool1(x)
x=self.conv2(x)
x=self.relu2(x)
x=self.pool2(x) x=self.conv3(x) x=self.relu3(x)
2.CNN识别图像时间戳2.3
任务实施
x=self.pool3(x)
x=self.flatten(x)
x=self.fc1(x)
x=self.relu4(x)
x=self.fc2(x)
x=self.softmax(x)
returnx2.CNN识别图像时间戳按“SHIFT+Enter”,检查输出无异常。2.3
任务实施步骤5:创建网络模型,此时参数是随机的。model=ImageNet()2.CNN识别图像时间戳按“SHIFT+Enter”,检查输出无异常。步骤6:把文件保存的模型状态加载到模型,模型参数恢复到训练状态。state_dict=torch.load('net_params.pth')model.load_state_dict(state_dict)按“SHIFT+Enter”,检查输出无异常。2.3
任务实施步骤7:定义2级标题。##<fontcolor=“black”>时间戳识别</font>按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳步骤8:查看原图的灰色模式。ori_pix=Image.open("../data/image/sample/frame_det_00_000001.jpg").convert("L")plt.imshow(ori_pix)2.3
任务实施按“SHIFT+Enter”,运行结果如下:2.CNN识别图像时间戳2.3
任务实施步骤9:读取视频图片的数字区域。ori_pix=np.array(ori_pix)test=[]parts=np.loadtxt("../data/timestamp.txt",delimiter=',',dtype=int)forpartinparts:
img_part=ori_pix[part[0]:part[1],part[2]:part[3]]img_part=img_part/255
test.append(img_part)2.CNN识别图像时间戳按“SHIFT+Enter”,检查输出无异常。2.3
任务实施步骤10:转换图片到模型输入格式。test=np.array(test).reshape(14,1,64,32)2.CNN识别图像时间戳按“SHIFT+Enter”,检查输出无异常。步骤11:模型输出one-shot格式的时间。pred=model(torch.tensor(test).float())pred.shape按“SHIFT+Enter”,运行结果如下:2.3
任务实施步骤12:识别图像包含的年/月/日/时/分/秒。test=np.array(test).reshape(14,1,64,32)2.CNN识别图像时间戳按“SHIFT+Enter”,运行结果如下:从识别结果看出,CNN模型完全可以识别时间戳中的数字。国际旅行旅客人数数据集记录12年的每月国际航班旅客客流量。数据从1949年到1960年共12年,每年12个月的数据,一共144个记录。要求从过去的客流量预测未来的客流量。3.1任务描述3.循环神经网络预测国际旅行客流量基于international-airline-passengers.csv,建立和训练神经网络模型,并可视化模型在训练集和测试集上的性能。任务目标3.2
任务分解import方式引入依赖的模块文件读入DataFrame,检查机场的国际旅客客流量发展态势数据转换到[0,1],封装成PyTorch库的DataLoader对象依赖库导入数据观察数据转换观察客流量变化态势,经过数据转换后分离数据集,训练数据集和测试数据集封装为DataLoader,构建LSTM循环神经网络模型,在训练数据集上多次训练,并可视化模型性能。3.循环神经网络预测国际旅行客流量3.2
任务分解定义一个包含1个LSTM层和1个输出层的循环神经网络采用反向传播方式,更新各层的梯度值,找到模型的最优或次优参数模型构建模型训练接上可视化观察模型性能训练过程可视化3.循环神经网络预测国际旅行客流量3.3
任务实施3.3.1依赖库导入步骤1:定义2级标题。##<fontcolor="black">依赖库导入</font>按“SHIFT+Enter”,运行结果如下:步骤2:导入依赖库。importmatplotlibasmplimportmatplotlib.pyplotasplt3.循环神经网络预测国际旅行客流量1.3
任务实施importnumpyasnpimportpandasaspdimporttorchimporttorch.nnasnnimporttorch.optimasoptimimporttorch.utils.dataasdatafromsklearn.preprocessingimportMinMaxScaler接上按“SHIFT+Enter”,检查输出无异常。3.循环神经网络预测国际旅行客流量3.3
任务实施3.3.2数据探查步骤1:定义2级标题。##<fontcolor="black">数据探查</font>按“SHIFT+Enter”,运行结果如下:3.循环神经网络预测国际旅行客流量3.3
任务实施步骤2:从文件读入数据到DataFrame对象。'''usecols=[1]:选择第1列skipfooter=3:忽略文件最后三行engine="python":避免警告提示'''data_csv=pd.read_csv("../data/international-airline-passengers.csv",usecols=[1],skipfooter=3,engine="python")data_csv.shape按“SHIFT+Enter”,运行结果如下:3.循环神经网络预测国际旅行客流量3.3
任务实施步骤3:查看最后5条记录,确认skipfooter=3是否生效。data_csv.tail()按“SHIFT+Enter”,运行结果如下:3.循环神经网络预测国际旅行客流量3.3
任务实施3.循环神经网络预测国际旅行客流量步骤4:设置Matplotlib正常显示中文字体和减号。mpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=False按“SHIFT+Enter”,检查输出无异常。步骤5:可视化机场国际旅客客流量变化态势。plt.plot(data_csv)plt.ylabel("旅客数量/月")3.3
任务实施按“SHIFT+Enter”,运行结果如下:3.循环神经网络预测国际旅行客流量客流量每3~4个月一个周期,整体趋势向上。3.3
任务实施3.3.3数据转换步骤1:定义2级标题。##<fontcolor="black">数据转换</font>按“SHIFT+Enter”,运行结果如下:3.循环神经网络预测国际旅行客流量3.3
任务实施步骤2:整型数转换到float类型。timeseries=data_csv.values.astype('float32')3.循环神经网络预测国际旅行客流量按“SHIFT+Enter”,检查输出无异常。步骤3:特征值转换到[0,1]区间。scaler=MinMaxScaler()timeseries=scaler.fit_transform(timeseries)min(timeseries),max(timeseries)3.3
任务实施步骤4:切分为训练集和测试集,测试集占1/3。train_size=int(len(timeseries)*0.67)test_size=len(timeseries)-train_sizetrain,test=timeseries[:train_size],timeseries[train_size:]3.循环神经网络预测国际旅行客流量按“SHIFT+Enter”,检查输出无异常。3.3
任务实施3.循环神经网络预测国际旅行客流量defcreate_dataset(dataset,lookback):"""转换时间序列到数据集
Args:dataset:时间序列,第1维是时间步lookback:窗口大小"""
X,y=[],[]
foriinrange(len(dataset)-lookback):
feature=dataset[i:i+lookback]步骤5:定义函数封装数据到PyTorch的Tensor对象。3.3
任务实施3.循环神经网络预测国际旅行客流量target=dataset[i+1:i+lookback+1]
X.append(feature)
y.append(target)
returntorch.tensor(np.array(X)),torch.tensor(np.array(y))接上步骤6:构造特征和标签。lookback=1X_train,y_train=create_dataset(train,lookback=lookback)X_test,y_test=create_dataset(test,lookback=lookback)3.3
任务实施步骤7:使用DataLoader封装数据。loader=data.DataLoader(data.TensorDataset(X_train,y_train),shuffle=True,batch_size=8)3.循环神经网络预测国际旅行客流量按“SHIFT+Enter”,检查输出无异常。按“SHIFT+Enter”,检查输出无异常。在PC上运行程序时,batch_size不宜太大,避免由于内存不足造成系统崩溃。3.3
任务实施3.3.4模型构建步骤1:定义2级标题。##<fontcolor="black">模型构建</font>按“SHIFT+Enter”,运行结果如下:3.循环神经网络预测国际旅行客流量3.3
任务实施步骤2:AirModel类定义使用LSTM层的循环神经网络,输出层输出客流量。classAirModel(nn.Module):
def__init__(self):
super().__init__()
self.lstm=nn.LSTM(input_size=1,hidden_size=50,num_layers=1,batch_first=True)
self.linear=nn.Linear(50,1)
3.循环神经网络预测国际旅行客流量3.3
任务实施3.循环神经网络预测国际旅行客流量
defforward(self,x):x,_=self.lstm(x)x=self.linear(x)returnx接上长短期记忆神经网络长短期记忆神经网络(LongShort-TermMemory,LSTM)是一种特殊的循环神经网络(RecurrentNeuralNetwork,RNN)。LSTM通过输入门、遗忘门、输出门引入sigmoid函数并结合tanh函数,添加求和操作,减少梯度消失和梯度爆炸的可能性。LSTM既能够处理短期依赖问题,又能够处理长期依赖问题。LSTM结构如下图:长短期记忆神经网络PyTorch库的LSTM类提供了算法接口,定义如下:classtorch.nn.LSTM(input_size,hidden_size,num_layers=1,batch_first=False,**kargs)参数input_size:输入特征维数。hidden_size:隐藏状态的维数。num_layers:RNN的个数。batch_first:是否输入输出的第一维为batch_size。LSTM结构比RNN更加灵活,能够更好地处理长时间依赖性问题,但同时它也带来了更复杂的结构和更多的参数需要训练,这可能带来较大的计算代价,另外,LSTM也不能解决所有问题,在一些场景下RNN仍然是个不错的选择。在选择使用LSTM还是RNN时,需要根据具体的应用场景和问题来权衡选择。3.3
任务实施步骤3:基于AirModel类创建模型。model=AirModel()model3.循环神经网络预测国际旅行客流量按“SHIFT+Enter”,运行结果如下:3.3
任务实施3.3.5模型训练步骤1:定义2级标题。##<fontcolor="black">模型训练</font>按“SHIFT+Enter”,运行结果如下:3.循环神经网络预测国际旅行客流量步骤2:使用Adam优化器更新参数。optimizer=optim.Adam(model.parameters())按“SHIFT+Enter”,检查输出无异常。3.3
任务实施步骤3:使用MSE评价预测值和真实值之间的差距。loss_fn=nn.MSELoss()3.循环神经网络预测国际旅行客流量按“SHIFT+Enter”,检查输出无异常。步骤4:训练模型并打印损失。n_epochs=2000forepochinrange(n_epochs):
model.train()#设置模型在训练状态,计算梯度3.3
任务实施3.循环神经网络预测国际旅行客流量forX_batch,y_batchinloader:
y_pred=model(X_batch)#正向传播
loss=loss_fn(y_pred,y_batch)#计算损失
loss.backward()#反向传播,计算梯度
optimizer.step()#根据当前参数值和梯度更新参数值
optimizer.zero_grad()#梯度置零
#验证模型ifepoch%100!=0:continue接上3.3
任务实施3.循环神经网络预测国际旅行客流量model.eval()
withtorch.no_grad():#设置模型在训练状态,不计算梯度
y_pred=model(X_train)
train_rmse=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离职补偿合同范本
- 环卫项目合同范本
- 7 多元文化 多样魅力 第3课时 教学设计-2023-2024学年道德与法治六年级下册统编版
- 白杨教学设计
- 2023-2024学年泰山版信息技术(2018)第六册《第一单元 装扮美好生活 4 漂亮花瓶巧设计》教学设计
- Module 4 Unit 2 Children's Day(教学设计)-2023-2024学年牛津上海版(试用本)英语三年级下册
- Module 12 help unit 3 language in use教学设计 -2024-2025学年外研版八年级英语上册
- 新一年家长会教师的演讲稿
- 21凉州词教学设计-2024-2025学年四年级上册语文统编版
- 秋季学期散学典礼校长讲话稿
- JGJ153-2016 体育场馆照明设计及检测标准
- 高层住宅室内精装修施工组织设计
- 《临安春雨初霁》课件+2023-2024学年统编版高中语文选择性必修下册
- 【年产100吨植物乳杆菌菌剂生产线设计10000字(论文)】
- 《湖南省医疗保险“双通道”管理药品使用申请表》
- 2024年高考作文素材积累之6个议论文人物素材及运用示例
- 肾小管坏死中的线粒体功能障碍
- 2023年设备检修标准化作业规范
- 光伏电站除草服务(合同)范本【详尽多条款】
- 2023年考核银行安全保卫人员真题与答案
- 储能全系统解决方案及产品手册
评论
0/150
提交评论