深度學習入門-深度學習簡介

深度學習是加深了層的深度神經網絡。只需通過疊加層,就可以創建深度網絡。

1、 加深網絡

將深度學習中的重要技術(構成神經網絡的各種層、學習時的有效技巧、對圖像特別有效的CNN、參數的最優化方法等)匯總起來,創建一個深度網絡,對MNIST數據集的手寫數字識別。

1.1、構建網絡

上圖網絡有如下特點:

1、基于3×3的小型濾波器的卷積層。特點是隨著層的加深,通道數變大(卷積層的通道數從前面的層開始按順序以16、16、32、32、64、64的方式增加)

2、插入了池化層,以逐漸減小中間數據的空間大小

3、激活函數是ReLU。

4、全連接層的后面使用Dropout層。

5、基于Adam的最優化。

6、使用He初始值作為權重初始值。

實現代碼:

# 構建深層網絡
import sys, os
sys.path.append(os.pardir)
import pickle
import numpy as np
from collections import OrderedDict
from common.layers import *class DeepConvNet:"""識別率為99%以上的高精度的ConvNet網絡結構如下所示conv - relu - conv- relu - pool -conv - relu - conv- relu - pool -conv - relu - conv- relu - pool -affine - relu - dropout - affine - dropout - softmax"""def __init__(self, input_dim=(1, 28, 28),conv_param_1 = {'filter_num':16, 'filter_size':3, 'pad':1, 'stride':1},conv_param_2 = {'filter_num':16, 'filter_size':3, 'pad':1, 'stride':1},conv_param_3 = {'filter_num':32, 'filter_size':3, 'pad':1, 'stride':1},conv_param_4 = {'filter_num':32, 'filter_size':3, 'pad':2, 'stride':1},conv_param_5 = {'filter_num':64, 'filter_size':3, 'pad':1, 'stride':1},conv_param_6 = {'filter_num':64, 'filter_size':3, 'pad':1, 'stride':1},hidden_size=50, output_size=10):# 初始化權重===========# 各層的神經元平均與前一層的幾個神經元有連接(TODO:自動計算)pre_node_nums = np.array([1*3*3, 16*3*3, 16*3*3, 32*3*3, 32*3*3, 64*3*3, 64*4*4, hidden_size])wight_init_scales = np.sqrt(2.0 / pre_node_nums)  # 使用ReLU的情況下推薦的初始值self.params = {}pre_channel_num = input_dim[0]for idx, conv_param in enumerate([conv_param_1, conv_param_2, conv_param_3, conv_param_4, conv_param_5, conv_param_6]):self.params['W' + str(idx+1)] = wight_init_scales[idx] * np.random.randn(conv_param['filter_num'], pre_channel_num, conv_param['filter_size'], conv_param['filter_size'])self.params['b' + str(idx+1)] = np.zeros(conv_param['filter_num'])pre_channel_num = conv_param['filter_num']self.params['W7'] = wight_init_scales[6] * np.random.randn(64*4*4, hidden_size)self.params['b7'] = np.zeros(hidden_size)self.params['W8'] = wight_init_scales[7] * np.random.randn(hidden_size, output_size)self.params['b8'] = np.zeros(output_size)# 生成層===========self.layers = []self.layers.append(Convolution(self.params['W1'], self.params['b1'], conv_param_1['stride'], conv_param_1['pad']))self.layers.append(Relu())self.layers.append(Convolution(self.params['W2'], self.params['b2'], conv_param_2['stride'], conv_param_2['pad']))self.layers.append(Relu())self.layers.append(Pooling(pool_h=2, pool_w=2, stride=2))self.layers.append(Convolution(self.params['W3'], self.params['b3'], conv_param_3['stride'], conv_param_3['pad']))self.layers.append(Relu())self.layers.append(Convolution(self.params['W4'], self.params['b4'],conv_param_4['stride'], conv_param_4['pad']))self.layers.append(Relu())self.layers.append(Pooling(pool_h=2, pool_w=2, stride=2))self.layers.append(Convolution(self.params['W5'], self.params['b5'],conv_param_5['stride'], conv_param_5['pad']))self.layers.append(Relu())self.layers.append(Convolution(self.params['W6'], self.params['b6'],conv_param_6['stride'], conv_param_6['pad']))self.layers.append(Relu())self.layers.append(Pooling(pool_h=2, pool_w=2, stride=2))self.layers.append(Affine(self.params['W7'], self.params['b7']))self.layers.append(Relu())self.layers.append(Dropout(0.5))self.layers.append(Affine(self.params['W8'], self.params['b8']))self.layers.append(Dropout(0.5))self.last_layer = SoftmaxWithLoss()def predict(self, x, train_flg=False):for layer in self.layers:if isinstance(layer, Dropout):x = layer.forward(x, train_flg)else:x = layer.forward(x)return xdef loss(self, x, t):y = self.predict(x, train_flg=True)return self.last_layer.forward(y, t)def accuracy(self, x, t, batch_size=100):if t.ndim != 1 : t = np.argmax(t, axis=1)acc = 0.0for i in range(int(x.shape[0] / batch_size)):tx = x[i*batch_size:(i+1)*batch_size]tt = t[i*batch_size:(i+1)*batch_size]y = self.predict(tx, train_flg=False)y = np.argmax(y, axis=1)acc += np.sum(y == tt)return acc / x.shape[0]def gradient(self, x, t):# forwardself.loss(x, t)# backwarddout = 1dout = self.last_layer.backward(dout)tmp_layers = self.layers.copy()tmp_layers.reverse()for layer in tmp_layers:dout = layer.backward(dout)# 設定grads = {}for i, layer_idx in enumerate((0, 2, 5, 7, 10, 12, 15, 18)):grads['W' + str(i+1)] = self.layers[layer_idx].dWgrads['b' + str(i+1)] = self.layers[layer_idx].dbreturn gradsdef save_params(self, file_name="params.pkl"):params = {}for key, val in self.params.items():params[key] = valwith open(file_name, 'wb') as f:pickle.dump(params, f)def load_params(self, file_name="params.pkl"):with open(file_name, 'rb') as f:params = pickle.load(f)for key, val in params.items():self.params[key] = valfor i, layer_idx in enumerate((0, 2, 5, 7, 10, 12, 15, 18)):self.layers[layer_idx].W = self.params['W' + str(i+1)]self.layers[layer_idx].b = self.params['b' + str(i+1)]
# 訓練deep_convent
import sys, os
sys.path.append(os.pardir)
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from ch08.deep_convnet import DeepConvNet
from common.trainer import Trainer(x_train, t_train), (x_test, t_test) = load_mnist(flatten=False)network = DeepConvNet()  
trainer = Trainer(network, x_train, t_train, x_test, t_test,epochs=20, mini_batch_size=100,optimizer='Adam', optimizer_param={'lr':0.001},evaluate_sample_num_per_epoch=1000)
trainer.train()# 保存參數
network.save_params("deep_convnet_params.pkl")
print("Saved Network Parameters!")

運行結果:

如上結果,這個網絡的識別精度約為99.4%,錯誤識別率為0.6%。

識別錯誤的例子:

所以,這次的深度CNN盡管識別精度很高,但是對于某些圖像,也犯了和人類同樣的“識別錯誤”。

1.2、進一步提高識別精度-Data Augmentation(數據擴充)

Data Augmentation基于算法“人為地”擴充輸入圖像(訓練圖像)。具體地說,如下圖,對于輸入圖像,通過施加旋轉、垂直或水平方向上的移動等微小變化,增加圖像的數量。這在數據集的圖像數量有限時尤其有效。

除了上圖的變形之外,Data Augmentation還可以通過其他各種方法擴充圖像,比如裁剪圖像的“crop處理”、將圖像左右翻轉的“flip處理”等。對于一般的圖像,施加亮度等外觀上的變化、放大縮小等尺度上的變化也是有效的。綜上,通過Data Augmentation巧妙地增加訓練圖像,可以提高深度學習的識別精度。雖然這個看上去只是一個簡單的技巧,不過經常會有很好的效果。

1.3、加深層的動機

1、與沒有加深層的網絡相比,加深了層的網絡可以用更少的參數達到同等水平(或者更強)的表現力。

疊加小型濾波器來加深網絡的好處是可以減少參數的數量,擴大感受(receptive field,給神經元施加變化的某個局部空間區域)。并且,通過疊加層,將 ReLU等激活函數夾在卷積層的中間,進一步提高了網絡的表現力。

這是因為向網絡添加了基于激活函數的“非線性”表現力,通過非線性函數的疊加,可以表現更加復雜的東西。

例子:

5×5的卷積運算:

重復兩次3×3的卷積層運算

如上,一次5 × 5的卷積運算的區域可以由兩次3 × 3的卷積運算抵充。并且,相對于前者的參數數量25(5 × 5),后者一共是18(2 × 3 × 3),通過疊加卷積層,參數數量減少了。而且,這個參數數量之差會隨著層的加深而變大。比如,重復三次3 × 3的卷積運算時,參數的數量總共是27。而為了用一次卷積運算“觀察”與之相同的區域,需要一個7 × 7的濾波器,此時的參數數量是49。

2、與沒有加深層的網絡相比,加深了層的網絡可以可以減少學習數據,從而高效地進行學習。

在CNN的卷積層中,神經元會對邊緣等簡單的形狀有響應,隨著層的加深,開始對紋理、物體部件等更加復雜的東西有響應。

例子:

要用淺層網絡解決這個問題的話,卷積層需要一下子理解很多“狗”的特征。“狗”有各種各樣的種類,根據拍攝環境的不同,外觀變化也很大。因此,要理解“狗”的特征,需要大量富有差異性的學習數據,而這會導致學習需要花費很多時間。

通過加深網絡,就可以分層次地分解需要學習的問題。因為和印有“狗”的照片相比,包含邊緣的圖像數量眾多,并且邊緣的模式比“狗”的模式結構更簡單。所以,各層需要學習的問題就變成了更簡單的問題。比如,最開始的層只要專注于學習邊緣就好,這樣一來,只需用較少的學習數據就可以高效地進行學習。

2、 代表性網絡

2.1、VGG

VGG是由卷積層和池化層構成的基礎的CNN。

如上圖,VGG的特點:

1、將有權重的層(卷積層或者全連接層)疊加至16層或者19層,具備了深度(稱為“VGG16”或“VGG19”)。

2、基于3×3的小型濾波器的卷積層的運算是連續進行的。如圖,重復進行“卷積層重疊2次到4次,再通過池化層將大小減半”的處理,最后經由全連接層輸出結果。

2.2、GoogLeNet

GoogLeNet的網絡結構如下圖。圖中的矩形表示卷積層、池化層等:

如上圖,GoogLeNet的特點:

1、網絡不僅在縱向上有深度,在橫向上也有深度(廣度)。

2、將Inception結構用作一個構件(構成元素)(橫向上的“廣度”,稱為“Inception結構”。如下圖,Inception結構使用了多個大小不同的濾波器和池化,最后再合并它們的結果)。

2.3、ResNet

ResNet以VGG網絡為基礎,引入快捷結構以加深層,結果如下圖:

ResNet的特點

1、導入“快捷結構”導致即便加深到150層以上,識別精度也會持續提高。

2、通過以2個卷積層為間隔跳躍式地連接來加深層,使其具有比以前的網絡更深的結構。

原理:

在深度學習中,過度加深層的話,很多情況下學習將不能順利進行,導致最終性能不佳。而在ResNet中,為了解決這類問題,導入了“快捷結構”。導入快捷結構后,就可以隨著層的加深而不斷提高性能了(層的加深是有限度的)。

如上圖,這是因為在連續2層的卷積層中,將輸入x跳著連接至2層后的輸出。這里的重點是,通過快捷結構,原來的2層卷積層的輸出F(x)變成了F(x) + x。又因為,通過快捷結構,反向傳播時信號可以無衰減地傳遞。所以通過引入這種快捷結構,即使加深層,也能高效地學習。

3、 深度學習的高速化-卷積層運算高速化

3.1、GPU

由于GPU不僅可以高速地進行圖像處理,也可以高速地進行并行數值計算,因此 ,GPU計算(基于GPU進行通用的數值計算的操作)的目標就是將這種壓倒性的計算能力用于各種用途。

CPU vs GPU:

CPU比較擅長連續的、復雜的計算。

GPU比較擅長大量的乘積累加運算,或者大型矩陣的乘積運算。

綜上,與使用單個CPU相比,使用GPU進行深度學習的運算可以達到驚人的高速化。

3.2、分布式學習

分布式學習:將深度學習的學習過程擴展開來。

為了進一步提高深度學習所需的計算的速度,可以考慮在多個GPU或者多臺機器上進行分布式計算。至于“如何進行分布式計算”是一個非常難的課題。它包含了機器間的通信、數據的同步等多個無法輕易解決的問題。可以將這些難題都交給TensorFlow等優秀的框架。

3.3、運算精度的位數縮減

為了避免流經GPU(或者CPU)總線的數據超過某個限制,要盡可能減少流經網絡的數據的位數。又因為神經網絡的健壯性,深度學習并不那么需要數值精度的位數。所以,在深度學習中,即便是16位的半精度浮點數(half float),也可以順利地進行學習且識別精度不會下降。

代碼證明:

# 證明在深度學習中,即便是16位的半精度浮點數(half float),也可以順利地進行學習
import sys, os
sys.path.append(os.pardir)
import numpy as np
import matplotlib.pyplot as plt
from ch08.deep_convnet import DeepConvNet
from dataset.mnist import load_mnist(x_train, t_train), (x_test, t_test) = load_mnist(flatten=False)network = DeepConvNet()
network.load_params("deep_convnet_params.pkl")sampled = 10000 # 為了實現高速化
x_test = x_test[:sampled]
t_test = t_test[:sampled]print("caluculate accuracy (float64) ... ")
print(network.accuracy(x_test, t_test))# 轉換為float16型
x_test = x_test.astype(np.float16)
for param in network.params.values():param[...] = param.astype(np.float16)print("caluculate accuracy (float16) ... ")
print(network.accuracy(x_test, t_test))

4、 深度學習的應用

深度學習并不局限于物體識別,在圖像、語音、自然語言等各個不同的領域,深度學習都展現了優異的性能。

4.1、物體檢測(R-CNN)

物體檢測是從圖像中確定物體的位置,并進行分類的問題。

解決方法為R-CNN的處理流(R-CNN用一個CNN來完成所有處理,使得高速處理成為可能):

上圖中的第2步和第3步“2.Extract region proposals”(候選區域的提取)和“3.Compute CNN features”(CNN特征的計算)的處理部分。這里,首先(用Selective Search、Faster R-CNN等方法)找出形似物體的區域,然后對提取出的區域應用CNN進行分類。R-CNN中會將圖像變形為正方形,或者在分類時使用SVM(支持向量機),實際的處理流會稍微復雜一些,不過從宏觀上看,也是由剛才的兩個處理(候選區域的提取和CNN特征的計算)構成的。

4.2、圖像分割(FCN)

圖像分割是指在像素水平上對圖像進行分類。如下圖,使用以像素為單位對各個對象分別著色的監督數據進行學習。然后,在推理時,對輸入圖像的所有像素進行分類。

解決方法為用FCN(Fully Convolutional Network)通過一次forward處理,對所有像素進行分類:

FCN即“全部由卷積層構成的網絡”。相對于一般的CNN包含全連接層,FCN將全連接層替換成發揮相同作用的卷積層。在物體識別中使用的網絡的全連接層中,中間數據的空間容量被作為排成一列的節點進行處理,如上圖只由卷積層構成的網絡中,FCN最后導入了擴大空間大小的處理。基于這個處理,變小了的中間數據可以一下子擴大到和輸入圖像一樣的大小,空間容量可以保持原樣直到最后的輸出。

FCN最后進行的擴大處理是基于雙線性插值法的擴大(雙線性插值擴大)。FCN中,這個雙線性插值擴大是通過去卷積(逆卷積運算)來實現的。

4.3、圖像標題的生成(NIC)

給出一個圖像后,會自動生成介紹這個圖像的文字。

解決方法為NIC(Neural Image Caption)模型:

如上圖,NIC由深層的CNN和處理自然語言的RNN(Recurrent Neural Network)構成。

RNN是呈遞歸式連接的網絡,經常被用于自然語言、時間序列數據等連續性的數據上。

NIC基于CNN從圖像中提取特征,并將這個特征傳給RNN。

RNN以CNN提取出的特征為初始值,遞歸地生成文本。

多模態處理:將組合圖像和自然語言等多種信息進行的處理。

4.4、其他應用

1、圖像風格變換:輸入兩個圖像后,會生成一個新的圖像。

2、圖像的生成:事先學習大量圖像后生成新的圖像

3、自動駕駛:計算機代替人類駕駛汽車

4、強化學習(reinforcement learning):像人類通過摸索試驗來自主學習

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915080.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 下安裝DM8數據庫詳細教程

Linux 下安裝DM8數據庫詳細教程 一、環境準備 1.操作系統要求 DM 數據庫支持多種操作系統,如 Windows、Linux 等。對于 Linux 系統,確保內核版本符合要求,例如 CentOS 7 或更高版本。同時,要保證系統有足夠的磁盤空間(建議至少 10GB 以上)和內存(至少 1GB 以上)。 對…

搭建基于Gitee文檔筆記自動發布

搭建基于Gitee文檔筆記自動發布由于現在gitee不支持代理靜態頁面,并且github.io需要VPN,實際使用的話gitee更為方便。一、為服務器和個人PC添加免密push和pull 參考鏈接:https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE…

【Lua】閉包可能會導致的變量問題

先思考下面這個問題:local function counter()local count 0return function()count count 1return countend endlocal a counter() local b counter()print(a()) --> ? print(a()) --> ? print(b()) --> ? print(a()) --> ?輸出結果&#xff…

可觀測性、OpenTracing、OpenCensus、OpenTelemetry、Jaeger

監控與觀測 隨著軟件應用從單片架構向分布式微服務體系轉變,應用監控(Monitoring)和觀測(Observability)的需求也隨之提升。兩者存在相同的定義,目的都是為了發現應用程序中的問題。但還是有差別: 監控:目的是為了捕獲已知的問題…

Linux下使用原始socket收發數據包

在Linux系統中,使用非原始的socket,可以收發TCP或者UDP等網絡層數據包。如果要處理網絡層以下的數據包,比如ICMP、ARP等,或者更底層,比如鏈路層數據包,就得使用原始socket了。 創建socket 創建socket要使用…

暑期自學嵌入式——Day05補充(C語言階段)

接續上文:暑期自學嵌入式——Day05(C語言階段)-CSDN博客 主頁點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!! 主頁: 一位搞嵌入式的 genius-CSDN博…

.NET Core EFCore零基礎快速入門簡單使用

一、什么是 Entity Framework (EF) Core Entity Framework (EF) Core 是輕量化、可擴展和跨平臺版的對象關系映射程序 (O/RM)數據訪問技術,。 它將開發人員從編寫大量 SQL 語句中解放出來。 二、EF的相關程序包 Microsoft.EntityFrameworkCore 核心程序包&#x…

AAC音頻格式

目錄 AAC音頻格式介紹 主要特點 技術優勢 常見文件擴展名 應用領域 AAC與PCM的區別與優勢對比 基本概念差異 主要技術區別 各自優勢 PCM的優勢 AAC的優勢 應用場景選擇 AAC音頻數據格式解析 1. AAC 文件格式 (1) ADIF (Audio Data Interchange Format) (2) ADT…

pom.xml文件中的${}變量從哪里傳值

在 Maven 的 pom.xml 文件中,${} 格式的變量(稱為屬性占位符)的值來源主要有以下幾種途徑: 1. ?內置屬性(Maven 預定義)?? ${project.basedir}:項目根目錄${project.version}:項…

【人工智能】項目案例分析:使用TensorFlow進行大規模對象檢測

????歡迎大家來到我們的天空???? ?? 作者簡介:我們的天空 ??《頭銜》:大廠高級軟件測試工程師,阿里云開發者社區專家博主,CSDN人工智能領域新星創作者。 ??《博客》:人工智能,深度學習,機器學習,python,自然語言處理,AIGC等分享。 所屬的專欄:TensorF…

C++---cout、cerr、clog

在C編程里,cout、cerr和clog是標準庫提供的重要輸出流對象,在數據輸出方面發揮著關鍵作用。 一、cout:標準輸出流 cout 是 std::ostream 類的對象,其作用是向標準輸出設備(一般是控制臺)輸出數據。它和 C 語…

脈沖神經網絡(Spiking Neural Network, SNN)與知識蒸餾(Knowledge Distillation, KD)

目錄 脈沖神經網絡(Spiking Neural Network, SNN) 知識蒸餾(Knowledge Distillation, KD) 三種類別 三種變體 脈沖神經網絡(Spiking Neural Network, SNN) 收到生物神經系統的啟發,設計的&a…

使用Java完成下面項目

第一題:從控制臺輸入十個學生的成績,使用list集合來保存數據, 遍歷并打印其中成績不及格的成績,打印最高成績,最低成績,并計算及格率代碼如下public class Home1 {public static void main(String[] args) …

龍虎榜——20250718

上證指數今天上漲收陽線,繼續在5天均線保持強勢上漲,個股下跌稍多,大盤股上漲為主。深證指數收小陽線,繼續在5天均線上,總體保持強勢,調整更多是小票。2025年7月18日龍虎榜行業方向分析1. 醫藥醫療? 代表標…

2025年華為認證之HCIE-云計算方向的報考流程

一、先搞明白:HCIE - 云計算認證到底是啥? HCIE - 云計算(華為認證 ICT 專家 - 云計算)是華為體系里云計算領域的頂級認證,說白了,就是證明你有能力搞定大型企業的云平臺設計、部署和運維。現在政企、金融…

什么是私有化部署企業即時通訊?吱吱企業即時通訊安全嗎?

在企業數字化轉型加速的今天,溝通工具的選擇已經從滿足簡單溝通,升級為“安全、高效、可控”。其中,“私有化部署企業即時通訊”成為許多中小型企業、跨國企業以及數據敏感型企業的核心需求。 那么,究竟什么是私有化部署&#xff…

Vue3 中使用 Element Plus 實現自定義按鈕的 ElNotification 提示框

在 Vue3 項目中,我們經常會用到 ElNotification 作為消息提醒組件,尤其是在異步操作、任務完成或用戶需要交互確認時。然而,Element Plus 默認的 Notification 是非交互式的,不能直接嵌入按鈕或事件。 今天我們來實現一個帶自定義…

下載webrtc M114版本源碼只能使用外網googlesource源-命令版

聲網、國內源都不行,只能外網googlesource源!!! 二、創建 Ubuntu 容器(帶目錄掛載) 拉取Ubuntu鏡像 docker pull ubuntu:22.04創建并啟動容器(掛載Windows目錄到容器) docker run -i…

Linux運維新手的修煉手扎之第21天

Nginx服務和Tomcat服務1 負載均衡語法格式:upstream[一個或多個]rootubuntu24-13:~# vim /etc/nginx/conf.d/vhost.confupstream group1 {server 10.0.0.16;}upstream group2 {server 10.0.0.14;}server {listen 80;server_name sswang1.magedu.com;location / {pro…

TrOCR: 基于Transformer的光學字符識別方法,使用預訓練模型

溫馨提示: 本篇文章已同步至"AI專題精講" TrOCR: 基于Transformer的光學字符識別方法,使用預訓練模型 摘要 文本識別是文檔數字化中的一個長期研究問題。現有方法通常基于CNN進行圖像理解,基于RNN進行字符級文本生成。此外&#…