日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

Day02-深度学习原理与使用方法

發布時間:2025/3/21 pytorch 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Day02-深度学习原理与使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Day02-深度學習原理與使用方法

文章目錄

  • Day02-深度學習原理與使用方法
    • 作業說明
    • 示例代碼
    • 完成作業

作業說明

今天的實戰項目是基于深度神經網絡的“手勢識別”。

作業要求:

  • 1、根據課上所學內容,構建 DNN模型并跑通。在此基礎上可嘗試構造其他網絡。
  • 2、思考并動手進行調參、優化,提高測試集準確率

課件和數據集的鏈接請去緒論部分尋找 正式學習前的緒論

day02文件夾中包含的就是我們所需要的所有數據。Dataset.zip是我們需要使用的數據集,手勢.jpg是最后用來測試效果的圖片。

示例代碼

  • 導入python庫
  • import os import time import random import numpy as np from PIL import Image import matplotlib.pyplot as plt import paddle import paddle.fluid as fluid import paddle.fluid.layers as layers from multiprocessing import cpu_count from paddle.fluid.dygraph import Pool2D,Conv2D from paddle.fluid.dygraph import Linear
  • 生成圖像列表
  • # Dataset就是數據集 data_path = 'Dataset' character_folders = os.listdir(data_path) # print(character_folders)if(os.path.exists('./train_data.list')):os.remove('./train_data.list') if(os.path.exists('./test_data.list')):os.remove('./test_data.list')# 按照9:1劃分訓練集和測試集 for character_folder in character_folders:with open('./train_data.list', 'a') as f_train:with open('./test_data.list', 'a') as f_test:if character_folder == '.DS_Store':continuecharacter_imgs = os.listdir(os.path.join(data_path,character_folder))count = 0 for img in character_imgs:if img =='.DS_Store':continueif count%10 == 0:f_test.write(os.path.join(data_path,character_folder,img) + '\t' + character_folder + '\n')else:f_train.write(os.path.join(data_path,character_folder,img) + '\t' + character_folder + '\n')count +=1 print('列表已生成')
  • 定義訓練集和測試集的reader
  • def data_mapper(sample):img, label = sampleimg = Image.open(img)img = img.resize((100, 100), Image.ANTIALIAS)img = np.array(img).astype('float32')img = img.transpose((2, 0, 1))img = img/255.0return img, labeldef data_reader(data_list_path):def reader():with open(data_list_path, 'r') as f:lines = f.readlines()for line in lines:img, label = line.split('\t')yield img, int(label)return paddle.reader.xmap_readers(data_mapper, reader, cpu_count(), 512)
  • 創建數據提供器
  • # 用于訓練的數據提供器 train_reader = paddle.batch(reader=paddle.reader.shuffle(reader=data_reader('./train_data.list'), buf_size=256), batch_size=32) # 用于測試的數據提供器 test_reader = paddle.batch(reader=data_reader('./test_data.list'), batch_size=32)
  • 定義DNN網絡(補全代碼)
  • class MyDNN(fluid.dygraph.Layer):def __init__(self):super(MyDNN,self).__init__()self.hidden1 = Linear()self.hidden2 = Linear()self.hidden3 = Linear()self.hidden4 = Linear()def forward(self,input):return y
  • 用動態圖進行訓練
  • with fluid.dygraph.guard():model=MyDNN() #模型實例化model.train() #訓練模式opt=fluid.optimizer.SGDOptimizer(learning_rate=0.01, parameter_list=model.parameters())#優化器選用SGD隨機梯度下降,學習率為0.01.epochs_num=20 #迭代次數for pass_num in range(epochs_num):for batch_id,data in enumerate(train_reader()):images=np.array([x[0].reshape(3,100,100) for x in data],np.float32)labels = np.array([x[1] for x in data]).astype('int64')labels = labels[:, np.newaxis]# print(images.shape)image=fluid.dygraph.to_variable(images)label=fluid.dygraph.to_variable(labels)predict=model(image)#預測# print(predict)loss=fluid.layers.cross_entropy(predict,label)avg_loss=fluid.layers.mean(loss)#獲取loss值acc=fluid.layers.accuracy(predict,label)#計算精度if batch_id!=0 and batch_id%50==0:print("train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num,batch_id,avg_loss.numpy(),acc.numpy()))avg_loss.backward()opt.minimize(avg_loss)model.clear_gradients()fluid.save_dygraph(model.state_dict(),'MyDNN')#保存模型
  • 模型校驗
  • with fluid.dygraph.guard():accs = []model_dict, _ = fluid.load_dygraph('MyDNN')model = MyDNN()model.load_dict(model_dict) #加載模型參數model.eval() #訓練模式for batch_id,data in enumerate(test_reader()):#測試集images=np.array([x[0].reshape(3,100,100) for x in data],np.float32)labels = np.array([x[1] for x in data]).astype('int64')labels = labels[:, np.newaxis]image=fluid.dygraph.to_variable(images)label=fluid.dygraph.to_variable(labels)predict=model(image) acc=fluid.layers.accuracy(predict,label)accs.append(acc.numpy()[0])avg_acc = np.mean(accs)print(avg_acc)
  • 讀取預測圖像,進行預測
  • def load_image(path):img = Image.open(path)img = img.resize((100, 100), Image.ANTIALIAS)img = np.array(img).astype('float32')img = img.transpose((2, 0, 1))img = img/255.0print(img.shape)return img
  • 構建預測動態圖過程
  • with fluid.dygraph.guard():infer_path = '手勢.JPG'model=MyDNN()#模型實例化model_dict,_=fluid.load_dygraph('MyDNN')model.load_dict(model_dict)#加載模型參數model.eval()#評估模式infer_img = load_image(infer_path)infer_img=np.array(infer_img).astype('float32')infer_img=infer_img[np.newaxis,:, : ,:]infer_img = fluid.dygraph.to_variable(infer_img)result=model(infer_img)display(Image.open('手勢.JPG'))print(np.argmax(result.numpy()))

    完成作業

    定義DNN網絡:

    我們定義了三個隱藏層,激活函數都是使用的‘ReLu’線性整流函數,輸出層的激勵函數使用的是‘Softmax’分類函數。

    Sigmoid函數或 Softmax函數可以將分類器的原始輸出值映射為概率,然而 Sigmoid函數和 Softmax函數會得出不同結果。
    原因在于,Sigmoid函數會分別處理各個原始輸出值,因此其結果相互獨立,概率總和不一定為1。Softmax函數的輸出值相互關聯,其概率的總和始終為1。

    class MyDNN(fluid.dygraph.Layer):def __init__(self):super(MyDNN,self).__init__()# 定義三層隱藏層,輸入維度和輸出維度都是100,激活函數為ReLuself.hidden1 = Linear(input_dim=100, output_dim=100, act='relu')self.hidden2 = Linear(input_dim=100, output_dim=100, act='relu')self.hidden3 = Linear(input_dim=100, output_dim=100, act='relu')# 定義輸出層,輸入維度3*100*100,輸出維度100,激勵函數softmaxself.hidden4 = Linear(input_dim=3*100*100, output_dim=10, act='softmax')def forward(self,input):x = self.hidden1(input)x = self.hidden2(x)x = self.hidden3(x)x = fluid.layers.reshape(x, shape=[-1, 3 * 100 * 100])y = self.hidden4(x)return y

    如果是在百度AIStudio平臺上,直接補全代碼運行即可。

    如果是把代碼復制到本地來運行,還需要修改一處地方才能運行。把第9步的 display(Image.open(‘手勢.JPG’))改成

    im = Image.open('手勢.JPG') im.show()

    示例中在第6步,動態圖訓練時,定義的迭代次數是20次,可以看到,訓練集上的準確率 train_acc并不高。

    用測試集進行模型校驗的結果在0.20左右,這個準確率實在是太低了。

    最后用手勢.jpg圖片進行測試時,果不其然會出錯。正確結果應該是5而預測結果是1。

    于是我們要想辦法提高準確率,一種調參方式是增加迭代次數,對神經網絡反復進行訓練。我們把迭代次數改為200次,訓練集的準確率到后期會很高。

    測試集準確率提升為0.82,這是一個不錯的提升。

    用手勢圖片進行測試,結果也是正確的。

    還有一種調參方式是修改學習率,我們在第六步動態圖訓練時采取的學習率是0.01,可以改為0.005再次嘗試。或者我們可以更改優化器,將 SGD優化器換成別的優化器試試效果。助教表示,用調參優化比較好的 DNN可以達到 0.95左右的準確率。

    當然,我們也可以構造其他網絡,比如 CNN、RNN等。

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的Day02-深度学习原理与使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。