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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

VGG卷积神经网络模型加载与运行

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VGG卷积神经网络模型加载与运行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1,VGG概述

VGG Net由牛津大學的視覺幾何組(Visual Geometry Group)和 Google DeepMind公司的研究員一起研發的的深度卷積神經網絡,在 ILSVRC 2014 上取得了第二名的成績,將 Top-5錯誤率降到7.3%。它主要的貢獻是展示出網絡的深度(depth)是算法優良性能的關鍵部分。他們最好的網絡包含了16個卷積/全連接層。網絡的結構非常一致,從頭到尾全部使用的是3x3的卷積和2x2的匯聚。VGGNet不好的一點是它耗費更多計算資源,并且使用了更多的參數,導致更多的內存占用(140M)。其中絕大多數的參數都是來自于第一個全連接層。后來發現這些全連接層即使被去除,對于性能也沒有什么影響,這樣就顯著降低了參數數量。

目前使用比較多的網絡結構主要有ResNet(152-1000層),GooleNet(22層),VGGNet(19層),大多數模型都是基于這幾個模型上改進,采用新的優化算法,多模型融合等。到目前為止,VGG Net 依然經常被用來提取圖像特征。

2,GVV19的結構圖

輸入是大小為224224的RGB圖像,預處理(preprocession)時計算出三個通道的平均值,在每個像素上減去平均值(處理后迭代更少,更快收斂)。圖像經過一系列卷積層處理,在卷積層中使用了非常小的33卷積核,在有些卷積層里則使用了11的卷積核。卷積層步長(stride)設置為1個像素,33卷積層的填充(padding)設置為1個像素。池化層采用max pooling,共有5層,在一部分卷積層后,max-pooling的窗口是2*2,步長設置為2。卷積層之后是三個全連接層(fully-connected layers,FC)。前兩個全連接層均有4096個通道,第三個全連接層有1000個通道,用來分類。所有網絡的全連接層配置相同。全連接層后是Softmax,用來分類。所有隱藏層(每個conv層中間)都使用ReLU作為激活函數。

VGGNet不使用局部響應標準化(LRN),這種標準化并不能在ILSVRC數據集上提升性能,卻導致更多的內存消耗和計算時間(LRN:Local Response Normalization,局部響應歸一化,用于增強網絡的泛化能力)。

3,優化討論


1、選擇采用33的卷積核是因為33是最小的能夠捕捉像素8鄰域信息的的尺寸。

2、使用1*1的卷積核目的是在不影響輸入輸出的維度情況下,對輸入進行形變,再通過ReLU進行非線性處理,提高決策函數的非線性。

3、2個33卷積堆疊等于1個55卷積,3個33堆疊等于1個77卷積,感受野大小不變,而采用更多層、更小的卷積核可以引入更多非線性(更多的隱藏層,從而帶來更多非線性函數),提高決策函數判決力,并且帶來更少參數。唯一的不足是,在進行反向傳播時,中間的卷積層可能會導致占用更多的內存。

4、每個VGG網絡都有3個FC層,5個池化層,1個softmax層。

5、在FC層中間采用dropout層,防止過擬合,如下圖:
左邊的圖為一個完全的全連接層,右邊為應用dropout后的全連接層。
我們知道,典型的神經網絡其訓練流程是將輸入通過網絡進行正向傳導,然后將誤差進行反向傳播。dropout就是針對這一過程之中,隨機地刪除隱藏層的部分單元,進行上述過程。步驟為:
(1)隨機刪除網絡中的一些隱藏神經元,保持輸入輸出神經元不變;
(2)將輸入通過修改后的網絡進行前向傳播,然后將誤差通過修改后的網絡進行反向傳播;
(3)對于另外一批的訓練樣本,重復上述操作(1)。

Dropout可以有效防止過擬合,原因是:
(1)達到了一種vote的作用。對于單個神經網絡而言,將其進行分批,即使不同的訓練集可能會產生不同程度的過擬合,但是我們如果將其公用一個損失函數,相當于對其同時進行了優化,取了平均,因此可以較為有效地防止過擬合的發生。
(2)減少神經元之間復雜的共適應性。當隱藏層神經元被隨機刪除之后,使得全連接網絡具有了一定的稀疏化,從而有效地減輕了不同特征的協同效應。也就是說,有些特征可能會依賴于固定關系的隱含節點的共同作用,而通過dropout的話,就有效地阻止了某些特征在其他特征存在下才有效果的情況,增加了神經網絡的魯棒性。
6、如今用得最多的是VGG16(13層conv + 3層FC)和VGG19(16層conv + 3層FC),注意算層數時不算maxpool層和softmax層,只算conv層和fc層。

4,模型訓練

訓練采用多尺度訓練(Multi-scale),將原始圖像縮放到不同尺寸 S,然后再隨機裁切224*224的圖片,并且對圖片進行水平翻轉和隨機RGB色差調整,這樣能增加很多數據量,對于防止模型過擬合有很不錯的效果。

初始對原始圖片進行裁剪時,原始圖片的最小邊不宜過小,這樣的話,裁剪到224*224的時候,就相當于幾乎覆蓋了整個圖片,這樣對原始圖片進行不同的隨機裁剪得到的圖片就基本上沒差別,就失去了增加數據集的意義,但同時也不宜過大,這樣的話,裁剪到的圖片只含有目標的一小部分,也不是很好。

針對上述裁剪的問題,提出的兩種解決辦法:
(1) 固定最小邊的尺寸為256;
(2) 隨機從[256,512]的確定范圍內進行抽樣,這樣原始圖片尺寸不一,有利于訓練,這個方法叫做尺度抖動(scale jittering),有利于訓練集增強。

5,模型測試

將全連接層等效替換為卷積層進行測試,原因是:
卷積層和全連接層的唯一區別就是卷積層的神經元和輸入是局部聯系的,并且同一個通道(channel)內的不同神經元共享權值(weight)。卷積層和全連接層的計算實際上相同,因此可以將全連接層轉換為卷積層,只要將卷積核大小設置為輸入空間大小即可:例如輸入為77512,第一層全連接層輸出4096;我們可以將其看作卷積核大小為77,步長為1,沒有填充,輸出為11*4096的卷積層。這樣的好處在于輸入圖像的大小不再受限制,因此可以高效地對圖像作滑動窗式預測;而且全連接層的計算量比較大,等效卷積層的計算量減小了,這樣既達到了目的又十分高效。

6,存在的問題

(1)雖然 VGGNet 減少了卷積層參數,但實際上其參數空間比 AlexNet 大,其中絕大多數的參數都是來自于第一個全連接層,耗費更多計算資源。在隨后的 NIN 中發現將這些全連接層替換為全局平均池化,對于性能影響不大,同時顯著降低了參數數量。
(2)采用 Pre-trained 方法訓練的 VGG model(主要是 D 和 E),相對其他的方法參數空間很大,所以訓練一個 VGG 模型通常要花費更長的時間,所幸有公開的 Pre-trained model 讓我們很方便的使用。Imagenet VGG-19參數下載地址:http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat

7,模型加載與運行

加載Imagenet VGG-19完整代碼如下:

import scipy.io    #讀寫.mat文件(可以加載和保存matlab文件)
import numpy as np 
import os #os模塊提供了多數操作系統的功能接口函數。當os模塊被導入后,它會自適應于不同的操作系統平臺,根據不同的平臺進行相應的操作,在python編程時,經常和文件、目錄打交道,所以離不了os模塊
import scipy.misc  #是npy文件的圖片,都可以用指定的格式保存
import matplotlib.pyplot as plt 
import tensorflow as tf #Functions for VGG
def _conv_layer(input, weights, bias):#卷積操作conv = tf.nn.conv2d(input, tf.constant(weights), strides=(1, 1, 1, 1),padding='SAME')return tf.nn.bias_add(conv, bias)
def _pool_layer(input):#池化操作return tf.nn.max_pool(input, ksize=(1, 2, 2, 1), strides=(1, 2, 2, 1),padding='SAME')
def preprocess(image, mean_pixel): #預處理(減均值)return image - mean_pixel
def unprocess(image, mean_pixel):#不進行預處理return image + mean_pixel
def imread(path):     #讀取模型return scipy.misc.imread(path).astype(np.float)
def imsave(path, img):  #讀取圖像img = np.clip(img, 0, 255).astype(np.uint8)scipy.misc.imsave(path, img)# Network for VGG  (完成前向傳播) 
def net(data_path, input_image):layers = ('conv1_1', 'relu1_1', 'conv1_2', 'relu1_2', 'pool1','conv2_1', 'relu2_1', 'conv2_2', 'relu2_2', 'pool2','conv3_1', 'relu3_1', 'conv3_2', 'relu3_2', 'conv3_3','relu3_3', 'conv3_4', 'relu3_4', 'pool3','conv4_1', 'relu4_1', 'conv4_2', 'relu4_2', 'conv4_3','relu4_3', 'conv4_4', 'relu4_4', 'pool4','conv5_1', 'relu5_1', 'conv5_2', 'relu5_2', 'conv5_3','relu5_3', 'conv5_4', 'relu5_4')#定義各卷積層的參數(16層conv)data = scipy.io.loadmat(data_path)#加載.mat文件(模型參數)mean = data['normalization'][0][0][0]#保存三個通道的均值mean_pixel = np.mean(mean, axis=(0, 1))weights = data['layers'][0]net = {}#定義字典結構(保存前向傳播的結果)current = input_image#當前的輸入for i, name in enumerate(layers):kind = name[:4]#取名字的前4個字母if kind == 'conv':kernels, bias = weights[i][0][0][0][0] #w,b的一個元組# matconvnet: weights are [width, height, in_channels, out_channels]# tensorflow: weights are [height, width, in_channels, out_channels]kernels = np.transpose(kernels, (1, 0, 2, 3))#轉換成tensorflow模式bias = bias.reshape(-1)current = _conv_layer(current, kernels, bias)elif kind == 'relu':current = tf.nn.relu(current)elif kind == 'pool':current = _pool_layer(current)net[name] = currentassert len(net) == len(layers)return net, mean_pixel, layerscwd  = os.getcwd()#得到當前路徑
VGG_PATH = cwd + "/source/imagenet-vgg-19.mat"#imagenet-vgg-19.mat的絕對路徑
IMG_PATH = cwd + "/source/lena.png"#lena.png的絕對路徑
input_image = imread(IMG_PATH) #讀取imagenet-vgg-19.mat文件
shape = (1,input_image.shape[0],input_image.shape[1],input_image.shape[2]) 
with tf.Session() as sess:image = tf.placeholder('float', shape=shape)nets, mean_pixel, all_layers = net(VGG_PATH, image)input_image_pre = np.array([preprocess(input_image, mean_pixel)])#預處理layers = all_layers # For all layers # layers = ('relu2_1', 'relu3_1', 'relu4_1')for i, layer in enumerate(layers):print ("[%d/%d] %s" % (i+1, len(layers), layer))features = nets[layer].eval(feed_dict={image: input_image_pre})#當前層前向傳播的結果#print (" Type of 'features' is ", type(features))#print (" Shape of 'features' is %s" % (features.shape,))# Plot response if 1:plt.figure(i+1, figsize=(10, 5))plt.matshow(features[0, :, :, 0], cmap=plt.cm.gray, fignum=i+1)plt.title("" + layer)plt.colorbar()plt.show()

運行結果:

……

總結

以上是生活随笔為你收集整理的VGG卷积神经网络模型加载与运行的全部內容,希望文章能夠幫你解決所遇到的問題。

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