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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

卷积神经网络(CNN)详解及TensorFlow2代码实现

發(fā)布時(shí)間:2023/12/15 卷积神经网络 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卷积神经网络(CNN)详解及TensorFlow2代码实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

卷積神經(jīng)網(wǎng)絡(luò)名字聽(tīng)著挺嚇人,本文用通俗易懂的方式解釋。人人都能看懂。

文章目錄

  • 卷積是什么
  • 一、卷積神經(jīng)網(wǎng)絡(luò)介紹
    • 卷積層--提取局部圖片特征
    • 擴(kuò)充--padding,保持卷積后圖片的長(zhǎng)和寬保持不變
    • 池化層---降低維度,降低模型復(fù)雜度和計(jì)算量
    • flatten展平--讓多維數(shù)據(jù)變成一個(gè)巨大的一維向量
    • 全連接層--輸出結(jié)果
  • 二、TensorFlow2代碼實(shí)現(xiàn)
    • 1.導(dǎo)入數(shù)據(jù)
    • 2.用TensorFlow2構(gòu)建一個(gè)CNN網(wǎng)絡(luò)
  • 總結(jié)


卷積是什么

卷積神經(jīng)網(wǎng)絡(luò)就是傳統(tǒng)神經(jīng)網(wǎng)絡(luò)運(yùn)用了矩陣卷積的技術(shù)。
二維線性卷積:
矩陣舉例:

(部分內(nèi)容摘抄自此文)
現(xiàn)在有一張圖片(下圖左) 和一個(gè)kernel核(下圖中間)。通過(guò)卷積可以得到下圖右的結(jié)果。
我們知道,圖片實(shí)際上就是一個(gè)巨大的數(shù)值矩陣,也就是我們常說(shuō)的像素。一張灰色圖片就是一個(gè)巨大的二維矩陣,矩陣中每個(gè)元素表示黑白的程度,可以理解為就是一個(gè)數(shù)學(xué)矩陣。

二維卷積:從二維矩陣中拿到第一個(gè)值,即圖示中的標(biāo)紅框1,1所在的位置對(duì)上卷積核kernel 中心位置,即圖示中的紅色框(卷積核就是一個(gè)矩陣),對(duì)應(yīng)位置的值與矩陣元素相乘最后求和,得到的值便是新的值-8(計(jì)算方法見(jiàn)上文矩陣求卷積運(yùn)算),以此類推,取得所有位置的新值,最后圖片的最外層填上0就可以了。二維卷積得到的大小取決與卷積核,而卷積核大小一般是奇數(shù)大小(例3×3, 5×5),表示取像素值取決周圍一圈的像素值,取決的權(quán)重由卷積核決定,提取該區(qū)域特定特征。


一、卷積神經(jīng)網(wǎng)絡(luò)介紹

卷積神經(jīng)網(wǎng)絡(luò)(CNN)可用于使機(jī)器可視化事物并執(zhí)行諸如圖像分類,圖像識(shí)別,對(duì)象檢測(cè),實(shí)例分割等任務(wù)。這是CNN最常見(jiàn)的領(lǐng)域,如字跡識(shí)別等。

卷積層–提取局部圖片特征


圖片有RGB三個(gè)顏色通道,因此輸入是3層,由于3個(gè)輸入通道(紅色R,綠色G和藍(lán)色B),我們看到的任何圖像都是3通道圖像??梢岳斫鉃?層,因此卷積核也是3層,相當(dāng)于兩個(gè)3*3的魔方對(duì)應(yīng)的9個(gè)元素相乘,最后9個(gè)乘積相加。因此,卷積核相當(dāng)于使用3層二維(長(zhǎng)和寬)過(guò)濾器,圖像的通道數(shù)(層數(shù))和過(guò)濾器層數(shù)相同。
與2D卷積操作類似,我們將在水平方向上滑動(dòng)過(guò)濾器。每次移動(dòng)過(guò)濾器時(shí),我們都將獲取整個(gè)圖片三個(gè)通道(3層)的加權(quán)平均值,即RGB值的加權(quán)鄰域。由于我們僅在兩個(gè)維度上滑動(dòng)內(nèi)核-從左到右,從上到下,此操作的輸出將是2D輸出。
假設(shè)我們有大小為7x7的2D輸入,并且正在從圖像的左上角開(kāi)始在圖像上應(yīng)用3x3的濾鏡。當(dāng)我們從左到右,從上到下在圖像上滑動(dòng)內(nèi)核時(shí),很明顯,輸出小于輸入,即5x5。

如果我們希望輸出與輸入大小相同怎么辦?
如果原始輸入的大小為7x7,我們也希望輸出大小為7x7。因此,在那種情況下,我們可以做的是在輸入周圍均勻添加一個(gè)人工填充(值為零),這樣我們就可以將過(guò)濾器K(3x3)放置在圖像像素點(diǎn)上,并計(jì)算鄰居的加權(quán)平均值。
一個(gè)卷積核就是提取一個(gè)特征,因此,為了充分提取圖片的特征,我們需要多個(gè)卷積核對(duì)圖片進(jìn)行特征提取,這就叫卷積核的深度,得到的結(jié)果就是多個(gè)2D輸出,堆疊在一起,就有多層輸出。如圖:

理解了這個(gè)圖,才能理解最后那個(gè)卷積神經(jīng)網(wǎng)絡(luò)的架構(gòu)圖。多層卷積會(huì)導(dǎo)致這種彩色的層數(shù)增加。

擴(kuò)充–padding,保持卷積后圖片的長(zhǎng)和寬保持不變

通過(guò)在輸入周圍添加一圈(零)這種人工填充,我們可以將輸出的形狀與輸入保持相同。如果我們有一個(gè)更大的過(guò)濾器K(5x5),那么我們需要應(yīng)用零填充的數(shù)量也會(huì)增加,這樣我們就可以保持相同的輸出大小。在此過(guò)程中,輸出的大小與輸出的大小相同,因此命名為Padding。原文見(jiàn)此鏈接

池化層—降低維度,降低模型復(fù)雜度和計(jì)算量

獲得了特征圖,通常我們將執(zhí)行一個(gè)稱為Pooling operation的操作。由于學(xué)習(xí)圖像中存在的復(fù)雜關(guān)系所需的隱藏層數(shù)將很大。我們應(yīng)用池化操作來(lái)減少輸入特征的表示,從而降低網(wǎng)絡(luò)所需的計(jì)算能力。
一旦獲得輸入的特征圖,我們將在特征圖上應(yīng)用確定形狀的過(guò)濾器,以從特征圖的該部分獲得最大值。這稱為最大池化。這也稱為子采樣,因?yàn)閺膬?nèi)核覆蓋的特征圖的整個(gè)部分中,我們正在對(duì)一個(gè)最大值進(jìn)行采樣。

flatten展平–讓多維數(shù)據(jù)變成一個(gè)巨大的一維向量

我們得到了多個(gè)粉色的卷積結(jié)果,是個(gè)多維的,如卷積層那節(jié)最后的那個(gè)圖所示。
可是我們預(yù)測(cè)的結(jié)果是一維的,比如二分類,不是0就是1,多維的數(shù)據(jù)怎么得到一維的輸出呢?
簡(jiǎn)單嘛,把多維的數(shù)據(jù)全部攤平,成一個(gè)一維的數(shù)組,就像你把很多個(gè)魔方,一個(gè)個(gè)的掰下來(lái),排成一排。魔方就是多維的啊,你不就是把多個(gè)多維的數(shù)組,變成一維的數(shù)組了嗎?

全連接層–輸出結(jié)果

一旦我們對(duì)圖像的特征表示進(jìn)行了一系列的卷積和pooling操作(最大合并或平均合并,也稱下采樣)。我們將最終池化層的輸出展平為一個(gè)向量,并將其通過(guò)具有不同數(shù)量隱藏層的全連接層(前饋神經(jīng)網(wǎng)絡(luò))傳遞,最后經(jīng)過(guò)多層的深度神經(jīng)網(wǎng)絡(luò)進(jìn)行擬合。
最后,完全連接層的輸出將通過(guò)所需大小的Softmax層。Softmax層輸出概率分布的向量,這有助于執(zhí)行圖像分類任務(wù)。在數(shù)字識(shí)別器問(wèn)題(如上所示)中,輸出softmax層具有10個(gè)神經(jīng)元,可將輸入分類為10個(gè)類別之一(0–9個(gè)數(shù)字)。如果是個(gè)二分類問(wèn)題,則Softmax層就是2個(gè)神經(jīng)元,分別輸出0,1,所以最后的Softmax層是根據(jù)最終結(jié)果需要分多少類來(lái)確定的。

如果是2分類,最后那個(gè)softmax成就是只有兩個(gè)神經(jīng)元,表示2類輸出。

二、TensorFlow2代碼實(shí)現(xiàn)

1.導(dǎo)入數(shù)據(jù)

我們用TensorFlow2自帶的mnist測(cè)試手寫(xiě)的0-9數(shù)字,然后判定他具體寫(xiě)的是哪個(gè)數(shù)字。
向?qū)霐?shù)據(jù),新建一個(gè)MNISTLoader的類。
代碼如下(命名為testData.py):

import numpy as np import tensorflow as tfclass MNISTLoader():def __init__(self):mnist = tf.keras.datasets.mnist(self.train_data,self.train_label),(self.test_data,self.test_label) = mnist.load_data()# MNIST中的圖像默認(rèn)為uint8(0-255的數(shù)字)。以下代碼將其歸一化到0-1之間的浮點(diǎn)數(shù),并在最后增加一維作為顏色通道RGB,如果沒(méi)有這個(gè)維度就是灰度的圖片,沒(méi)有彩色。self.train_data = np.expand_dims(self.train_data.astype(np.float)/255.0,axis=-1) # [60000, 28, 28, 1]self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1) # [10000, 28, 28, 1]self.train_label = self.train_label.astype(np.int32) # [60000]self.test_label = self.test_label.astype(np.int32) # [10000]self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0] #60000,10000def get_batch(self, batch_size):# 從數(shù)據(jù)集中隨機(jī)取出batch_size個(gè)元素并返回index = np.random.randint(0, self.num_train_data, batch_size) #可以重復(fù)取某條數(shù)據(jù)return self.train_data[index, :], self.train_label[index]# mnist = MNISTLoader() # batch_size = 1 # train_data,train_label = mnist.get_batch(batch_size) # print(train_data*255) # print(train_label) # print(train_data[0,:,1])

2.用TensorFlow2構(gòu)建一個(gè)CNN網(wǎng)絡(luò)

代碼結(jié)構(gòu)如下:
1、定義超參數(shù)
2、定于模型結(jié)構(gòu)
3、對(duì)模型進(jìn)行訓(xùn)練
4、預(yù)測(cè)測(cè)試集并測(cè)試準(zhǔn)確度

import numpy as np import tensorflow as tf from testData import * import timeclass CNN(tf.keras.Model):def __init__(self):super().__init__()self.conv1= tf.keras.layers.Conv2D(filters=32, #卷積核的數(shù)目32,提取32維特征kernel_size=[5,5], #感覺(jué)野,卷積核的長(zhǎng)和寬padding='same', #padding 策略 (vaild、same)activation= tf.nn.relu #激活函數(shù))self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2,2],strides=2) #池化層一般用2X2矩陣self.conv2 = tf.keras.layers.Conv2D(filters=64,kernel_size=[5,5],padding='same',activation=tf.nn.relu)self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2,2],strides=2) #池化層一般用2X2矩陣self.flatten = tf.keras.layers.Reshape(target_shape=(7*7*64,)) #把二維的矩陣展平為1維self.dense1 = tf.keras.layers.Dense(units=1024,activation=tf.nn.relu) #第一層全連接層,1024個(gè)神經(jīng)元self.dense2 = tf.keras.layers.Dense(units=10) #最后一層全連接層,激活函數(shù)要用softmax,神經(jīng)元數(shù)量為分類數(shù)量def call(self,inputs):x = self.conv1(inputs) #經(jīng)過(guò)第一個(gè)卷積層x = self.pool1(x) #經(jīng)過(guò)第一個(gè)池化層,下采樣x = self.conv2(x) #經(jīng)過(guò)第二個(gè)卷積層x = self.pool2(x) #經(jīng)過(guò)第二個(gè)池化層,下采樣x = self.flatten(x) #把中間結(jié)果拉平成一個(gè)大的一維向量x = self.dense1(x) #經(jīng)過(guò)第一個(gè)全連接層x = self.dense2(x) #結(jié)果第二個(gè)全連接層,也是最后一層,叫softmax層output = tf.nn.softmax(x)return output#主控程序,調(diào)用數(shù)據(jù)并訓(xùn)練模型 #定義超參數(shù) num_epochs = 5 #每個(gè)元素重復(fù)訓(xùn)練的次數(shù) batch_size = 50 learning_rate = 0.001print('now begin the train, time is ') print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())) model = CNN() data_loader = MNISTLoader() optimier = tf.keras.optimizers.Adam(learning_rate=learning_rate)num_batches = int(data_loader.num_train_data//batch_size*num_epochs) for batch_index in range(num_batches):X,y = data_loader.get_batch(batch_size)with tf.GradientTape() as tape:y_pred = model(X)loss = tf.keras.losses.sparse_categorical_crossentropy(y_true=y,y_pred=y_pred)loss = tf.reduce_sum(loss)print("batch %d: loss %f"%(batch_index,loss.numpy()))grads = tape.gradient(loss,model.variables)optimier.apply_gradients(grads_and_vars=zip(grads,model.variables))print('now end the train, time is ') print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) #模型的評(píng)估 sparse_categorical_accuracy = tf.keras.metrics.SparseCategoricalAccuracy() num_batches_test = int(data_loader.num_test_data//batch_size) #把測(cè)試數(shù)據(jù)拆分成多批次,每個(gè)批次50張圖片 for batch_index in range(num_batches_test):start_index,end_index = batch_index*batch_size,(batch_index+1)*batch_sizey_pred = model.predict(data_loader.test_data[start_index:end_index])sparse_categorical_accuracy.update_state(y_true = data_loader.test_label[start_index:end_index],y_pred=y_pred) print('test accuracy: %f'%sparse_categorical_accuracy.result()) print('now end the test, time is ') print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))

運(yùn)行的預(yù)測(cè)準(zhǔn)確率能達(dá)到99.15%。太不可思議了。
輸出結(jié)果:

batch 5999: loss 0.094517 now end the train, time is 2021-03-18 17:15:46 test accuracy: 0.991500 now end the test, time is 2021-03-18 17:16:05

總結(jié)

搭建一個(gè)卷積神經(jīng)網(wǎng)絡(luò)只需要滿足:確定層數(shù)、按照卷積、激活、池化等流程定義每一層、層與層之間輸入輸出匹配,要輸出結(jié)果,就需要把2維甚至多維的矩陣展平成一個(gè)大的1維矩陣,然后用全連接又可以構(gòu)建輸出端的多層神經(jīng)網(wǎng)絡(luò),最后輸出的那層用到了softmax函數(shù)進(jìn)行分類,輸出的概率最大的那個(gè)結(jié)果,就是我們的預(yù)測(cè)結(jié)果。
因此實(shí)現(xiàn)一個(gè)卷積神經(jīng)網(wǎng)絡(luò)的搭建。準(zhǔn)確率已經(jīng)相當(dāng)不錯(cuò)了。

總結(jié)

以上是生活随笔為你收集整理的卷积神经网络(CNN)详解及TensorFlow2代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。