版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1本章目標(biāo)掌握基于人工智能框架的問(wèn)題求解方法能夠在常用人工智能框架下搭建神經(jīng)網(wǎng)絡(luò)模型2本章內(nèi)容01手寫(xiě)數(shù)字圖像識(shí)別(基于MindSpore、含拓展學(xué)習(xí))02流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)預(yù)測(cè)(基于MindSpore、含拓展學(xué)習(xí))3手寫(xiě)數(shù)字圖像識(shí)別(基于MindSpore)手寫(xiě)數(shù)字圖像識(shí)別(基于MindSpore)4問(wèn)題描述關(guān)于手寫(xiě)數(shù)字圖像識(shí)別問(wèn)題,前面章節(jié)使用隨機(jī)森林分類器進(jìn)行了問(wèn)題求解。本案例分別使用經(jīng)典的人工神經(jīng)網(wǎng)絡(luò)模型——多層感知器(Multi-LayerPerceptron,MLP)及近年在計(jì)算機(jī)視覺(jué)領(lǐng)域被廣泛使用的人工神經(jīng)網(wǎng)絡(luò)模型——卷積神經(jīng)網(wǎng)絡(luò)(ConvolutionalNeuralNetwork,CNN)進(jìn)行問(wèn)題求解。5問(wèn)題描述本案例實(shí)現(xiàn)下面2個(gè)任務(wù):任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別在MindSpore框架下構(gòu)建多層感知器,使用手寫(xiě)數(shù)字圖像訓(xùn)練集優(yōu)化模型參數(shù),并保存訓(xùn)練好的模型。加載模型,在測(cè)試集上完成模型性能評(píng)估。任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別在MindSpore框架下構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)。與任務(wù)1相同,使用手寫(xiě)數(shù)字圖像訓(xùn)練集優(yōu)化模型參數(shù),保存模型;再加載模型,在測(cè)試集上進(jìn)行模型性能評(píng)估。6數(shù)據(jù)集介紹本案例使用MindSpore提供的手寫(xiě)數(shù)字圖像數(shù)據(jù)集。安裝MindSpore工具包。在MindSpore官網(wǎng)(/)上,提供了安裝幫助信息(/install/),通過(guò)選擇版本、硬件平臺(tái)、操作系統(tǒng)、編程語(yǔ)言、安裝方式,可生成對(duì)應(yīng)的安裝命令。數(shù)據(jù)集的下載7數(shù)據(jù)集介紹1 fromdownloadimportdownload2 url="/notebook/datasets/MNIST_Data.zip"3 path=download(url,"./",kind="zip",replace=True)數(shù)據(jù)集的下載運(yùn)行結(jié)束后,可在程序所在目錄下看到新生成的MNIST_Data文件夾,該文件夾中的train和test兩個(gè)子文件夾分別保存了訓(xùn)練集數(shù)據(jù)和測(cè)試集數(shù)據(jù)。提示:在運(yùn)行代碼前,需要先安裝download工具包,安裝命令為: pipinstalldownload-i/simple--trusted-host=
8數(shù)據(jù)集介紹數(shù)據(jù)集的加載和查看1 frommindspore.datasetimportMnistDataset2 train_dataset=MnistDataset('MNIST_Data/train')#加載訓(xùn)練集3 test_dataset=MnistDataset('MNIST_Data/test')#加載測(cè)試集4 print('列名:',train_dataset.get_col_names())#輸出訓(xùn)練集的列名5 print('訓(xùn)練集樣本數(shù):',len(train_dataset))#輸出訓(xùn)練集樣本數(shù)6 print('測(cè)試集樣本數(shù):',len(test_dataset))#輸出測(cè)試集樣本數(shù)例:加載手寫(xiě)數(shù)字圖像數(shù)據(jù)集運(yùn)行結(jié)果:列名:['image','label']訓(xùn)練集樣本數(shù):60000測(cè)試集樣本數(shù):10000提示:數(shù)據(jù)集中存在兩列數(shù)據(jù),一列為image(即圖像),另一列為label(即標(biāo)簽);訓(xùn)練集和測(cè)試集的樣本數(shù)分別是6萬(wàn)和1萬(wàn)。9數(shù)據(jù)集介紹數(shù)據(jù)集的預(yù)處理1 forimage,labelintrain_dataset.create_tuple_iterator():2 print('圖像形狀:',image.shape,',數(shù)據(jù)類型:',image.dtype)3 print('標(biāo)簽形狀:',label.shape,',數(shù)據(jù)類型:',label.dtype)4 break例:查看預(yù)處理前的數(shù)據(jù)集運(yùn)行結(jié)果:圖像形狀:(28,28,1),數(shù)據(jù)類型:UInt8標(biāo)簽形狀:(),數(shù)據(jù)類型:UInt32提示:每條數(shù)據(jù)包括圖像和標(biāo)簽。圖像是一個(gè)三維數(shù)據(jù),其中28、28和1分別對(duì)應(yīng)圖像的高度(H)、寬度(W)和通道數(shù)(C),元素類型是UInt8;標(biāo)簽是一個(gè)UInt32類型的常量。10數(shù)據(jù)集介紹數(shù)據(jù)集的預(yù)處理1 importmindspore#導(dǎo)入mindspore工具包2 frommindspore.datasetimportvision,transforms#導(dǎo)入模塊3 defdata_preprocessing(dataset,batch_size):#定義數(shù)據(jù)預(yù)處理的函數(shù)4 image_transforms=[#定義圖像數(shù)據(jù)預(yù)處理操作列表5 vision.Rescale(1/255,0),#將數(shù)據(jù)值縮小為原來(lái)的1/2556 vision.Normalize(mean=(0.1307,),std=(0.3081,)),#數(shù)據(jù)歸一化7 vision.HWC2CHW()#調(diào)整數(shù)據(jù)格式,H、W、C分別表示圖像高度、寬度和通道數(shù)8 ]例:定義數(shù)據(jù)預(yù)處理的函數(shù)定義數(shù)據(jù)預(yù)處理的函數(shù)data_preprocessing。該函數(shù)有兩個(gè)參數(shù),dataset用于接收要做預(yù)處理的數(shù)據(jù)集,batch_size用于指定將數(shù)據(jù)集分成多個(gè)批次時(shí)、每個(gè)批次中的樣本數(shù)量。該函數(shù)的返回結(jié)果是預(yù)處理后的數(shù)據(jù)集。11數(shù)據(jù)集介紹數(shù)據(jù)集的預(yù)處理9 label_transform=transforms.TypeCast(32)#定義標(biāo)簽數(shù)據(jù)的預(yù)處理操作,其作用是將標(biāo)簽數(shù)據(jù)映射為32類型10 dataset=dataset.map(image_transforms,'image')#對(duì)圖像數(shù)據(jù)應(yīng)用image_transforms所定義預(yù)處理11 dataset=dataset.map(label_transform,'label')#對(duì)標(biāo)簽數(shù)據(jù)應(yīng)用label_transform所定義的預(yù)處理操作12 dataset=dataset.batch(batch_size,drop_remainder=False)#將數(shù)據(jù)分成多個(gè)批次,以支持批量訓(xùn)練13 returndataset#返回預(yù)處理后的數(shù)據(jù)集例:定義數(shù)據(jù)預(yù)處理的函數(shù)12數(shù)據(jù)集介紹數(shù)據(jù)集的預(yù)處理1 train_dataset=data_preprocessing(train_dataset,batch_size=32)#對(duì)訓(xùn)練集進(jìn)行預(yù)處理2 test_dataset=data_preprocessing(test_dataset,batch_size=32)#對(duì)測(cè)試集進(jìn)行預(yù)處理例:訓(xùn)練集和測(cè)試集的預(yù)處理調(diào)用data_preprocessing函數(shù),完成訓(xùn)練集和測(cè)試集的預(yù)處理,這里指定參數(shù)batch_size=32,表示將數(shù)據(jù)集分批、每批包含32個(gè)樣本。13數(shù)據(jù)集介紹數(shù)據(jù)集的預(yù)處理1 forimage,labelintest_dataset.create_tuple_iterator():2 print('圖像形狀:',image.shape,',數(shù)據(jù)類型:',image.dtype)3 print('標(biāo)簽形狀:',label.shape,',數(shù)據(jù)類型:',label.dtype)4 break例:查看預(yù)處理后的數(shù)據(jù)集提示:每一條數(shù)據(jù)中圖像是一個(gè)4維數(shù)據(jù),其中的32及1、28和28分別表示一批數(shù)據(jù)所包含的圖像數(shù)量及每一圖像的通道數(shù)、高度和寬度,元素類型是Float32;標(biāo)簽是一個(gè)一維數(shù)據(jù),32表示一批數(shù)據(jù)所包含的標(biāo)簽數(shù)、與圖像一一對(duì)應(yīng),元素類型是Int32。運(yùn)行結(jié)果:圖像形狀:(32,1,28,28),數(shù)據(jù)類型:Float32標(biāo)簽形狀:(32,),數(shù)據(jù)類型:Int3214數(shù)據(jù)集介紹數(shù)據(jù)集的預(yù)處理提示:在訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)模型時(shí),每次根據(jù)一批數(shù)據(jù)進(jìn)行模型參數(shù)的優(yōu)化,通??梢允褂?xùn)練過(guò)程更加穩(wěn)定。本案例中,將一批數(shù)據(jù)的樣本數(shù)量設(shè)置為了32,即每次將32個(gè)樣本送入模型、計(jì)算整體損失、再進(jìn)行模型參數(shù)的優(yōu)化。15任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹多層感知器包括全連接層(FullyConnectedLayer,FC)和激活函數(shù)兩個(gè)基礎(chǔ)算子。16任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹全連接層,也稱為密集連接層(DenseLayer),其將前一層中每一個(gè)節(jié)點(diǎn)(或神經(jīng)元)與后一層中每一個(gè)節(jié)點(diǎn)連接。輸入層與輸出層的節(jié)點(diǎn)數(shù)量與問(wèn)題相關(guān)。對(duì)于手寫(xiě)數(shù)字圖像識(shí)別問(wèn)題,輸入層節(jié)點(diǎn)數(shù)為784(=通道數(shù)1*圖像寬度28*圖像高度28)。輸出層節(jié)點(diǎn)數(shù)為10,即對(duì)應(yīng)0~9共10個(gè)類別。隱層數(shù)量及每一隱層的節(jié)點(diǎn)數(shù)量均是模型的超參數(shù),需要在模型訓(xùn)練前人為設(shè)置。17任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹多層感知器中,可根據(jù)訓(xùn)練樣本自動(dòng)調(diào)整的可學(xué)習(xí)參數(shù)全部在全連接層;通過(guò)權(quán)重參數(shù)W和偏置參數(shù)b(可選參數(shù))的優(yōu)化,可實(shí)現(xiàn)模型對(duì)特定任務(wù)的適應(yīng)。18任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹激活函數(shù)是多層感知器的超參數(shù),常用的激活函數(shù)有Sigmoid、Tanh和ReLU。Sigmoid激活函數(shù)輸出值的取值范圍是(0,1);Tanh激活函數(shù)輸出值的取值范圍是(-1,1);ReLU激活函數(shù)輸出值的取值范圍是[0,+∞)。19任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析在MindSpore框架中,所定義的人工神經(jīng)網(wǎng)絡(luò)類需要以nn.Cell作為父類,其包含__init__構(gòu)造方法和construct方法。在__init__構(gòu)造方法中,定義神經(jīng)網(wǎng)絡(luò)所包含的計(jì)算,本例中定義了用于將三維圖像數(shù)據(jù)轉(zhuǎn)為一維數(shù)據(jù)的self.flatten操作,以及包含3個(gè)全連接層和2個(gè)ReLU激活函數(shù)計(jì)算的self.dense_relu_seq操作。在construct方法中,則通過(guò)執(zhí)行__init__構(gòu)造方法中所定義的操作,實(shí)現(xiàn)數(shù)據(jù)的計(jì)算。20任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析1 frommindsporeimportnn#導(dǎo)入nn模塊2 classMLP(nn.Cell):#定義多層感知器MLP類3 def__init__(self):#定義構(gòu)造方法4 super().__init__()#調(diào)用父類的構(gòu)造方法5 self.flatten=nn.Flatten()#定義flatten操作,將數(shù)據(jù)轉(zhuǎn)為一維數(shù)據(jù)6 self.dense_relu_seq=nn.SequentialCell(#定義dense_relu_seq操作7 nn.Dense(1*28*28,512),#第1個(gè)全連接層8 nn.ReLU(),#ReLU激活函數(shù)9 nn.Dense(512,512),#第2個(gè)全連接層10 nn.ReLU(),#ReLU激活函數(shù)11 nn.Dense(512,10)#第3個(gè)全連接層12 )例:定義多層感知器MLP類21任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析13 defconstruct(self,x):#定義construct方法14 x=self.flatten(x)#調(diào)用self.flattern將x轉(zhuǎn)為一維數(shù)據(jù)15 logits=self.dense_relu_seq(x)#調(diào)用self.dense_relu_seq實(shí)現(xiàn)對(duì)一維數(shù)據(jù)x的處理(包含3個(gè)全連接層和2個(gè)ReLU激活函數(shù))16 returnlogits#返回處理后的結(jié)果例:定義多層感知器MLP類22任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析定義MLP類后,可以創(chuàng)建MLP類的對(duì)象并打印對(duì)象信息。1 mlp=MLP()#創(chuàng)建MLP對(duì)象2 print(mlp)#打印模型信息例:創(chuàng)建MLP對(duì)象23任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析運(yùn)行結(jié)果:MLP<(flatten):Flatten<>(dense_relu_seq):SequentialCell<(0):Dense<input_channels=784,output_channels=512,has_bias=True>(1):ReLU<>(2):Dense<input_channels=512,output_channels=512,has_bias=True>(3):ReLU<>(4):Dense<input_channels=512,output_channels=10,has_bias=True>>>24任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析所構(gòu)建多層感知器的示意圖:提示:輸入的手寫(xiě)數(shù)字圖像是灰度圖,因此只有1個(gè)通道。如果輸入的是彩色圖像,則會(huì)有R(紅)、G(綠)、B(藍(lán))共3個(gè)通道。25任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析定義并調(diào)用模型訓(xùn)練函數(shù)train,進(jìn)行模型訓(xùn)練。1 frommindspore.trainimportModel#導(dǎo)入Model類2 frommindspore.train.callbackimportLossMonitor#導(dǎo)入LossMonitor類3 deftrain(net,train_dataset,lr,num_epochs,ckpt_name):#定義train函數(shù)4 loss=nn.loss.SoftmaxCrossEntropyWithLogits(sparse=True,reduction='mean')5 opt=nn.SGD(net.trainable_params(),lr)#使用SGD優(yōu)化算法6 loss_cb=LossMonitor(per_print_times=train_dataset.get_dataset_size())#打印每一輪損失值7 model=Model(net,loss,opt)#創(chuàng)建Model對(duì)象8 model.train(epoch=num_epochs,train_dataset=train_dataset,callbacks=[loss_cb])#訓(xùn)練模型9 mindspore.save_checkpoint(net,ckpt_name)#保存模型例:定義模型訓(xùn)練函數(shù)train26任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析1 importmindspore.contextascontext#導(dǎo)入context模塊2 context.set_context(mode=context.GRAPH_MODE)#使用靜態(tài)圖模式以提高運(yùn)行性能3 train(mlp,train_dataset,0.01,20,'mlp.ckpt')#訓(xùn)練并保存模型例:訓(xùn)練多層感知器train函數(shù)共有5個(gè)參數(shù):net用于接收要訓(xùn)練的人工神經(jīng)網(wǎng)絡(luò)模型對(duì)象,這里傳入的是創(chuàng)建的MLP類對(duì)象mlp;train_dataset用于接收訓(xùn)練數(shù)據(jù)集;lr用于設(shè)置學(xué)習(xí)率,學(xué)習(xí)率越大、則模型訓(xùn)練過(guò)程越快,但較難達(dá)到局部最優(yōu)值,本例將學(xué)習(xí)率設(shè)置為0.01;num_epoches用于設(shè)置迭代輪數(shù),一輪迭代是指將所有訓(xùn)練樣本都送入模型一次,本例將迭代輪數(shù)設(shè)置為20;ckpt_name用于設(shè)置模型保存路徑,本例將訓(xùn)練好的模型保存到程序所在目錄的mlp.ckpt文件中。
27任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析epoch:1step:1875,lossis0.409873366355896epoch:2step:1875,lossis0.2047421932220459epoch:3step:1875,lossis0.04884614050388336……epoch:18step:1875,lossis0.0055130599066615105epoch:19step:1875,lossis0.001958028180524707epoch:20step:1875,lossis0.007094281259924173運(yùn)行結(jié)果:提示:epoch后面的數(shù)值表示當(dāng)前的迭代輪數(shù);step后面的數(shù)值表示當(dāng)前輪迭代中的訓(xùn)練步數(shù),總共有6萬(wàn)條訓(xùn)練樣本,將訓(xùn)練樣本分批時(shí)每批包含32條樣本,即將訓(xùn)練樣本分成了1875(=60000/32)批,因此一輪迭代中所包含的訓(xùn)練步數(shù)是1875;loss后面的數(shù)值表示當(dāng)前輪迭代的模型損失值。28任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析定義并調(diào)用模型測(cè)試函數(shù)test,進(jìn)行模型測(cè)試。1 deftest(net,test_dataset):#定義test函數(shù)2 model=Model(net)#創(chuàng)建Model對(duì)象3 preds=[]#記錄每一條測(cè)試數(shù)據(jù)的預(yù)測(cè)值4 labels=[]#記錄每一條測(cè)試數(shù)據(jù)的標(biāo)簽值5 fordataintest_dataset.create_dict_iterator():#遍歷測(cè)試數(shù)據(jù)6 output=model.predict(data['image'])#根據(jù)輸入圖像生成模型預(yù)測(cè)結(jié)果(按批次)7 pred=np.argmax(output.asnumpy(),axis=1)#將輸出值最大的結(jié)果作為預(yù)測(cè)結(jié)果8 preds+=list(pred)#將預(yù)測(cè)結(jié)果加到列表中9 label=data['label']#獲取測(cè)試數(shù)據(jù)的標(biāo)簽10 labels+=list(label.asnumpy())#將測(cè)試數(shù)據(jù)的標(biāo)簽加到列表中11 returnnp.array(preds),np.array(labels)#返回測(cè)試數(shù)據(jù)的預(yù)測(cè)結(jié)果和標(biāo)簽例:定義模型測(cè)試函數(shù)test29任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析1 mlp=MLP()#創(chuàng)建MLP對(duì)象2 mindspore.load_checkpoint('mlp.ckpt',net=mlp)#從文件加載訓(xùn)練好的模型3 preds,labels=test(mlp,test_dataset)#調(diào)用test函數(shù)進(jìn)行模型測(cè)試4 print(preds)#輸出測(cè)試數(shù)據(jù)集的預(yù)測(cè)結(jié)果5 print(labels)#輸出測(cè)試數(shù)據(jù)集的標(biāo)簽6 num_samples=labels.shape[0]#獲取測(cè)試數(shù)據(jù)集的樣本數(shù)量7 num_correct=(preds==labels).sum().item()#計(jì)算識(shí)別正確的樣本數(shù)量8 acc=num_correct/num_samples#計(jì)算準(zhǔn)確率9 print('樣本數(shù):%d,識(shí)別正確:%d,準(zhǔn)確率:%f'%(num_samples,num_correct,acc))#輸出測(cè)試結(jié)果例:測(cè)試多層感知器test函數(shù)有兩個(gè)參數(shù):net用于接收要測(cè)試的人工神經(jīng)網(wǎng)絡(luò)模型對(duì)象,這里傳入的是從mlp.ckpt文件加載的訓(xùn)練好的模型;test_dataset用于接收測(cè)試數(shù)據(jù)集。30任務(wù)1.基于多層感知器的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析[598...589][598...589]樣本數(shù):10000,識(shí)別正確:9810,準(zhǔn)確率:0.981000運(yùn)行結(jié)果:提示:人工神經(jīng)網(wǎng)絡(luò)模型中,可學(xué)習(xí)參數(shù)采用隨機(jī)初始化的方式。因此,每次運(yùn)行模型訓(xùn)練和測(cè)試程序時(shí),會(huì)得到不同的訓(xùn)練和測(cè)試結(jié)果。31任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹在卷積神經(jīng)網(wǎng)絡(luò)中,除了包含多層感知器中使用的全連接層和激活函數(shù)這兩種算子以外,還包含卷積和池化兩種算子。卷積對(duì)于一個(gè)H(高度)*W(寬度)的二維數(shù)據(jù)X,使用m*n的卷積核進(jìn)行卷積計(jì)算,則需要先將X劃分為多個(gè)m*n的塊,然后對(duì)每個(gè)m*n的塊分別與m*n的卷積核做矩陣的哈達(dá)瑪積,最后將哈達(dá)瑪積結(jié)果矩陣中的元素求和、得到卷積運(yùn)算結(jié)果矩陣中的一個(gè)元素。將X劃分為多個(gè)塊,是通過(guò)滑動(dòng)窗口來(lái)實(shí)現(xiàn),滑動(dòng)窗口的尺寸與卷積核的尺寸相同,滑動(dòng)步長(zhǎng)決定了每次在水平方向和垂直方向滑動(dòng)的距離。32任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹卷積算子的滑動(dòng)窗口示意圖(窗口尺寸3*3,以1作為滑動(dòng)步長(zhǎng))卷積算子的滑動(dòng)窗口示意圖(窗口尺寸3*3,以2作為滑動(dòng)步長(zhǎng))33任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹卷積將X的每一塊,分別與卷積核做矩陣的哈達(dá)瑪積,并將哈達(dá)瑪積結(jié)果矩陣的元素求和,求和結(jié)果作為卷積運(yùn)算結(jié)果矩陣中的一個(gè)元素。卷積計(jì)算示例(以1作為滑動(dòng)步長(zhǎng))提示:卷積核的尺寸是卷積計(jì)算的超參數(shù)、需要人為設(shè)定;卷積核中的元素則是可學(xué)習(xí)的參數(shù),根據(jù)訓(xùn)練數(shù)據(jù)自動(dòng)優(yōu)化、使其適用于解決特定問(wèn)題。34任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹對(duì)輸入數(shù)據(jù)X以0補(bǔ)邊的卷積計(jì)算示例(以1作為滑動(dòng)步長(zhǎng))提示:從卷積計(jì)算示例可以看到,使用3*3的卷積核進(jìn)行卷積運(yùn)算,運(yùn)算結(jié)果比輸入數(shù)據(jù)X少了2行、2列,即卷積計(jì)算前、后數(shù)據(jù)的形狀發(fā)生了變化。為了使卷積計(jì)算前、后的數(shù)據(jù)形狀一致,可以使用對(duì)輸入數(shù)據(jù)X補(bǔ)邊(padding)的方法。35任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹對(duì)于一個(gè)C(通道數(shù))*H(高度)*W(寬度)的三維數(shù)據(jù)Y,則需要使用C個(gè)m*n的卷積核進(jìn)行卷積計(jì)算,其計(jì)算過(guò)程為:Y中第1個(gè)通道的二維數(shù)據(jù)與第1個(gè)m*n的卷積核做卷積計(jì)算,得到第1個(gè)通道的卷積計(jì)算結(jié)果R1。Y中第2個(gè)通道的二維數(shù)據(jù)與第2個(gè)m*n的卷積核做卷積計(jì)算,得到第2個(gè)通道的卷積計(jì)算結(jié)果R2?!璝中第C個(gè)通道的二維數(shù)據(jù)與第C個(gè)m*n的卷積核做卷積計(jì)算,得到第C個(gè)通道的卷積計(jì)算結(jié)果RC。將R1、R2、……、RC中同一位置的元素相加,得到整體的卷積計(jì)算結(jié)果R。36任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹對(duì)多通道數(shù)據(jù)做卷積計(jì)算后,得到的結(jié)果是單通道數(shù)據(jù)。37任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹如果需要多通道的卷積計(jì)算結(jié)果,則需要使用多個(gè)卷積核;將輸入數(shù)據(jù)與每個(gè)卷積核做卷積計(jì)算得到的單通道數(shù)據(jù)拼接在一起,即可得到多通道的結(jié)果數(shù)據(jù)。38任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹池化池化,是將一個(gè)窗口中的元素通過(guò)取最大值或平均值的方式,匯聚成一個(gè)元素。池化操作中,所使用滑動(dòng)窗口的滑動(dòng)步長(zhǎng)通常與滑動(dòng)窗口的尺寸相同,即各滑動(dòng)窗口區(qū)域之間不會(huì)重疊。最大池化計(jì)算示例(滑動(dòng)窗口尺寸2*2,以2作為滑動(dòng)步長(zhǎng))39任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別基礎(chǔ)理論和方法介紹提示:將卷積、激活函數(shù)、池化等算子組合,通過(guò)卷積核中可學(xué)習(xí)參數(shù)的優(yōu)化,可自動(dòng)實(shí)現(xiàn)適用于特定問(wèn)題的數(shù)據(jù)特征的提取,從而提升人工神經(jīng)網(wǎng)絡(luò)模型的性能。40任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析通過(guò)引入卷積和池化,定義一個(gè)卷積神經(jīng)網(wǎng)絡(luò)CNN類。與前面定義的MLP類相同,CNN類中包含了用于定義神經(jīng)網(wǎng)絡(luò)所包含操作的__init__構(gòu)造方法,以及將這些操作組合、實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)計(jì)算的construct方法。1 classCNN(nn.Cell):#定義卷積神經(jīng)網(wǎng)絡(luò)CNN類2 def__init__(self):#定義構(gòu)造方法3 super().__init__()#調(diào)用父類的構(gòu)造方法4 self.layer1=nn.SequentialCell(#定義第1個(gè)卷積層5 nn.Conv2d(in_channels=1,out_channels=16,kernel_size=3,pad_mode='valid'),#輸入數(shù)據(jù)是1*28*28,輸出數(shù)據(jù)是16*26*26,使用3*3卷積核,不補(bǔ)邊6 nn.ReLU()#ReLU激活函數(shù)7 )例:定義卷積神經(jīng)網(wǎng)絡(luò)CNN類41任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析8 self.layer2=nn.SequentialCell(#定義第2個(gè)卷積層9 nn.Conv2d(in_channels=16,out_channels=32,kernel_size=3,pad_mode='valid'),#輸入數(shù)據(jù)是16*26*26,輸出數(shù)據(jù)是32*24*24,使用3*3卷積核,不補(bǔ)邊10 nn.ReLU(),#ReLU激活函數(shù)11 nn.MaxPool2d(kernel_size=2,stride=2))#以2為滑動(dòng)步長(zhǎng)、2*2窗口的最大池化,輸出數(shù)據(jù)是32*12*1212 self.layer3=nn.SequentialCell(#定義第3個(gè)卷積層13 nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,pad_mode='valid'),#輸入數(shù)據(jù)是32*12*12,輸出數(shù)據(jù)是64*10*10,使用3*3卷積核,不補(bǔ)邊14 nn.ReLU())#ReLU激活函數(shù)例:定義卷積神經(jīng)網(wǎng)絡(luò)CNN類42任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析15 self.layer4=nn.SequentialCell(#定義第4個(gè)卷積層16 nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,pad_mode='valid'),#輸入數(shù)據(jù)是64*10*10,輸出數(shù)據(jù)是128*8*8,使用3*3卷積核,不補(bǔ)邊17 nn.ReLU(),#ReLU激活函數(shù)18 nn.MaxPool2d(kernel_size=2,stride=2))#以2為滑動(dòng)步長(zhǎng)、2*2窗口的最大池化,輸出數(shù)據(jù)是128*4*4例:定義卷積神經(jīng)網(wǎng)絡(luò)CNN類43任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析19 self.flatten=nn.Flatten()#定義flatten操作,將數(shù)據(jù)轉(zhuǎn)為一維數(shù)據(jù)20 self.fc=nn.SequentialCell(#定義全連接層21 nn.Dense(128*4*4,1024),#輸入一維數(shù)據(jù)長(zhǎng)度2048(=128*4*4),輸出一維數(shù)據(jù)長(zhǎng)度102422 nn.ReLU(),#ReLU激活函數(shù)23 nn.Dense(1024,128),#輸入一維數(shù)據(jù)長(zhǎng)度1024,輸出一維數(shù)據(jù)長(zhǎng)度12824 nn.ReLU(),#ReLU激活函數(shù)25 nn.Dense(128,10))#輸入一維數(shù)據(jù)長(zhǎng)度128,輸出一維數(shù)據(jù)長(zhǎng)度10(對(duì)應(yīng)10個(gè)類別)例:定義卷積神經(jīng)網(wǎng)絡(luò)CNN類44任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析26 defconstruct(self,x):#定義construct方法27 x=self.layer1(x)#執(zhí)行第1個(gè)卷積層的計(jì)算28 x=self.layer2(x)#執(zhí)行第2個(gè)卷積層的計(jì)算29 x=self.layer3(x)#執(zhí)行第3個(gè)卷積層的計(jì)算30 x=self.layer4(x)#執(zhí)行第4個(gè)卷積層的計(jì)算31 x=self.flatten(x)#調(diào)用self.flattern將x轉(zhuǎn)為一維數(shù)據(jù)32 x=self.fc(x)#執(zhí)行全連接層的計(jì)算33 returnx#返回計(jì)算結(jié)果例:定義卷積神經(jīng)網(wǎng)絡(luò)CNN類45任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析所定義卷積神經(jīng)網(wǎng)絡(luò)的計(jì)算過(guò)程示意圖例:定義卷積神經(jīng)網(wǎng)絡(luò)CNN類46任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析定義CNN類后,可以創(chuàng)建CNN類的對(duì)象。1 cnn=CNN()#創(chuàng)建CNN對(duì)象例:創(chuàng)建CNN對(duì)象在進(jìn)行模型訓(xùn)練前,按照多層感知器任務(wù)中的方式進(jìn)行手寫(xiě)數(shù)字圖像數(shù)據(jù)集的加載及預(yù)處理。1 train_dataset=MnistDataset('MNIST_Data/train')#加載訓(xùn)練集2 test_dataset=MnistDataset('MNIST_Data/test')#加載測(cè)試集3 train_dataset=data_preprocessing(train_dataset,batch_size=32)#對(duì)訓(xùn)練集進(jìn)行預(yù)處理4 test_dataset=data_preprocessing(test_dataset,batch_size=32)#對(duì)測(cè)試集進(jìn)行預(yù)處理例:加載及預(yù)處理手寫(xiě)數(shù)字圖像數(shù)據(jù)集47任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析通過(guò)調(diào)用定義的模型訓(xùn)練函數(shù)train,可完成卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。與訓(xùn)練多層感知器的區(qū)別在于:第一個(gè)參數(shù)傳入的數(shù)據(jù)是CNN類對(duì)象cnn;最后一個(gè)參數(shù)傳入的數(shù)據(jù)是'cnn.ckpt',即訓(xùn)練好的卷積神經(jīng)網(wǎng)絡(luò)模型會(huì)保存在程序所在目錄的cnn.ckpt文件中。1 importmindspore.contextascontext#導(dǎo)入context模塊2 context.set_context(mode=context.GRAPH_MODE)#使用靜態(tài)圖模式以提高運(yùn)行性能3 train(cnn,train_dataset,0.01,20,'cnn.ckpt')#訓(xùn)練并保存模型例:訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)48代碼實(shí)現(xiàn)和分析epoch:1step:1875,lossis0.21416901051998138epoch:2step:1875,lossis0.06331072002649307epoch:3step:1875,lossis0.07789043337106705……epoch:18step:1875,lossis0.0020997629035264254epoch:19step:1875,lossis0.0008499562391079962epoch:20step:1875,lossis0.007195742800831795運(yùn)行結(jié)果:49任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析通過(guò)調(diào)用定義的模型測(cè)試函數(shù)test,可進(jìn)行卷積神經(jīng)網(wǎng)絡(luò)的性能測(cè)試。該程序從程序所在目錄的cnn.ckpt文件中加載訓(xùn)練好的模型,調(diào)用test函數(shù)進(jìn)行模型測(cè)試,根據(jù)樣本總數(shù)和識(shí)別正確的樣本數(shù)計(jì)算準(zhǔn)確率,并輸出測(cè)試結(jié)果信息。50任務(wù)2.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字圖像識(shí)別代碼實(shí)現(xiàn)和分析1 cnn=CNN()#創(chuàng)建CNN對(duì)象2 mindspore.load_checkpoint('cnn.ckpt',net=cnn)#從文件加載訓(xùn)練好的模型3 preds,labels=test(cnn,test_dataset)#調(diào)用test函數(shù)進(jìn)行模型測(cè)試4 print(preds)#輸出測(cè)試數(shù)據(jù)集的預(yù)測(cè)結(jié)果5 print(labels)#輸出測(cè)試數(shù)據(jù)集的標(biāo)簽6 num_samples=labels.shape[0]#獲取測(cè)試數(shù)據(jù)集的樣本數(shù)量7 num_correct=(preds==labels).sum().item()#計(jì)算識(shí)別正確的樣本數(shù)量8 acc=num_correct/num_samples#計(jì)算準(zhǔn)確率9 print('樣本數(shù):%d,識(shí)別正確:%d,準(zhǔn)確率:%f'%(num_samples,num_correct,acc))#輸出測(cè)試結(jié)果例:測(cè)試卷積神經(jīng)網(wǎng)絡(luò)運(yùn)行結(jié)果:[333...889][333...889]樣本數(shù):10000,識(shí)別正確:9903,準(zhǔn)確率:0.990300提示:與多層感知器模型相同,每次運(yùn)行卷積神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練和測(cè)試程序時(shí),會(huì)得到不同的訓(xùn)練和測(cè)試結(jié)果。51拓展學(xué)習(xí)請(qǐng)以該案例為基礎(chǔ),嘗試修改卷積神經(jīng)網(wǎng)絡(luò)模型的相關(guān)代碼,解決其他圖像識(shí)別問(wèn)題。如CIFAR-10數(shù)據(jù)集的10類目標(biāo)分類問(wèn)題。52流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)預(yù)測(cè)(基于MindSpore)流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)預(yù)測(cè)(基于MindSpore)53問(wèn)題描述流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)預(yù)測(cè)任務(wù)是一項(xiàng)多變量時(shí)間序列預(yù)測(cè)任務(wù),其中多變量數(shù)據(jù)源自多個(gè)傳感器,每個(gè)傳感器的輸出是一個(gè)時(shí)間序列數(shù)據(jù),這些傳感器數(shù)據(jù)來(lái)自于控制系統(tǒng)中的多個(gè)控制回路。在工業(yè)控制系統(tǒng)中,一個(gè)控制回路通常包括一個(gè)過(guò)程變量(ProcessVariable,PV)和一個(gè)控制變量(OperatingVariable,OP)。過(guò)程變量是指工業(yè)過(guò)程或系統(tǒng)中需要監(jiān)測(cè)和控制的實(shí)際物理量或狀態(tài);可以是溫度、壓力、流量、速度、液位等,是通過(guò)傳感器測(cè)量并反饋給控制系統(tǒng)的值,用于表示當(dāng)前的過(guò)程狀態(tài)。控制變量是能夠影響工業(yè)過(guò)程或系統(tǒng)行為的可控變量,控制器通過(guò)與設(shè)定點(diǎn)進(jìn)行比較,并計(jì)算出誤差,然后生成相應(yīng)的控制信號(hào)來(lái)調(diào)整執(zhí)行器(針對(duì)流量作為過(guò)程變量的回路,控制變量可以是閥門(mén)開(kāi)度),以使過(guò)程變量達(dá)到設(shè)定點(diǎn)。此外,在工業(yè)控制系統(tǒng)中還存在干擾變量(DisturbanceVariable,DV),其是工業(yè)過(guò)程中,會(huì)影響過(guò)程變量但不能直接控制的變量;它們是工業(yè)過(guò)程中的外部因素或變化,可以導(dǎo)致過(guò)程變量偏離設(shè)定點(diǎn)。54問(wèn)題描述通過(guò)對(duì)流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)進(jìn)行預(yù)測(cè),可以用于包括故障預(yù)警和控制系統(tǒng)優(yōu)化等多種下游任務(wù)。在流程工業(yè)多元時(shí)間序列預(yù)測(cè)任務(wù)中,通常只將過(guò)程變量作為預(yù)測(cè)目標(biāo)。本案例實(shí)現(xiàn)下面2個(gè)任務(wù):任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)任務(wù)描述:利用過(guò)去30個(gè)時(shí)間步的歷史時(shí)間序列數(shù)據(jù),預(yù)測(cè)未來(lái)1個(gè)時(shí)間步的過(guò)程變量數(shù)據(jù)。輸入數(shù)據(jù):歷史30個(gè)時(shí)間步的過(guò)程變量、控制變量和干擾變量數(shù)據(jù)。輸出數(shù)據(jù):未來(lái)1個(gè)時(shí)間步的過(guò)程變量的預(yù)測(cè)值。任務(wù)2.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)多步預(yù)測(cè)任務(wù)描述:利用過(guò)去30個(gè)時(shí)間步的歷史時(shí)間序列數(shù)據(jù),預(yù)測(cè)未來(lái)5個(gè)時(shí)間步的過(guò)程變量數(shù)據(jù)。輸入數(shù)據(jù):歷史30個(gè)時(shí)間步的過(guò)程變量、控制變量和干擾變量數(shù)據(jù);未來(lái)4個(gè)時(shí)間步的控制變量數(shù)據(jù)。輸出數(shù)據(jù):未來(lái)5個(gè)時(shí)間步的過(guò)程變量的預(yù)測(cè)值。55數(shù)據(jù)集介紹本工業(yè)數(shù)據(jù)集來(lái)自于某廠甲醇精餾裝置分布式控制系統(tǒng)(DistributedControlSystem,DCS)數(shù)據(jù)。數(shù)據(jù)時(shí)間跨度約為2天,采樣間隔為10s,共采集14516個(gè)時(shí)間點(diǎn)數(shù)據(jù)。每個(gè)數(shù)據(jù)點(diǎn)都包括了23個(gè)傳感器的讀數(shù),其中包括9個(gè)控制回路的過(guò)程變量、9個(gè)對(duì)應(yīng)的控制變量,以及5個(gè)干擾變量。jl_data_train.csv數(shù)據(jù)文件中,每一行代表一個(gè)時(shí)間點(diǎn)的采樣數(shù)據(jù),time_stamp列為時(shí)間戳,PV_{i}和OP_{i}列表示第i個(gè)回路中對(duì)應(yīng)的過(guò)程變量和控制變量。DV_{1-5}列是工段的干擾變量,在本數(shù)據(jù)集中,干擾變量不隨回路劃分。概述56數(shù)據(jù)集介紹jl_data_train.csv數(shù)據(jù)文件中的部分?jǐn)?shù)據(jù)如下所示。第1行是標(biāo)題,后面是14516行時(shí)間點(diǎn)數(shù)據(jù);總共24列,第1列是時(shí)間戳,第2至10列是過(guò)程變量值,第11至19列是對(duì)應(yīng)的控制變量值,第20至24列是干擾變量值。數(shù)據(jù)集的加載和查看time_stamp,PV_0,PV_1,PV_2,PV_3,PV_4,PV_5,PV_6,PV_7,PV_8,OP_0,OP_1,OP_2,OP_3,OP_4,OP_5,OP_6,OP_7,OP_8,DV_0,DV_1,DV_2,DV_3,DV_41676653474.463,2.928667473375612,……,0.9443662087339856,-1.51106902978475021676653484.463,2.7507462368709246,……,1.198136862289255,-1.5317178530192024……1676798624.463,-0.8540196613277133,……,1.196028981769253,0.915923982801079857數(shù)據(jù)集介紹數(shù)據(jù)集的加載和查看使用numpy工具包中提供的loadtxt函數(shù)加載該工業(yè)數(shù)據(jù)集。1 importnumpyasnp#導(dǎo)入numpy工具包2 sensor_num=23#傳感器數(shù)量3 horizon=5#預(yù)測(cè)的時(shí)間步數(shù)4 PV_index=[idxforidxinrange(9)]#PV變量的索引值范圍5 OP_index=[idxforidxinrange(9,18)]#OP變量的索引值范圍6 DV_index=[idxforidxinrange(18,sensor_num)]#DV變量的索引值范圍7 data_path='data/jl_data_train.csv'#數(shù)據(jù)文件路徑例:加載工業(yè)數(shù)據(jù)集58數(shù)據(jù)集介紹數(shù)據(jù)集的加載和查看np.loadtxt函數(shù)的參數(shù)說(shuō)明:delimiter參數(shù)用于指定每條數(shù)據(jù)各元素之間的分隔符;skiprows=1表示忽略第一條標(biāo)題數(shù)據(jù);usecols=range(1,sensor_num+1)表示讀取第2至24列數(shù)據(jù),忽略第1列的時(shí)間戳。8 data=np.loadtxt(data_path,delimiter=',',skiprows=1,usecols=range(1,sensor_num+1))#讀取數(shù)據(jù)(忽略第1行的標(biāo)題及第1列的時(shí)間戳)9 print('數(shù)據(jù)形狀:{0},元素類型:{1}'.format(data.shape,data.dtype))例:加載工業(yè)數(shù)據(jù)集59數(shù)據(jù)集介紹數(shù)據(jù)集的加載和查看例:加載工業(yè)數(shù)據(jù)集運(yùn)行結(jié)果:
數(shù)據(jù)形狀:(14516,23),元素類型:float64提示:共讀取14516條數(shù)據(jù)每條數(shù)據(jù)有23個(gè)元素、與23個(gè)傳感器對(duì)應(yīng)每個(gè)元素的數(shù)據(jù)類型是float6460數(shù)據(jù)集介紹數(shù)據(jù)集的加載和查看為了直觀看到數(shù)據(jù)變化趨勢(shì),繪制第1個(gè)傳感器的前100條數(shù)據(jù)。1 importmatplotlib.pyplotasplt2 plt.figure(figsize=(8,4))3 plt.plot(range(1,101),data[:100,0])#繪制第1個(gè)傳感器的前100條數(shù)據(jù)4 plt.show()例:繪制傳感器數(shù)據(jù)61數(shù)據(jù)集介紹生成模型的輸入數(shù)據(jù)和輸出數(shù)據(jù)按照任務(wù)1和任務(wù)2的要求,需要根據(jù)從文件中讀取的時(shí)間點(diǎn)數(shù)據(jù),生成模型的輸入數(shù)據(jù)和輸出數(shù)據(jù)。對(duì)于任務(wù)1,每條輸入數(shù)據(jù)由30個(gè)連續(xù)的時(shí)間點(diǎn)(記為:xt+1、xt+2、……、xt+30)數(shù)據(jù)組成,其對(duì)應(yīng)的輸出數(shù)據(jù)為xt+31。對(duì)于任務(wù)2,每條輸入數(shù)據(jù)仍由30個(gè)連續(xù)的時(shí)間點(diǎn)數(shù)據(jù)(記為:xt+1、xt+2、……、xt+30)組成,其對(duì)應(yīng)的輸出數(shù)據(jù)由5個(gè)連續(xù)的時(shí)間點(diǎn)數(shù)據(jù)(xt+31、xt+32、……、xt+35)組成。62數(shù)據(jù)集介紹1 defgenerateData(data,X_len,Y_len,sensor_num):#定義generateData函數(shù)2 point_num=data.shape[0]#時(shí)間點(diǎn)總數(shù)3 sample_num=point_num-X_len-Y_len+1#生成的總樣本數(shù)4 X=np.zeros((sample_num,X_len,sensor_num))#用于保存輸入數(shù)據(jù)5 Y=np.zeros((sample_num,Y_len,sensor_num))#用于保存對(duì)應(yīng)的輸出數(shù)據(jù)6 foriinrange(sample_num):#通過(guò)遍歷逐一生成輸入數(shù)據(jù)和對(duì)應(yīng)的輸出數(shù)據(jù)7 X[i]=data[i:i+X_len]#前X_len個(gè)時(shí)間點(diǎn)數(shù)據(jù)組成輸入數(shù)據(jù)8 Y[i]=data[i+X_len:i+X_len+Y_len]#后Y_len個(gè)時(shí)間點(diǎn)數(shù)據(jù)組成輸出數(shù)據(jù)9 returnX,Y#返回所生成的模型的輸入數(shù)據(jù)X和輸出數(shù)據(jù)Y例:定義生成模型輸入/輸出數(shù)據(jù)的generateData函數(shù)生成模型的輸入數(shù)據(jù)和輸出數(shù)據(jù)參數(shù)data用于接收從文件中讀取的時(shí)間點(diǎn)數(shù)據(jù)參數(shù)X_len用于接收輸入數(shù)據(jù)的長(zhǎng)度參數(shù)Y_len用于接收輸出數(shù)據(jù)的長(zhǎng)度參數(shù)sensor_num用于接收傳感器數(shù)量63數(shù)據(jù)集介紹1 X_t1,Y_t1=generateData(data,30,1,sensor_num)#生成任務(wù)1所用的數(shù)據(jù)集2 X_t2,Y_t2=generateData(data,30,horizon,sensor_num)#生成任務(wù)2所用的數(shù)據(jù)集3 print('任務(wù)1數(shù)據(jù)集輸入數(shù)據(jù)形狀:{0},輸出數(shù)據(jù)形狀:{1}'.format(X_t1.shape,Y_t1.shape))4 print('任務(wù)2數(shù)據(jù)集輸入數(shù)據(jù)形狀:{0},輸出數(shù)據(jù)形狀:{1}'.format(X_t2.shape,Y_t2.shape))例:生成用于工業(yè)時(shí)序預(yù)測(cè)模型的數(shù)據(jù)集生成模型的輸入數(shù)據(jù)和輸出數(shù)據(jù)運(yùn)行結(jié)果:任務(wù)1數(shù)據(jù)集輸入數(shù)據(jù)形狀:(14486,30,23),輸出數(shù)據(jù)形狀:(14486,1,23)任務(wù)2數(shù)據(jù)集輸入數(shù)據(jù)形狀:(14482,30,23),輸出數(shù)據(jù)形狀:(14482,5,23)64數(shù)據(jù)集介紹劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集將數(shù)據(jù)集劃分為3部分,分別是訓(xùn)練集、驗(yàn)證集和測(cè)試集。1 defsplitData(X,Y):#定義splitData函數(shù)2 N=X.shape[0]#樣本總數(shù)3 train_X,train_Y=X[:int(N*0.6)],Y[:int(N*0.6)]#前60%的數(shù)據(jù)作為訓(xùn)練集4 val_X,val_Y=X[int(N*0.6):int(N*0.8)],Y[int(N*0.6):int(N*0.8)]#中間20%的數(shù)據(jù)作為驗(yàn)證集5 test_X,test_Y=X[int(N*0.8):],Y[int(N*0.8)]#最后20%的數(shù)據(jù)作為測(cè)試集6 returntrain_X,train_Y,val_X,val_Y,test_X,test_Y#返回劃分好的數(shù)據(jù)集例:定義用于劃分訓(xùn)練集、驗(yàn)證集、測(cè)試集的splitData函數(shù)提示:參數(shù)X和Y分別用于接收輸入數(shù)據(jù)和輸出數(shù)據(jù)。
65數(shù)據(jù)集介紹劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集通過(guò)調(diào)用splitData函數(shù),分別生成用于任務(wù)1和任務(wù)2的訓(xùn)練集、驗(yàn)證集和測(cè)試集。1 train_X_t1,train_Y_t1,val_X_t1,val_Y_t1,test_X_t1,test_Y_t1=splitData(X_t1,Y_t1)#劃分任務(wù)1的數(shù)據(jù)集2 train_X_t2,train_Y_t2,val_X_t2,val_Y_t2,test_X_t2,test_Y_t2=splitData(X_t2,Y_t2)#劃分任務(wù)2的數(shù)據(jù)集3 s='訓(xùn)練集樣本數(shù):{0},驗(yàn)證集樣本數(shù):{1},測(cè)試集樣本數(shù):{2}'4 print('任務(wù)1'+s.format(train_X_t1.shape[0],val_X_t1.shape[0],test_X_t1.shape[0]))5 print('任務(wù)2'+s.format(train_X_t2.shape[0],val_X_t2.shape[0],test_X_t2.shape[0]))例:生成訓(xùn)練集、驗(yàn)證集和測(cè)試集運(yùn)行結(jié)果:任務(wù)1訓(xùn)練集樣本數(shù):8691,驗(yàn)證集樣本數(shù):2897,測(cè)試集樣本數(shù):2898任務(wù)2訓(xùn)練集樣本數(shù):8689,驗(yàn)證集樣本數(shù):2896,測(cè)試集樣本數(shù):289766數(shù)據(jù)集介紹轉(zhuǎn)換為MindSpore要求的數(shù)據(jù)集格式使用MindSpore搭建的模型,對(duì)數(shù)據(jù)集格式有特定要求。1 classMultiTimeSeriesDataset():#定義MultiTimeSeriesDataset類2 def__init__(self,X,Y):#構(gòu)造方法3 self.X,self.Y=X,Y#設(shè)置輸入數(shù)據(jù)和輸出數(shù)據(jù)4 def__len__(self):5 returnlen(self.X)#獲取數(shù)據(jù)的長(zhǎng)度6 def__getitem__(self,index):7 returnself.X[index],self.Y[index]#根據(jù)索引值為index的數(shù)據(jù)例:定義多元時(shí)間序列數(shù)據(jù)集類MultiTimeSeriesDataset包含3個(gè)方法:__init__構(gòu)造方法分別設(shè)置用于模型的輸入數(shù)據(jù)X及目標(biāo)輸出數(shù)據(jù)Y(即標(biāo)簽);__len__內(nèi)置方法返回?cái)?shù)據(jù)的長(zhǎng)度;__getitem__內(nèi)置方法可以根據(jù)傳入的索引值index,從輸入數(shù)據(jù)X和目標(biāo)輸出數(shù)據(jù)Y中獲得相應(yīng)的元素。67數(shù)據(jù)集介紹轉(zhuǎn)換為MindSpore要求的數(shù)據(jù)集格式1 frommindsporeimportTensor#導(dǎo)入Tensor類2 frommindspore.datasetimportGeneratorDataset#導(dǎo)入GeneratorDataset類3 defgenerateMindsporeDataset(X,Y,batch_size):#定義generateMindsporeDataset函數(shù)4 dataset=MultiTimeSeriesDataset(X.astype(np.float32),Y.astype(np.float32))#根據(jù)X和Y創(chuàng)建MultiTimeSeriesDataset類對(duì)象5 dataset=GeneratorDataset(dataset,column_names=['data','label'])#創(chuàng)建GeneratorDataset類對(duì)象,并指定數(shù)據(jù)集兩列的列名稱分別是data和label6 dataset=dataset.batch(batch_size=batch_size,drop_remainder=False)#將數(shù)據(jù)集分成多個(gè)批次,以支持批量訓(xùn)練7 returndataset#返回可用于模型訓(xùn)練和測(cè)試的數(shù)據(jù)集例:定義用于生成訓(xùn)練集、驗(yàn)證集和測(cè)試集的generateMindsporeDataset函數(shù)提示:與手寫(xiě)數(shù)字圖像識(shí)別案例相同,使用轉(zhuǎn)換后的數(shù)據(jù)集對(duì)象調(diào)用batch方法,將數(shù)據(jù)集分成多個(gè)批次、以支持批量訓(xùn)練。Tensor是MindSpore提供的一種新的數(shù)據(jù)類型,其與numpy中的ndarray類似,可以用于保存多維數(shù)據(jù)。68數(shù)據(jù)集介紹轉(zhuǎn)換為MindSpore要求的數(shù)據(jù)集格式1 train_dataset_t1=generateMindsporeDataset(train_X_t1,train_Y_t1,batch_size=32)2 val_dataset_t1=generateMindsporeDataset(val_X_t1,val_Y_t1,batch_size=32)3 test_dataset_t1=generateMindsporeDataset(test_X_t1,test_Y_t1,batch_size=32)4 fordata,labelintrain_dataset_t1.create_tuple_iterator():5 print('數(shù)據(jù)形狀:',data.shape,',數(shù)據(jù)類型:',data.dtype)6 print('標(biāo)簽形狀:',label.shape,',數(shù)據(jù)類型:',label.dtype)7 break例:生成任務(wù)1的訓(xùn)練集、驗(yàn)證集和測(cè)試集運(yùn)行結(jié)果:數(shù)據(jù)形狀:(32,30,23),數(shù)據(jù)類型:Float32標(biāo)簽形狀:(32,1,23),數(shù)據(jù)類型:Float32提示:通過(guò)batch_size=32,指定每批數(shù)據(jù)包含32條樣本。69數(shù)據(jù)集介紹轉(zhuǎn)換為MindSpore要求的數(shù)據(jù)集格式1 train_dataset_t2=generateMindsporeDataset(train_X_t2,train_Y_t2,batch_size=32)2 val_dataset_t2=generateMindsporeDataset(val_X_t2,val_Y_t2,batch_size=32)3 test_dataset_t2=generateMindsporeDataset(test_X_t2,test_Y_t2,batch_size=32)例:生成任務(wù)2的訓(xùn)練集、驗(yàn)證集和測(cè)試集70任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)基礎(chǔ)理論和方法介紹本案例為任務(wù)1設(shè)計(jì)TCN_MLP模型,使用了多層感知器模塊及卷積模塊。71任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)基礎(chǔ)理論和方法介紹模型結(jié)構(gòu)空間MLP模塊包含4個(gè)全連接層,其作用是對(duì)不同傳感器的數(shù)據(jù)做融合、提取傳感器數(shù)據(jù)關(guān)聯(lián)關(guān)系的特征表示;采用深度學(xué)習(xí)中常用的殘差連接,將生成的特征表示與原始輸入數(shù)據(jù)逐元素相加。72任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)基礎(chǔ)理論和方法介紹模型結(jié)構(gòu)殘差連接輸出的數(shù)據(jù),依次送入兩個(gè)具有3*1卷積核的時(shí)間卷積模塊,其作用是提取各時(shí)間點(diǎn)數(shù)據(jù)關(guān)聯(lián)關(guān)系的特征表示;在進(jìn)行卷積操作時(shí)不進(jìn)行補(bǔ)邊操作,因此經(jīng)過(guò)兩次3*1卷積核的卷積操作后,30*23的數(shù)據(jù)轉(zhuǎn)換為了26*23的數(shù)據(jù)。最后,使用一個(gè)不帶補(bǔ)邊操作的26*1卷積核的卷積操作,將26*23的數(shù)據(jù)轉(zhuǎn)換為1*23的數(shù)據(jù),對(duì)應(yīng)了23個(gè)傳感器的單步預(yù)測(cè)結(jié)果。73任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)代碼實(shí)現(xiàn)和分析步驟1.
定義TCN_MLP類。1 importmindspore2 frommindsporeimportnn3 classTCN_MLP(nn.Cell):#定義TCN_MLP類4 def__init__(self):#構(gòu)造方法5 super().__init__()#調(diào)用父類的構(gòu)造方法在__init__構(gòu)造方法中,定義spatial_mlp、tcn和final_conv共3個(gè)操作。74任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)代碼實(shí)現(xiàn)和分析步驟1.
定義TCN_MLP類。6 #對(duì)不同傳感器的數(shù)據(jù)做融合(提取傳感器數(shù)據(jù)間的關(guān)聯(lián)特征)7 self.spatial_mlp=nn.SequentialCell(8 nn.Dense(sensor_num,128),9 nn.ReLU(),10 nn.Dense(128,64),11 nn.ReLU(),12 nn.Dense(64,32),13 nn.ReLU(),14 nn.Dense(32,sensor_num)15 )spatial_mlp操作對(duì)應(yīng)空間MLP模塊,由全連接層(Dense)和ReLU激活函數(shù)組成。75任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)代碼實(shí)現(xiàn)和分析步驟1.
定義TCN_MLP類。16 #對(duì)時(shí)間序列做卷積(提取時(shí)間點(diǎn)數(shù)據(jù)間的關(guān)聯(lián)特征)17 self.tcn=nn.SequentialCell(18 nn.Conv2d(in_channels=1,out_channels=1,kernel_size=(3,1),pad_mode='valid'),19 nn.Conv2d(in_channels=1,out_channels=1,kernel_size=(3,1),pad_mode='valid'),20 )21 #通過(guò)一個(gè)卷積層得到最后的預(yù)測(cè)結(jié)果22 self.final_conv=nn.Conv2d(in_channels=1,out_channels=1,kernel_size=(26,1),pad_mode='valid')#使用26*1卷積核,不補(bǔ)邊tcn操作對(duì)應(yīng)2個(gè)連續(xù)的3*1時(shí)間卷積;final_conv操作對(duì)應(yīng)最后的26*1時(shí)間卷積。76任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)代碼實(shí)現(xiàn)和分析步驟1.
定義TCN_MLP類。23 defconstruct(self,x,step=None):#construct方法24 #輸入數(shù)據(jù)x的形狀:[batch_size,30,23]25 h=self.spatial_mlp(x)#經(jīng)過(guò)spatial_mlp空間處理后,得到的數(shù)據(jù)h的形狀:[batch_size,30,23]26 x=x+h#殘差連接,將x和h對(duì)應(yīng)元素相加,得到的數(shù)據(jù)x的形狀:[batch_size,30,23]27 x=x.unsqueeze(1)#根據(jù)卷積操作需要,將3維數(shù)據(jù)升為4維數(shù)據(jù):[batch_size,1,30,23]28 x=self.tcn(x)#經(jīng)過(guò)tcn時(shí)間卷積后,得到的數(shù)據(jù)x的形狀:[batch_size,1,26,23]29 y=self.final_conv(x)#通過(guò)26*1的卷積操作后,得到的數(shù)據(jù)y的形狀:[batch_size,1,1,23]30 y=y.squeeze(1)#將前面增加的維度去掉,得到的數(shù)據(jù)y的形狀:[batch_size,1,23]31 returny#返回計(jì)算結(jié)果第27行代碼,調(diào)用unsqueeze方法將x增加一個(gè)長(zhǎng)度為1的通道維度;第30行代碼,調(diào)用squeeze方法將前面增加的通道維度去掉。77任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)代碼實(shí)現(xiàn)和分析步驟2.
定義MODEL_RUN類。1 importmindspore#導(dǎo)入mindspore2 mindspore.set_context(mode=mindspore.GRAPH_MODE)#設(shè)置為靜態(tài)圖模式3 classMODEL_RUN:#定義MODEL_RUN類4 def__init__(self,model,loss_fn,optimizer=None,grad_fn=None):#構(gòu)造方法5 self.model=model#設(shè)置模型6 self.loss_fn=loss_fn#設(shè)置損失函數(shù)7 self.optimizer=optimizer#設(shè)置優(yōu)化器8 self.grad_fn=grad_fn#設(shè)置梯度計(jì)算函數(shù)model參數(shù)用于接收TCN_MLP類的對(duì)象;loss_fn參數(shù)用于接收計(jì)算損失值的函數(shù);optimizer參數(shù)用于接收使用的優(yōu)化器;grad_fn參數(shù)用于接收計(jì)算梯度的函數(shù)。78任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)代碼實(shí)現(xiàn)和分析步驟2.
定義MODEL_RUN類。9 def_train_one_step(self,data,label):#定義用于單步訓(xùn)練的_train_one_step方法10 (loss,_),grads=self.grad_fn(data,label)#根據(jù)數(shù)據(jù)和標(biāo)簽計(jì)算損失和梯度11 self.optimizer(grads)#根據(jù)梯度進(jìn)行模型優(yōu)化12 returnloss#返回?fù)p失值_train_one_step方法:根據(jù)傳入的一個(gè)批次的數(shù)據(jù)(data)和對(duì)應(yīng)的標(biāo)簽(label),調(diào)用self.grad_fn函數(shù)計(jì)算梯度和損失值;再以梯度作為參數(shù)、調(diào)用self.optimizer函數(shù)進(jìn)行模型參數(shù)的優(yōu)化;最后返回當(dāng)前的損失值。79任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)代碼實(shí)現(xiàn)和分析步驟2.
定義MODEL_RUN類。13 def_train_one_epoch(self,train_dataset):#定義用于一輪訓(xùn)練的_train_one_epoch方法14 self.model.set_train(True)#設(shè)置為訓(xùn)練模式15 fordata,labelintrain_dataset.create_tuple_iterator():#取出每一批數(shù)據(jù)16 self._train_one_step(data,label)#調(diào)用_train_one_step方法進(jìn)行模型參數(shù)優(yōu)化_train_one_epoch方法:先調(diào)用set_train方法將模型設(shè)置為訓(xùn)練模式;再通過(guò)for循環(huán)依次取出每批數(shù)據(jù)、并送入_train_one_step方法進(jìn)行模型參數(shù)優(yōu)化。80任務(wù)1.流程工業(yè)控制系統(tǒng)時(shí)序數(shù)據(jù)單步預(yù)測(cè)代碼實(shí)現(xiàn)和分析步驟2.
定義MODEL_RUN類。17 defevaluate(self,dataset,step=None):#定義用于評(píng)估模型的evaluate方法18 self.model.set_train(False)#設(shè)置為測(cè)試模式19 ls_pred,ls_label=[],[]#分別用于保存預(yù)測(cè)結(jié)果和標(biāo)簽20 fordata,labelindataset.create_tuple_iterator():#遍歷每批數(shù)據(jù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 未來(lái)五年報(bào)紙、雜志廣告制作服務(wù)企業(yè)ESG實(shí)踐與創(chuàng)新戰(zhàn)略分析研究報(bào)告
- 2025-2030物聯(lián)網(wǎng)設(shè)備制造領(lǐng)域市場(chǎng)需求供給現(xiàn)狀趨勢(shì)發(fā)展機(jī)遇戰(zhàn)略規(guī)劃分析評(píng)估
- 2025-2030物聯(lián)網(wǎng)智能窗簾自動(dòng)控溫系統(tǒng)需求分析及系統(tǒng)工程實(shí)施協(xié)議
- 2025-2030物聯(lián)網(wǎng)應(yīng)用解決方案市場(chǎng)供求組合及行業(yè)科技投資建議
- 2025-2030物聯(lián)網(wǎng)發(fā)展前景研究深入建材行業(yè)市場(chǎng)數(shù)據(jù)報(bào)告分析
- 2025-2030物流倉(cāng)儲(chǔ)服務(wù)行業(yè)市場(chǎng)分析投資評(píng)估規(guī)劃報(bào)告完整
- 2025-2030物業(yè)管理行業(yè)市場(chǎng)研究及服務(wù)升級(jí)與發(fā)展策略研究報(bào)告
- 智能家居系統(tǒng)功能設(shè)計(jì)與應(yīng)用方案
- 小學(xué)教師招聘考試模擬試題匯編
- 幼兒拼音啟蒙教材與教學(xué)方法
- 輸電專業(yè)十八項(xiàng)反措內(nèi)容宣貫
- 光伏防火培訓(xùn)課件
- 電視節(jié)目編導(dǎo)與制作(全套課件147P)
- 《碳排放管理體系培訓(xùn)課件》
- 2024年人教版八年級(jí)歷史上冊(cè)期末考試卷(附答案)
- 區(qū)間閉塞設(shè)備維護(hù)課件:表示燈電路識(shí)讀
- 壓縮空氣管道安裝工程施工組織設(shè)計(jì)方案
- 《計(jì)算機(jī)組成原理》周建敏主編課后習(xí)題答案
- 人教版二年級(jí)上冊(cè)數(shù)學(xué)全冊(cè)教案(新版教材)
- 人教版數(shù)學(xué)八年級(jí)上冊(cè)《等邊三角形的性質(zhì)和判定》說(shuō)課稿
- SL∕T 291-2020 水利水電工程鉆探規(guī)程(水利)
評(píng)論
0/150
提交評(píng)論