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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

Day03-卷积神经网络原理与使用

發布時間:2025/3/21 卷积神经网络 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Day03-卷积神经网络原理与使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Day03-卷積神經網絡原理與使用

文章目錄

  • Day03-卷積神經網絡原理與使用
    • 作業說明
    • 示例代碼
    • 完成作業

作業說明

今天的實戰項目是基于卷積神經網絡 LeNet的“車牌識別”。

作業要求:

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

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

day03文件夾中包含的就是我們所需要的所有數據。characterData.zip是我們需要使用的數據集,CarID.png是最后用來測試效果的圖片。

示例代碼

  • 導入需要的包
  • import numpy as np import paddle as paddle import paddle.fluid as fluid from PIL import Image import cv2 import matplotlib.pyplot as plt import os from multiprocessing import cpu_count from paddle.fluid.dygraph import Pool2D,Conv2D # from paddle.fluid.dygraph import FCfrom paddle.fluid.dygraph import Linear
  • 生成車牌字符圖像列表
  • data_path = '/home/aistudio/data' character_folders = os.listdir(data_path) label = 0 LABEL_temp = {} if(os.path.exists('./train_data.list')):os.remove('./train_data.list') if(os.path.exists('./test_data.list')):os.remove('./test_data.list') 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' or character_folder == '.ipynb_checkpoints' or character_folder == 'data23617':continueprint(character_folder + " " + str(label))LABEL_temp[str(label)] = character_folder #存儲一下標簽的對應關系character_imgs = os.listdir(os.path.join(data_path, character_folder))for i in range(len(character_imgs)):if i%10 == 0: f_test.write(os.path.join(os.path.join(data_path, character_folder), character_imgs[i]) + "\t" + str(label) + '\n')else:f_train.write(os.path.join(os.path.join(data_path, character_folder), character_imgs[i]) + "\t" + str(label) + '\n')label = label + 1 print('圖像列表已生成')
  • 用上一步生成的圖像列表定義車牌字符訓練集和測試集的reader
  • def data_mapper(sample):img, label = sampleimg = paddle.dataset.image.load_image(file=img, is_color=False)img = img.flatten().astype('float32') / 255.0return img, label def 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(), 1024)
  • 創建數據提供器
  • # 用于訓練的數據提供器 train_reader = paddle.batch(reader=paddle.reader.shuffle(reader=data_reader('./train_data.list'), buf_size=512), batch_size=128) # 用于測試的數據提供器 test_reader = paddle.batch(reader=data_reader('./test_data.list'), batch_size=128)
  • 定義網絡(補全代碼)
  • class MyLeNet(fluid.dygraph.Layer):def __init__(self):super(MyLeNet,self).__init__()self.hidden1_1 = Conv2D()self.hidden1_2 = Pool2D()self.hidden2_1 = Conv2D()self.hidden2_2 = Pool2D()self.hidden3 = Conv2D()self.hidden4 = Linear()def forward(self,input):return y
  • 用動態圖進行訓練
  • with fluid.dygraph.guard():model=MyLeNet() #模型實例化model.train() #訓練模式opt=fluid.optimizer.SGDOptimizer(learning_rate=0.001, parameter_list=model.parameters())#優化器選用SGD隨機梯度下降,學習率為0.001.epochs_num=200 #迭代次數為200for pass_num in range(epochs_num):for batch_id,data in enumerate(train_reader()):images=np.array([x[0].reshape(1,20,20) 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)#預測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(),'MyLeNet')#保存模型
  • 模型校驗
  • with fluid.dygraph.guard():accs = []model=MyLeNet()#模型實例化model_dict,_=fluid.load_dygraph('MyLeNet')model.load_dict(model_dict)#加載模型參數model.eval()#評估模式for batch_id,data in enumerate(test_reader()):#測試集images=np.array([x[0].reshape(1,20,20) 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)
  • 對車牌圖片進行處理,分割出車牌中的每一個字符并保存
  • license_plate = cv2.imread('CarID.png') gray_plate = cv2.cvtColor(license_plate, cv2.COLOR_RGB2GRAY) ret, binary_plate = cv2.threshold(gray_plate, 175, 255, cv2.THRESH_BINARY) result = [] for col in range(binary_plate.shape[1]):result.append(0)for row in range(binary_plate.shape[0]):result[col] = result[col] + binary_plate[row][col]/255 character_dict = {} num = 0 i = 0while i < len(result):if result[i] == 0:i += 1else:index = i + 1while result[index] != 0:index += 1character_dict[num] = [i, index-1]num += 1i = indexfor i in range(8):if i==2:continuepadding = (170 - (character_dict[i][1] - character_dict[i][0])) / 2ndarray = np.pad(binary_plate[:,character_dict[i][0]:character_dict[i][1]], ((0,0), (int(padding), int(padding))), 'constant', constant_values=(0,0))ndarray = cv2.resize(ndarray, (20,20))cv2.imwrite('./' + str(i) + '.png', ndarray)def load_image(path):img = paddle.dataset.image.load_image(file=path, is_color=False)img = img.astype('float32')img = img[np.newaxis, ] / 255.0return img
  • 將標簽進行轉換
  • print('Label:',LABEL_temp) match = {'A':'A','B':'B','C':'C','D':'D','E':'E','F':'F','G':'G','H':'H','I':'I','J':'J','K':'K','L':'L','M':'M','N':'N','O':'O','P':'P','Q':'Q','R':'R','S':'S','T':'T','U':'U','V':'V','W':'W','X':'X','Y':'Y','Z':'Z','yun':'云','cuan':'川','hei':'黑','zhe':'浙','ning':'寧','jin':'津','gan':'贛','hu':'滬','liao':'遼','jl':'吉','qing':'青','zang':'藏','e1':'鄂','meng':'蒙','gan1':'甘','qiong':'瓊','shan':'陜','min':'閩','su':'蘇','xin':'新','wan':'皖','jing':'京','xiang':'湘','gui':'貴','yu1':'渝','yu':'豫','ji':'冀','yue':'粵','gui1':'桂','sx':'晉','lu':'魯','0':'0','1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':'9'} L = 0 LABEL ={}for V in LABEL_temp.values():LABEL[str(L)] = match[V]L += 1 print(LABEL)
  • 構建預測動態圖過程
  • with fluid.dygraph.guard():model=MyLeNet()#模型實例化model_dict,_=fluid.load_dygraph('MyLeNet')model.load_dict(model_dict)#加載模型參數model.eval()#評估模式lab=[]for i in range(8):if i==2:continueinfer_imgs = []infer_imgs.append(load_image('./' + str(i) + '.png'))infer_imgs = np.array(infer_imgs)infer_imgs = fluid.dygraph.to_variable(infer_imgs)result=model(infer_imgs)lab.append(np.argmax(result.numpy())) # print(lab)display(Image.open('CarID.png')) print('\n車牌識別結果為:',end='') for i in range(len(lab)):print(LABEL[str(lab[i])],end='')

    完成作業

    定義 LeNet網絡:

    我們采用了三個卷積層、兩個池化層、一個線性單元,輸出層的激勵函數依然使用的是‘Softmax’分類函數。

    關于卷積層和池化層的參數可以參考這篇博客學習 卷積神經網絡參數含義

    class MyLeNet(fluid.dygraph.Layer):def __init__(self):super(MyLeNet,self).__init__()self.hidden1_1 = Conv2D(1, 28, 5, 1) # 通道數,卷積核個數,卷積核大小,填充數self.hidden1_2 = Pool2D(pool_size=2, pool_type='max', pool_stride=1)self.hidden2_1 = Conv2D(28, 32, 3, 1)self.hidden2_2 = Pool2D(pool_size=2, pool_type='max', pool_stride=1)self.hidden3 = Conv2D(32, 32, 3, 1)self.hidden4 = Linear(32*10*10, 65, act='softmax')def forward(self,input):x = self.hidden1_1(input)x = self.hidden1_2(x)x = self.hidden2_1(x)x = self.hidden2_2(x)x = self.hidden3(x)x = fluid.layers.reshape(x, shape=[-1, 32*10*10])y = self.hidden4(x)return y

    輸入的圖片統一大小是 1* 20* 20 ,在群里和大家討論了里面的參數是怎么計算的

    輸入輸出
    輸入層(1* 20* 20)1* 20* 20
    卷積層1(28* 5* 5,stride=1)28* 16* 16(16=(20-5)/1+1)
    池化層1(2* 2,stride=1)28* 15* 15(15=(16-2)/1+1)
    卷積層2(32* 3* 3,stride=1)32* 13* 13(13=(15-3)/1+1)
    池化層2(2* 2,stride=1)32* 12* 12(12=(13-2)/1+1)
    卷積層3(32* 3* 3,stride=1)32* 10* 10(10=(12-3)/1+1)
    線性層4(32* 10* 10 ->65)10

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

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

    im = Image.open('CarID.PNG') im.show()

    卷積神經網絡果然比全連接的深度神經網絡厲害多了。這次 LeNet網絡是一個經典的 CNN模型。迭代20次準確率就達到了0.84,而 Day02的 DNN需要迭代200次才能達到這個準確率。用CarID.jpg圖片進行測試時,結果大致上是精確的,有一點小錯誤。

    繼續迭代訓練,LeNet迭代50次準確率達到了0.92,準確率已經相當高了;迭代100次之后準確到達了0.945,這個準確率已經可以很好地進行車牌的識別了;迭代200次之后準確率是0.965,提升并不是很大,或許可以考慮其他的參數優化。

    用車牌圖片進行測試,結果完全正確,這個 LeNet網絡真厲害。

    當然,我們也可以繼續增加卷積層和池化層進行訓練,層數深了準確率肯定更高,但是也要注意防止過擬合。

    總結

    以上是生活随笔為你收集整理的Day03-卷积神经网络原理与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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