深度學習技術基礎與實踐 課件 第4-6章 MindSpore實踐、卷積神經網絡、循環(huán)神經網絡_第1頁
深度學習技術基礎與實踐 課件 第4-6章 MindSpore實踐、卷積神經網絡、循環(huán)神經網絡_第2頁
深度學習技術基礎與實踐 課件 第4-6章 MindSpore實踐、卷積神經網絡、循環(huán)神經網絡_第3頁
深度學習技術基礎與實踐 課件 第4-6章 MindSpore實踐、卷積神經網絡、循環(huán)神經網絡_第4頁
深度學習技術基礎與實踐 課件 第4-6章 MindSpore實踐、卷積神經網絡、循環(huán)神經網絡_第5頁
已閱讀5頁,還剩124頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章MindSpore實踐授課教師:時

間:01概述1.1概述神經網絡概述網絡通過數(shù)據(jù)“學習”網絡對新數(shù)據(jù)進行“預測”網絡訓練網絡推理經過訓練(Training)的神經網絡可以將其所學到的知識應用于現(xiàn)實世界的任務——圖像識別、圖像分割、語言翻譯等各種各樣的應用。神經網絡基于其所訓練的內容對新數(shù)據(jù)進行預測推導的過程就是推理。神經網絡概述02數(shù)據(jù)2.12.2數(shù)據(jù)集張量張量矩陣(2D張量)標量(0維張量)向量(1D張量)更高維張量僅包含一個數(shù)字的張量。在Numpy中,一個float32或float64的數(shù)字就是一個標量張量。數(shù)字組成的數(shù)組。一維張量只有一個軸。向量組成的數(shù)組。矩陣有2個軸,通常叫做行和列??梢詫⒕仃囍庇^地理解為數(shù)字組成的矩形網絡。將多個矩陣合成一個新的數(shù)組,可以得到一個3D張量。以此類推可以得到更高維的張量直觀理解張量Mindspore張量張量定義張量運算MindSpore中張量(Tensor)是一種簡潔而強大的數(shù)據(jù)結構算數(shù)運算線性代數(shù)矩陣處理(裝置,標引,切片)采樣Input_data參數(shù):TensorIntNumpy.arraydtype參數(shù):32mindspre.float64Mindspore張量實現(xiàn)importnumpyasnpfrommindsporeimportTensorfrommindsporeimportdtypeasmstypefrommindspore.opsimportoperationsasops//創(chuàng)建Tensordefinit_Tensor():a=Tensor(input_data=np.array([[1,2],[3,4]]),dtype=mstype.int32)b=Tensor(1.0,mstype.int32)c=Tensor(2)d=Tensor(True,mstype.bool_)e=Tensor((1,2,3),mstype.int16)f=Tensor(Tensor(1.0),mstype.float64)print(a,’\t’,b,’\t’,c,’\n’,d,’\t’,e,’\t’,f)Mindspore張量實現(xiàn)defcompute_Tensor():data1=Tensor(np.array([[0,1],[2,3]]).astype(np.float32))data2=Tensor(np.array([[4,5],[6,7]]).astype(np.float32))mul=ops.Mul()output_mul=mul(data1,data2)#對于合并和連接操作,輸入數(shù)據(jù)需要以列表或元組的形式執(zhí)行操作con=ops.Concat()output_con=con((data1,data2))sta=ops.Stack()output_sta=sta([data1,data2])print(’Mul操作\t\tConcat操作\t\tStack操作\n’,output_mul,’\t\t’,output_con,’\t\t’,output_sta)Mindspore張量實現(xiàn)if__name__==’__main__’:print(”初始化Tensor”)init_Tensor()print(”Tensor之間的運算”)compute_Tensor()Mindspore張量實現(xiàn)初始化Tensor[[1,2]12[3,4]]True[1,2,3]1.0Tensor之間的運算Mul操作Concat操作Stack操作[[0.,5.][[0.1.][[[0.1.][12.,21.]][2.3.][2.3.]][4.5.][[4.5.][6.7.]][6.7.]]]Mindspore數(shù)據(jù)集標準數(shù)據(jù)集數(shù)據(jù)預處理數(shù)據(jù)集加載數(shù)據(jù)集創(chuàng)建mindspore.dataset訪問標準數(shù)據(jù)集

mindspore提供了打亂數(shù)據(jù),分批等預處理接口create_dict_iterator接口用于數(shù)據(jù)加載通過實現(xiàn)__getitem__與__len__函數(shù)實現(xiàn)自定義數(shù)據(jù)用戶自定義數(shù)據(jù)集importmindspore.datasetasdsimportnumpyasnpnp.random.seed(58)classDatasetGenerator:’’’用戶自定義數(shù)據(jù)集類需實現(xiàn)__getitem__函數(shù)與__len__函數(shù)__len__:使迭代器能夠獲得數(shù)據(jù)總量__getitem__:能夠根據(jù)給定的索引值index,獲取數(shù)據(jù)集中的數(shù)據(jù)并返回?!痙ef__init__(self):self.data=np.random.sample((5,2))self.label=np.random.sample((5,1))def__getitem__(self,index):returnself.data[index],self.label[index]def__len__(self):returnlen(self.data)用戶自定義數(shù)據(jù)集defbuildDS_from_Customer():dataset_generator=DatasetGenerator()dataset=ds.GeneratorDataset(dataset_generator,[”data”,”label”],shuffle=False)returndatasetMindspore標準數(shù)據(jù)集defbuildDS_from_MindSpore():#需提前下載cifar10數(shù)據(jù)集DATA_DIR=”/your/path/to/cifar10/train”sampler=ds.SequentialSampler(num_samples=5)dataset=ds.Cifar10Dataset(DATA_DIR,sampler=sampler)returndataset數(shù)據(jù)集預處理defpreprocessing(dataset):ds.config.set_seed(58)#隨機打亂數(shù)據(jù)順序dataset=dataset.shuffle(buffer_size=10)#對數(shù)據(jù)集進行分批dataset=dataset.batch(batch_size=2)returndataset測試代碼if__name__==’__main__’:print(”常見數(shù)據(jù)集”)dataset1=buildDS_from_MindSpore()fordataindataset1.create_dict_iterator():print(”Imageshape:{}”.format(data[’image’].shape),”,Label:{}”.format(data[’label’]))print(”自定義數(shù)據(jù)集”)dataset2=buildDS_from_Customer()fordataindataset2.create_dict_iterator():print(’{}’.format(data[”data”]),’{}’.format(data[”label”]))print(”打亂數(shù)據(jù)集”)dataset2=preprocessing(dataset2)fordataindataset2.create_dict_iterator():print(”data:{}”.format(data[”data”]))print(”label:{}”.format(data[”label”]))運行結果常見數(shù)據(jù)集Imageshape:(32,32,3),Label:6Imageshape:(32,32,3),Label:9Imageshape:(32,32,3),Label:9Imageshape:(32,32,3),Label:4Imageshape:(32,32,3),Label:1自定義數(shù)據(jù)集[0.365105580.45120592][0.78888122][0.496060350.07562207][0.38068183][0.571761580.28963401][0.16271622][0.308804460.37487617][0.54738768][0.815856670.96883469][0.77994068]運行結果打亂數(shù)據(jù)集data:[[0.365105580.45120592][0.571761580.28963401]]label:[[0.78888122][0.16271622]]data:[[0.308804460.37487617][0.496060350.07562207]]label:[[0.54738768][0.38068183]]data:[[0.815856670.96883469]]label:[[0.77994068]]03模型模塊3.13.23.3激活函數(shù)池化層卷積層3.4全連接層3.5Flatten層3.6自定義層模型模塊MindsporeCell類卷積層激活函數(shù)池化層Flatten層卷積層卷積層(Conv)通過定義卷積核,對數(shù)據(jù)進行卷積運算從而提取特征不同的卷積核參數(shù)能夠提取出不同的數(shù)據(jù)特征并濾除其他無關特征卷積層nn.conv2d,nn.conv3D創(chuàng)建2D,3D卷積函數(shù)in_channels:輸入通道數(shù)目out_channels:輸出通道數(shù)stride:步長pad_mode:填充模式卷積層卷積核的數(shù)量決定了特征圖的數(shù)量步長決定了卷積核每次移動的距離卷積步長與卷積核大小、填充模式共同決定了輸出圖像的尺寸大小激活函數(shù)01020304人工神經網絡神經元上的函數(shù)解決非線性問題理論上可以逼近任意函數(shù)用于神經網絡學習復雜函數(shù)sigmoid函數(shù)將實數(shù)映射到(0,1)平滑,易求導運算量大不服從0均值分布網絡深會出現(xiàn)梯度消失的問題Tanh函數(shù)以0為中心收斂快運算量大網絡深會出現(xiàn)梯度消失的問題ReLU函數(shù)稀疏激活性更強的表達能力會出現(xiàn)靜默神經元LeakyReLU函數(shù)負半區(qū)間引入泄露值未激活神經元仍然有很小的梯度減少靜默神經元產生概率尚未證明比ReLU更好MS中構建激活函數(shù)importnumpyasnpimportmindsporeimportmindspore.nnasnnfrommindsporeimportTensordefActivation():sigmoid=nn.Sigmoid()tanh=nn.Tanh()relu=nn.ReLU()leakyrelu=nn.LeakyReLU(0.2)input_x=Tensor(np.array([?1,2,?3,2,?1]),mindspore.float32)output_s=sigmoid(input_x)output_t=tanh(input_x)測試激活函數(shù)if__name__==’__main__’:print(”常見的激活函數(shù)”)Activation()常見的激活函數(shù)sigmoid[0,268941430,8807970,047425870,8807970,26894143]tanh[?0,76159420.9640276?0.99505480.9640276?0.7615942]relu[0.2.0.2.0.]leakyrelu[?0.22.?0.62.?0.2]池化層池化層(Pooling)也叫下采樣層,通常應用于卷積層之后,用于壓縮數(shù)據(jù)特征池化層不僅可以提高計算速度,還減小了過擬合常見的池化函數(shù)為最大池化(maxpool)與平均池化(avgpool)。MS中構建池化層importnumpyasnpimportmindsporeimportmindspore.nnasnnfrommindsporeimportTensordefPooling():max_pool2d=nn.MaxPool2d(kernel_size=2,stride=2)avg_pool2d=nn.AvgPool2d(kernel_size=2,stride=2)input_x=Tensor(np.array([[[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]]]),mindspore.float32)MS中構建池化層avg_pool2d=nn.AvgPool2d(kernel_size=2,stride=2)input_x=Tensor(np.array([[[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]]]),mindspore.float32)#對于2D池化,輸入Tensor的維度需為4#形如[B,C,W,H]#B:批數(shù)batchsize#C:通道數(shù)channels#W:寬度width#H:高度heightoutput_max=max_pool2d(input_x)output_avg=avg_pool2d(input_x)print(”max_pool2d\n”,output_max,”\navg_pool2d\n”,output_avg)測試池化層if__name__==’__main__’:print(”常見的池化層”)Pooling()max_pool2d[[[[2.4.][2.4.]]]]avg_pool2d[[[[1.53.5][1.53.5]]]]全連接層全連接層(Dense)通過對輸入矩陣進行線性變換從而改變Tensor的維度。通常與Flatten層配合使用MS中構建測試全連接層importnumpyasnpimportmindsporeimportmindspore.nnasnnfrommindsporeimportTensordefDense():dense=nn.Dense(400,120,weight_init=’normal’)input_x=Tensor(np.ones([1,400]),mindspore.float32)output=dense(input_x)returnoutput.Shapeif__name__==’__main__’: print(”Dense層”,Dense())Dense層(1,120)全連接層Flatten層用來將輸入“壓平”,即把多維的輸入一維化,常用于卷積層到全連接層的過渡。例如維度為[W,H,C]的Tensor經過Flatten層處理后,會轉換為長度為W*H*C的一維Tensor。MS中構建測試Flatten層importnumpyasnpimportmindsporeimportmindspore.nnasnnfrommindsporeimportTensordefFlatten():flatten=nn.Flatten()input_x=Tensor(np.ones([1,16,5,5]),mindspore.float32)output=flatten(input_x)returnoutput.Shapeif__name__==’__main__’:print(”flatten層”,Flatten())flatten層(1,400)自定義網絡自定義神經網絡結構時,網絡類需要繼承Cell類,并重寫__init__方法和construct方法。其中__init__函數(shù)用于實現(xiàn)父類初始化,而construct函數(shù)用于定義網絡的前向傳播方式。實例化網絡后,網絡各層參數(shù)會自動初始化,這些權重和偏置參數(shù)會在之后的訓練中逐漸優(yōu)化??梢酝ㄟ^使用parameters_and_names()方法訪問所有參數(shù)。MS中自定義LeNet#mynetwork.pyimportnumpyasnpimportmindsporeimportmindspore.nnasnnfrommindsporeimportTensorclassLeNet5(nn.Cell):def__init__(self,num_class=10,num_channel=1):super(LeNet5,self).__init__()#定義所需要的運算self.conv1=nn.Conv2d(num_channel,6,5,pad_mode=’valid’)self.conv2=nn.Conv2d(6,16,5,pad_mode=’valid’)self.fc1=nn.Dense(16?5?5,120)self.fc2=nn.Dense(120,84)self.fc3=nn.Dense(84,num_class)self.relu=nn.ReLU()self.max_pool2d=nn.MaxPool2d(kernel_size=2,stride=2)self.flatten=nn.Flatten()MS中自定義LeNetdefconstruct(self,x):#使用定義好的運算構建前向網絡x=self.conv1(x)x=self.relu(x)x=self.max_pool2d(x)x=self.conv2(x)x=self.relu(x)x=self.max_pool2d(x)x=self.flatten(x)x=self.fc1(x)x=self.relu(x)x=self.fc2(x)x=self.relu(x)x=self.fc3(x)returnx打印模型參數(shù)if__name__==’__main__’:model=LeNet5()print(”打印模型參數(shù)”)forminmodel.parameters_and_names():print(m)打印模型參數(shù)打印模型參數(shù)(’conv1.weight’,Parameter(name=conv1.weight,shape=(6,1,5,5),dtype=Float32,requires_grad=True))(’conv2.weight’,Parameter(name=conv2.weight,shape=(16,6,5,5),dtype=Float32,requires_grad=True))(’fc1.weight’,Parameter(name=fc1.weight,shape=(120,400),dtype=Float32,requires_grad=True))(’fc1.bias’,Parameter(name=fc1.bias,shape=(120,),dtype=Float32,requires_grad=True))(’fc2.weight’,Parameter(name=fc2.weight,shape=(84,120),dtype=Float32,requires_grad=True))(’fc2.bias’,Parameter(name=fc2.bias,shape=(84,),dtype=Float32,requires_grad=True))(’fc3.weight’,Parameter(name=fc3.weight,shape=(10,84),dtype=Float32,requires_grad=True))(’fc3.bias’,Parameter(name=fc3.bias,shape=(10,),dtype=Float32,requires_grad=True))04數(shù)據(jù)歸一化4.1數(shù)據(jù)歸一化數(shù)據(jù)歸一化重要性01隱藏層參數(shù)更新會導致輸出層分布改變0203隨著層數(shù)的增加分布偏移會被放大需要較小的學習率來訓練網絡,初始化參數(shù)會影響訓練效果批歸一化批歸一化(BatchNormalization,BN)是在minibatch維度上在每次訓練iteration時對隱藏層進行歸一化,通過參數(shù)在量級和尺度上做約束,緩和過擬合情況。批歸一化優(yōu)缺點提升訓練速度增加分類效果效果依賴于batchsize小batch效果較差導致batch中樣本細節(jié)丟失批歸一化優(yōu)缺點05損失函數(shù)5.1損失函數(shù)損失函數(shù)定義通過網絡結構進行前向計算實現(xiàn)前向傳播使用損失函數(shù)評估模型當前表現(xiàn),損失越小,效果越好將預測值和真實值的誤差方向傳播優(yōu)化參數(shù)經驗風險損失函數(shù)指預測結果和實際結果的差別結構風險損失函數(shù)是指經驗風險損失函數(shù)加上正則項。MS中構建損失函數(shù)importnumpyasnpimportmindspore.nnasnnfrommindsporeimportTensordefLOSS(output_data,target_data):L1loss=nn.L1Loss()MSELoss=nn.MSELoss()print(”L1loss”,L1loss(output_data,target_data))print(”MSELoss”,MSELoss(output_data,target_data))if__name__==’__main__’:output_data=Tensor(np.array([[1,2,3],[2,3,4]]).astype(np.float32))target_data=Tensor(np.array([[0,2,5],[3,1,1]]).astype(np.float32))LOSS(output_data,target_data)L1loss1.5MSELoss3.166666706優(yōu)化器6.1優(yōu)化器Mindspore優(yōu)化器frommindsporeimportnnfrommynetworkimportLeNet5optim=nn.SGD(params=LeNet5.trainable_params(),learning_rate=0.1)optim=nn.Adam(params=LeNet5.trainable_params(),learning_rate=0.1)得到模型預測誤差后,需要通過梯度下降將其反向傳播以優(yōu)化參數(shù)模型優(yōu)化算法的選擇直接關系到最終模型的性能07訓練7.1訓練訓練得到模型預測誤差后,需要通過梯度下降將其反向傳播以優(yōu)化參數(shù)。MindSpore框架支持三種設備,分別為CPU,GPU與華為Ascend芯片MS中訓練LeNetimportmindspore.datasetasdsimportmindspore.dataset.transforms.c_transformsasCimportmindspore.dataset.vision.c_transformsasCVfrommindsporeimportnn,Tensor,Modelfrommindsporeimportdtypeasmstypefrommindspore.train.callbackimportModelCheckpoint,CheckpointConfigfrommindsporeimportcontextfrommynetworkimportLeNet5#使用CPU訓練,若想改用GPU訓練只需修改device_target.MindSpore支持”Ascend”,”GPU”與”CPU”.context.set_context(mode=context.GRAPH_MODE,device_target=”CPU”)DATA_DIR=”your/path/tp/cifar10/train”net=LeNet5()#定義學習率等超參epochs=5batch_size=64learning_rate=1e?3MS中訓練LeNet#構建數(shù)據(jù)集sampler=ds.SequentialSampler(num_samples=128)dataset=ds.Cifar10Dataset(DATA_DIR,sampler=sampler)#數(shù)據(jù)類型轉換type_cast_op_image=C.TypeCast(mstype.float32)type_cast_op_label=C.TypeCast(mstype.int32)HWC2CHW=CV.HWC2CHW()dataset=dataset.map(operations=[type_cast_op_image,HWC2CHW],input_columns=”image”)dataset=dataset.map(operations=type_cast_op_label,input_columns=”label”)dataset=dataset.batch(batch_size)optim=nn.SGD(params=net.trainable_params(),learning_rate=learning_rate)loss=nn.SoftmaxCrossEntropyWithLogits(sparse=True,reduction=’mean’)#輸入訓練輪次和數(shù)據(jù)集進行訓練model=Model(net,loss_fn=loss,optimizer=optim)model.train(epoch=epochs,train_dataset=dataset)08模型保存與加載1.2模型保存與加載模型保存與加載在模型訓練的過程中,考慮到不可抗因素,需要及時存儲模型參數(shù)。得到Checkpoint文件實際是對應模型的參數(shù)字典。加載模型權重時,需要先創(chuàng)建相同模型的實例load_checkpoint方法會把參數(shù)文件中的網絡參數(shù)加載到字典param_dictload_param_into_net方法則會將讀取的字典進行加載至網絡實例中。MS中保存模型#定義回調對象與回調策略用于保存函數(shù)參數(shù)config_ck=CheckpointConfig(save_checkpoint_steps=32,keep_checkpoint_max=10)ckpt_cb=ModelCheckpoint(prefix=’resnet50’,directory=None,config=config_ckpt)’’’save_checkpoint_steps:每隔多少個step保存一次。keep_checkpoint_max:最多保留CheckPoint文件的數(shù)量。prefix:生成CheckPoint文件的前綴名。directory:存放文件的目錄’’’#輸入訓練輪次和數(shù)據(jù)集進行訓練model.train(epoch=epochs,train_dataset=dataset,callbacks=ckpt_cb)MS中加載模型frommindsporeimportload_checkpoint,load_param_into_netresnet=ResNet50()#將模型參數(shù)存入parameter的字典中param_dict=load_checkpoint(”/path/to/ckpt.ckpt”)#將參數(shù)加載到網絡中l(wèi)oad_param_into_net(resnet,param_dict)model=Model(resnet,loss,metrics={”accuracy”})09鳶尾花實驗9.1鳶尾花實驗鳶尾花數(shù)據(jù)集著名的統(tǒng)計學家和生物學家R.AFisher用其作為線性判別分析的一個例子收集了三類鳶尾花,即Setosa鳶尾花、Versicolour鳶尾花和Virginica鳶尾花數(shù)據(jù)集包括4個屬性,分別為花萼的長、花萼的寬、花瓣的長和花瓣的寬在加拿大加斯帕半島上,于同一天的同一個時間段,使用相同的測量儀器,在相同的牧場上由同一個人測量出來的鳶尾花數(shù)據(jù)集使用配置文件cfg=edict({’data_size’:150,’train_size’:120,#訓練集大小’test_size’:30,#測試集大小’feature_number’:4,#輸入特征數(shù)’num_class’:3,#分類類別’batch_size’:30,’data_dir’:’iris.data’,’save_checkpoint_steps’:5,#多少步保存一次模型’keep_checkpoint_max’:1,#最多保存多少個模型’out_dir_no_opt’:’./model_iris/no_opt’,#保存模型路徑,無優(yōu)化器模型’out_dir_sgd’:’./model_iris/sgd’,#保存模型路徑,SGD優(yōu)化器模型’out_dir_momentum’:’./model_iris/momentum’,#保存模型路徑,momentum模型’out_dir_adam’:’./model_iris/adam’,#保存模型路徑,adam優(yōu)化器模型’output_prefix’:”checkpoint_fashion_forward”#保存模型文件名})使用配置文件#將數(shù)據(jù)集分為訓練集120條,測試集30條。train_idx=np.random.choice(cfg.data_size,cfg.train_size,replace=False)test_idx=np.array(list(set(range(cfg.data_size))?set(train_idx)))X_train,Y_train=X[train_idx],Y[train_idx]X_test,Y_test=X[test_idx],Y[test_idx]defgen_data(X_train,Y_train,epoch_size):XY_train=list(zip(X_train,Y_train))ds_train=dataset.GeneratorDataset(XY_train,[’x’,’y’])ds_train=ds_train.shuffle(buffer_size=cfg.train_size).batch(cfg.batch_size,drop_remainder=True)XY_test=list(zip(X_test,Y_test))ds_test=dataset.GeneratorDataset(XY_test,[’x’,’y’])ds_test=ds_test.shuffle(buffer_size=cfg.test_size).batch(cfg.test_size,drop_remainder=True)returnds_train,ds_test定義訓練測試過程importcsvimportosimporttimeimportnumpyasnpfromeasydictimportEasyDictasedictfrommatplotlibimportpyplotaspltimportmindsporefrommindsporeimportnnfrommindsporeimportcontextfrommindsporeimportdatasetfrommindspore.train.callbackimportTimeMonitor,LossMonitorfrommindsporeimportTensorfrommindspore.train.callbackimportModelCheckpoint,CheckpointConfigfrommindspore.trainimportModelcontext.set_context(mode=context.GRAPH_MODE,device_target=”Ascend”)導入必需包后,選用經典的交叉熵損失作為模型損失函數(shù),定義訓練、測試以及預測過程。訓練函數(shù)傳入模型實例,優(yōu)化器、數(shù)據(jù)集等參數(shù)。定義訓練測試過程#訓練deftrain(network,net_opt,ds_train,prefix,directory,print_times):net_loss=nn.SoftmaxCrossEntropyWithLogits(is_grad=False,sparse=True,reduction=”mean”)model=Model(network,loss_fn=net_loss,optimizer=net_opt,metrics={”acc”})loss_cb=LossMonitor(per_print_times=print_times)config_ck=CheckpointConfig(save_checkpoint_steps=cfg.save_checkpoint_steps,keep_checkpoint_max=cfg.keep_checkpoint_max)ckpoint_cb=ModelCheckpoint(prefix=prefix,directory=directory,config=config_ck)print(”==============StartingTraining==============”)model.train(epoch_size,ds_train,callbacks=[ckpoint_cb,loss_cb],dataset_sink_mode=False)returnmodel定義訓練測試過程#評估預測defeval_predict(model,ds_test):#使用測試集評估模型,打印總體準確率metric=model.eval(ds_test,dataset_sink_mode=False)print(metric)#預測test_=ds_test.create_dict_iterator().get_next()test=Tensor(test_[’x’],mindspore.float32)predictions=model.predict(test)predictions=predictions.asnumpy()foriinrange(10):p_np=predictions[i,:]p_list=p_np.tolist()print(’第’+str(i)+’個sample預測結果:’,p_list.index(max(p_list)),’真實結果:’,test_[’y’][i])無優(yōu)化器訓練#??????????????????????????????????????????????????無優(yōu)化器???????????????????????????????????epoch_size=20print(’??????????????????無優(yōu)化器??????????????????????????’)#數(shù)據(jù)ds_train,ds_test=gen_data(X_train,Y_train,epoch_size)#定義網絡并訓練network=nn.Dense(cfg.feature_number,cfg.num_class)model=train(network,None,ds_train,”checkpoint_no_opt”,cfg.out_dir_no_opt,4)#評估預測eval_predict(model,ds_test)使用SGD優(yōu)化器訓練#???????????????????????????????????????????????????SGD?????????????????????????????????????epoch_size=200lr=0.01print(’???????????????????SGD優(yōu)化器???????????????????????’)#數(shù)據(jù)ds_train,ds_test=gen_data(X_train,Y_train,epoch_size)#定義網絡并訓練、測試、預測network=nn.Dense(cfg.feature_number,cfg.num_class)net_opt=nn.SGD(network.trainable_params(),lr)model=train(network,net_opt,ds_train,”checkpoint_sgd”,cfg.out_dir_sgd,40)#評估預測eval_predict(model,ds_test)使用Momentum優(yōu)化器訓練#????????????????????????????????????????????????????Momentum???????????????????????????????epoch_size=20lr=0.01print(’???????????????????Momentum優(yōu)化器???????????????????????’)#數(shù)據(jù)ds_train,ds_test=gen_data(X_train,Y_train,epoch_size)#定義網絡并訓練network=nn.Dense(cfg.feature_number,cfg.num_class)net_opt=nn.Momentum(network.trainable_params(),lr,0.9)model=train(network,net_opt,ds_train,”checkpoint_momentum”,cfg.out_dir_momentum,4)#評估預測eval_predict(model,ds_test)使用Adam優(yōu)化器訓練#????????????????????????????????????????????????????Adam???????????????????????????????????epoch_size=15lr=0.1print(’??????????????????Adam優(yōu)化器??????????????????????????’)#數(shù)據(jù)ds_train,ds_test=gen_data(X_train,Y_train,epoch_size)#定義網絡并訓練network=nn.Dense(cfg.feature_number,cfg.num_class)net_opt=nn.Adam(network.trainable_params(),learning_rate=lr)model=train(network,net_opt,ds_train,”checkpoint_adam”,cfg.out_dir_adam,4)#評估預測eval_predict(model,ds_test)習題1.簡單說下sigmoid激活函數(shù)。2.Sigmoid、Tanh、ReLu這三個激活函數(shù)有什么缺點或不足,有沒改進的激活函數(shù)?3.為什么引入非線性激勵函數(shù)?4.如何解決梯度消失和梯度膨脹?5.神經網絡中激活函數(shù)的真正意義?一個激活函數(shù)需要具有哪些必要的屬性?還有哪些屬性是好的屬性但不必要的?6.簡單說說CNN常用的幾個模型。7.什么是卷積?8.梯度下降法的神經網絡容易收斂到局部最優(yōu),為什么應用廣泛?9.神經網絡中,是否隱藏層如果具有足夠數(shù)量的單位,它就可以近似任何連續(xù)函數(shù)?習題10.為什么更深的網絡更好?11.更多的數(shù)據(jù)是否有利于更深的神經網絡?12.什么是歸一化,它與標準化的區(qū)別是什么?13.批大小如何影響測試正確率?14.如何確定使用BN還是IN?15.使用LeNet實現(xiàn)一個MNIST數(shù)據(jù)集手寫數(shù)字識別。(MNIST數(shù)據(jù)集下載頁面:/exdb/mnist/。頁面提供4個數(shù)據(jù)集下載鏈接,其中前2個文件是訓練數(shù)據(jù)需要,后2個文件是測試結果需要)第5章卷積神經網絡授課教師:時

間:01概述卷積神經網絡概述重要概念與基本部件卷積神經網絡模型編程實戰(zhàn)卷積神經網絡概述—歷史溯源卷積神經網絡CNN是一類特殊的人工神經網絡特點:卷積運算操作應用:圖像分類、目標檢測、圖像語義分割、圖像檢索1959感受野神經認知19801987TDNNSIANN19881989LeNetNCR19931998LeNet-5OCR20032006深度學習AlexNet2012ResNet20152014VGGNet重要概念與基本組件—卷積定義:通過一個特定大小的矩陣與上層感受野區(qū)域矩陣做點積運算從而得到下層神經元的特征輸出,這個特定大小的矩陣叫做卷積核,也稱濾波器(convolutionkernel或convolutionfilter)

輸入矩陣與卷積核卷積操作示例重要概念與基本組件—感受野定義:CNN每一層輸出的特征圖(featuremap)上每個像素點在原始圖像上映射的區(qū)域大小。神經元之所以無法對原始圖像的所有信息進行感知,是因為在卷積神經網絡中普遍使用卷積層和池化層,層與層之間均為局部連接。特征圖上的一個點對應輸入圖上的區(qū)域重要概念與基本組件—池化定義:圖像某個領域內只需要一個像素點就能表達整個區(qū)域的信息,因此可以采用類似于圖像壓縮的思想,對圖像進行卷積之后,通過一個下采樣過程,來調整特征圖的大小。通過最大池化,完成特征圖壓縮,規(guī)模減少至4分之1重要概念與基本組件—激活函數(shù)神經網絡使用激活函數(shù)來加入非線性因素,以提高模型的表達能力。常見的激活函數(shù)有Sigmoid,Tanh,ReLU等

值域:(0,1)反向傳播中,容易就會出現(xiàn)梯度消失值域:(-1,1)減輕梯度消失問題值域:(0,

x)有助于隨機梯度下降收斂卷積神經網絡模型—LeNet典型卷積神經網絡由輸入層、卷積層、池化層、全連接層和輸出層堆疊構成。卷積神經網絡LeNet結構如下圖自編碼器自編碼器(AutoEncoder,AE),是一種利用反向傳播算法使得輸出值等于輸入值的神經網絡。如下圖所示,構建一個自編碼器需要兩部分:編碼器(Encoder)和解碼器(Decoder)。

自編碼器—特點數(shù)據(jù)相關性。自編碼器只能壓縮與自己此前訓練數(shù)據(jù)類似的數(shù)據(jù),比如使用mnist訓練出來的自編碼器用來壓縮人臉圖片,效果較差,所以自編碼器需要處理相關聯(lián)的數(shù)據(jù);數(shù)據(jù)有損性。自編碼器在解壓時得到的輸出與原始輸入相比,存在信息損失,所以自編碼器是一種數(shù)據(jù)有損的壓縮算法;自動學習性。自動編碼器是從數(shù)據(jù)樣本中自動學習的,這意味著很容易對指定類的輸入訓練出一種特定的編碼器,而不需要完成任何新工作。編程實戰(zhàn)通過以下三個任務,完成編程實戰(zhàn),鞏固前饋神經網絡的學習與理解。從頭開始訓練網絡模型。利用Keras或者PyTorch平臺從頭搭建網絡模型,使用少量樣本,完成貓狗圖像的分類任務;使用預訓練模型。預訓練模型在大型數(shù)據(jù)集上已完成訓練,編程實戰(zhàn)中在預訓練模型的基礎上,針對圖像分類問題進行微調,完成預測;構建基本卷積神經網絡進行圖像分類數(shù)據(jù)準備使用貓狗大戰(zhàn)過濾數(shù)據(jù)集,來源/birajsth/cats-and-dogs-filtered數(shù)據(jù)集包含了3000張貓和狗的彩色圖片圖像預處理:歸一化、調整大小構建基本卷積神經網絡進行圖像分類過擬合問題樣本量太少模型過于復雜訓練回合太多構建基本卷積神經網絡進行圖像分類數(shù)據(jù)增強和正則對圖像進行平移/旋轉/縮放等給模型增加Dropout正則化原模型添加Dropout基于預訓練模型進行遷移學習數(shù)據(jù)準備對CATS_VS_DOGS數(shù)據(jù)集進行圖像分類;數(shù)據(jù)集包含了60,000張貓和狗的彩色圖片;如圖中所示貓和狗兩種類別?;陬A訓練模型進行遷移學習準備預訓練模型預訓練的模型是之前在大型數(shù)據(jù)集上訓練過后保存的網絡;可以直接使用預先訓練的模型,也可以使用遷移學習將模型在給定的任務進行自定義。本實驗基于VGG16深度卷積神經網絡,以及在ImageNet上的預訓練權重?;陬A訓練模型進行遷移學習準備預訓練模型預訓練的模型是之前在大型數(shù)據(jù)集上訓練過后保存的網絡;可以直接使用預先訓練的模型,也可以使用遷移學習將模型在給定的任務進行自定義。本實驗基于VGG16深度卷積神經網絡,以及在ImageNet上的預訓練權重?;陬A訓練模型進行遷移學習預訓練模型當作特征提取器權重參數(shù)不變權重參數(shù)變化基于預訓練模型進行遷移學習基于預訓練模型進行微調權重參數(shù)微調編程實戰(zhàn)實驗總結要了解為什么要進行遷移學習;要熟悉遷移學習進行的最基本的方式;要掌握基于Keras或者PyTorch等深度學習框架進行遷移學習的流程;對于一些超參數(shù)的調整,優(yōu)化器、損失函數(shù)的選擇更有把控。源碼鏈接:/s/1Q4-1xSYqEzUeHjNFRDmXjg?pwd=famy提取碼:famy第6章循環(huán)神經網絡授課教師:時

間:目錄6.16.26.3基本結構經典模型概述循環(huán)神經網絡的發(fā)展過程循環(huán)神經網絡模型重要組件及基本結構簡單循環(huán)神經網絡、深度循環(huán)神經網絡、長短期記憶網絡6.4編程實戰(zhàn)利用MindSpore構建RNN模型實現(xiàn)單詞分類任務基于MindSpore的LSTM-IMDB情感分類分享體驗6.11概述循環(huán)神經網絡的發(fā)展過程隨著大數(shù)據(jù)時代的來臨,數(shù)據(jù)的存在形式和模態(tài)多種多樣,現(xiàn)實世界中每時每刻都在產生著各類數(shù)據(jù),如:文本數(shù)據(jù)、音頻數(shù)據(jù)、視頻數(shù)據(jù)、用戶行為數(shù)據(jù)等。我們將這類具有發(fā)生時間先后順序和內在依賴關系的數(shù)據(jù)稱為序列數(shù)據(jù)。從網絡結構的角度可以將神經網絡分為前饋神經網絡(FeedforwardNeuralNetwork,FNN)和循環(huán)神經網絡(RecurrentNeuralNetwork,RNN)。例子1:IliveinChina.IlikeeatingChinese<food>.。前饋神經網絡:信息總是從輸入層向輸出層單向傳播,任一時刻的輸出僅依賴于前一時刻的輸入,沒有考慮數(shù)據(jù)之間的關聯(lián)性,難以對時序數(shù)據(jù)進行建模。循環(huán)神經網絡:一種具有記憶功能的神經網絡來存儲歷史信息,從而輔助預測當前時刻的輸出結果。循環(huán)神經網絡的出現(xiàn)使得網絡具有記憶能力,一定程度上提升了分類預測任務的準確性,推動了序列數(shù)據(jù)建模的發(fā)展。循環(huán)神經網絡的發(fā)展過程1986年,MichaelI.Jordan提出了Jordan網絡。隨后,JeffreyElman提出了簡單循環(huán)網絡(SimpleRecurrentNetwork,SRN)。一年后,SeppHochreiter發(fā)現(xiàn)梯度消失和梯度爆炸的現(xiàn)象。Hochreiter與其合作者提出了長短期記憶網絡(LongShort-TermMemoryNetwork,LSTM)。各類變體被提出如:BiLSTM、Tree-LSTM、GraphLSTM等。二十一世紀以來,在語音識別、語言建模等領域獲得廣泛應用。

循環(huán)神經網絡經歷了多年的發(fā)展,圖6.1展示了其中幾個重要節(jié)點。圖6.1:循環(huán)神經網絡的發(fā)展過程6.22基本結構隱狀態(tài)、門控機制及基本計算圖

6.33經典模型6.3.1簡單循環(huán)神經網絡在簡單循環(huán)神經網絡中,由于語音、文本、視頻等數(shù)據(jù)的長度一般是不固定的,因此無法保證每次輸入的句子都具有同樣數(shù)量的因素,這就導致了傳統(tǒng)神經網絡難以處理序列數(shù)據(jù)。循環(huán)神經網絡作為一種典型的反饋神經網絡被提出用于處理信息的前后依賴。其結構如圖6.2所示。對比可以發(fā)現(xiàn)循環(huán)神經網絡相較于傳統(tǒng)神經網絡增加了一個隱藏層到隱藏層的循環(huán)。這樣一來,通過短期記憶能力,在自然語言處理、語音識別等領域中面對輸入樣本具有時間或者空間上的依賴時,可以對這類數(shù)據(jù)進行更好的建模。圖6.2:循環(huán)神經網絡展開結構圖6.3.1簡單循環(huán)神經網絡

6.3.2深度循環(huán)神經網絡多層循環(huán)神經網絡如圖6.3所示。圖中的黑色方塊表示在該處會延遲一個時刻,右邊矩形框表示上一時刻的狀態(tài)。循環(huán)神經網絡可以通過多種方式使其結構變得更深。圖6.3:多層循環(huán)神經網絡圖6.3(a)所示層次結構中較低的層起到了將原始輸入轉化為對更高層的隱藏狀態(tài)更合適

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論