0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何區(qū)分卷積網(wǎng)絡(luò)與全連接網(wǎng)絡(luò)

jf_78858299 ? 來源:算法與編程之美 ? 作者: 編程之美 ? 2023-02-21 15:05 ? 次閱讀

問題
卷積神經(jīng)網(wǎng)絡(luò)是一類包含卷積計算且具有深度結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò),是深度學(xué)習(xí)。卷積神經(jīng)網(wǎng)絡(luò)具有表征學(xué)習(xí)能力,能夠按其階層結(jié)構(gòu)對輸入信息進行平移不變分類,因此也被稱為“平移不變?nèi)斯ど窠?jīng)網(wǎng)絡(luò)。
全連接神經(jīng)網(wǎng)絡(luò)是具有多層感知器的的網(wǎng)絡(luò),也就是多層神經(jīng)元的網(wǎng)絡(luò)。層與層之間需要包括一個非線性激活函數(shù),需要有一個對輸入和輸出都隱藏的層,還需要保持高度的連通性,由網(wǎng)絡(luò)的突觸權(quán)重決定。那兩者的區(qū)別是什么呢?

方法
卷積神經(jīng)網(wǎng)絡(luò)也是通過一層一層的節(jié)點組織起來的。和全連接神經(jīng)網(wǎng)絡(luò)一樣,卷積神經(jīng)網(wǎng)絡(luò)中的每一個節(jié)點就是一個神經(jīng)元。在全連接神經(jīng)網(wǎng)絡(luò)中,每相鄰兩層之間的節(jié)點都有邊相連,于是會將每一層的全連接層中的節(jié)點組織成一列,這樣方便顯示連接結(jié)構(gòu)。而對于卷積神經(jīng)網(wǎng)絡(luò),相鄰兩層之間只有部分節(jié)點相連,為了展示每一層神經(jīng)元的維度,一般會將每一層卷積層的節(jié)點組織成一個三維矩陣。
除了結(jié)構(gòu)相似,卷積神經(jīng)網(wǎng)絡(luò)的輸入輸出以及訓(xùn)練的流程和全連接神經(jīng)網(wǎng)絡(luò)也基本一致,以圖像分類為列,卷積神經(jīng)網(wǎng)絡(luò)的輸入層就是圖像的原始圖像,而輸出層中的每一個節(jié)點代表了不同類別的可信度。這和全連接神經(jīng)網(wǎng)絡(luò)的輸入輸出是一致的。類似的,全連接神經(jīng)網(wǎng)絡(luò)的損失函數(shù)以及參數(shù)的優(yōu)化過程也都適用于卷積神經(jīng)網(wǎng)絡(luò)。因此,全連接神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)的唯一區(qū)別就是神經(jīng)網(wǎng)絡(luò)相鄰兩層的連接方式。
但是全神經(jīng)網(wǎng)絡(luò)無法很好地處理好圖像數(shù)據(jù),然而卷積神經(jīng)網(wǎng)絡(luò)卻很好地客服了這個缺點,使用全連接神經(jīng)網(wǎng)絡(luò)處理圖像的最大問題就是:全連接層的參數(shù)太多,對于MNIST數(shù)據(jù),每一張圖片的大小是28*28*1,其中28*28代表的是圖片的大小,*1表示圖像是黑白的,有一個色彩通道。假設(shè)第一層隱藏層的節(jié)點數(shù)為500個,那么一個全連接層的神經(jīng)網(wǎng)絡(luò)有28*28*500+500=392500個參數(shù),而且有的圖片會更大或者是彩色的圖片,這時候參數(shù)將會更多。參數(shù)增多除了導(dǎo)致計算速度減慢,還很容易導(dǎo)致過擬合的問題。所以需要一個合理的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)來有效的減少神經(jīng)網(wǎng)絡(luò)中參數(shù)的個數(shù)。卷積神經(jīng)網(wǎng)絡(luò)就可以更好的達到這個目的。

from keras import layers
from keras import models
from keras.datasets import mnist
from keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data('D:/Python36/Coding/PycharmProjects/ttt/mnist.npz')
train_images = train_images.reshape(60000, 28*28)
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape(10000, 28*28)
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
history=model.fit(train_images, train_labels, epochs=10, batch_size=128)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_acc,test_acc)
#0.9786 0.9786
print("history_dict%s =" %history.history)
#history_dict = {'loss': [0.25715254720052083, 0.1041663886765639, 0.06873120647072792, 0.049757948418458306, 0.037821156319851675, 0.02870141142855088, 0.02186925242592891, 0.01737390520994862, 0.01316443470219771, 0.010196967865650853],
# 'acc': [0.9253666666984558, 0.9694833333333334, 0.9794666666348775, 0.9850166666984558, 0.9886666666666667, 0.9917666666666667, 0.9935499999682108, 0.9949499999682109, 0.9960999999682109, 0.9972833333333333]} =
acc1 = history.history['acc']
loss1 = history.history['loss']
print(model.summary())
(train_images, train_labels), (test_images, test_labels) = mnist.load_data('D:/Python36/Coding/PycharmProjects/ttt/mnist.npz')
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
history = model.fit(train_images, train_labels, epochs=10, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels)
##0.9919 0.9919
print("history_dict =%s" %history.history)
#history_dict = {'loss': [0.1729982195024689, 0.04632370648694535, 0.031306330454613396, 0.02327785180026355, 0.01820601755216679, 0.01537780981725761, 0.011968255878429288, 0.010757189085084126, 0.008755202058390447, 0.007045005079609898],
# 'acc': [0.9456333333333333, 0.9859, 0.9903333333333333, 0.9929333333333333, 0.99435, 0.9953333333333333, 0.9962333333333333, 0.9966, 0.99735, 0.9979333333333333]}
acc2 = history.history['acc']
loss2 = history.history['loss']
print(model.summary())
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
epochs = range(1, len(acc1) + 1)
ax.plot(epochs, acc1, 'bo', label='dense Training acc',color='red')
ax.plot(epochs, loss1, 'b', label='dense Training loss',color='red')
ax.plot(epochs, acc2, 'bo', label='Conv2D Training acc',color='green')
ax.plot(epochs, loss2, 'b', label='Conv2D Training loss',color='green')
ax.legend(loc='best')
ax.set_title('Training and validation accuracy by different model')
ax.set_xlabel('Epochs')
ax.set_ylabel('Accuracy')
plt.show()

pYYBAGP0bQOANu_QAAE831rxP04796.png


結(jié)語

全連接網(wǎng)絡(luò)沒有卷積層,只使用全連接層(以及非線性層)。

以關(guān)鍵是理解卷積層和全連接層的區(qū)別。

全連接層有三個特點:

關(guān)注全局信息(每個點都和前后層的所有點鏈接)

參數(shù)量巨大,計算耗時

輸入維度需要匹配(因為是矩陣運算,維度不一致無法計算)

卷積層

這個卷積和信號系統(tǒng)中的卷積不太一樣,其實就是一個簡單的乘加運算,

局部鏈接:當前層的神經(jīng)元只和下一層神經(jīng)元的局部鏈接(并不是全連接層的全局鏈接)

權(quán)重共享:神經(jīng)元的參數(shù)(如上圖的3*3卷積核),在整個特征圖上都是共享的,而不是每個滑動窗口都不同

也正是因為這兩個特性,所以卷積層相比于全連接層有如下優(yōu)點:

需要學(xué)習(xí)的參數(shù)更少,從而降低了過度擬合的可能性,因為該模型不如完全連接的網(wǎng)絡(luò)復(fù)雜。

只需要考慮中的上下文/共享信息。這個未來在許多應(yīng)用中非常重要,例如圖像、視頻、文本和語音處理/挖掘,因為相鄰輸入(例如像素、幀、單詞等)通常攜帶相關(guān)信息。

但需要注意的是,無論是全連接層,還是卷積層,都是線性層,只能擬合線性函數(shù),所以都需要通過ReLU等引入非線性,以增加模型的表達能力。比如ReLU函數(shù)接受一個輸入x,并返回{0, x}的最大值。ReLU(x) = argmax(x, 0)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦

    連接神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)有什么區(qū)別

    連接神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)的區(qū)別
    發(fā)表于 06-06 14:21

    卷積網(wǎng)絡(luò)FCN進行圖像分割

    與 FCN 通常CNN網(wǎng)絡(luò)卷積層之后會接上若干個連接層, 將卷積層產(chǎn)生的特征圖(feature map)映射成一個固定長度的特征向量。
    發(fā)表于 09-26 17:22 ?609次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)連接層作用理解總結(jié)

    一般來說,卷積神經(jīng)網(wǎng)絡(luò)會有三種類型的隱藏層——卷積層、池化層、連接層。卷積層和池化層比較好理解
    的頭像 發(fā)表于 01-30 17:23 ?2w次閱讀

    卷積網(wǎng)絡(luò)連接網(wǎng)絡(luò)的比較

    我們在深度學(xué)習(xí)的過程中,開始對模型進行在測試集的精度進行預(yù)測時,最開始是連接網(wǎng)絡(luò)進行模型的精度預(yù)測,最后發(fā)現(xiàn)測試集的精度預(yù)測值不是很理想,就在想能不能換一種網(wǎng)絡(luò)層提高測試集的精度?
    的頭像 發(fā)表于 03-24 14:49 ?1180次閱讀
    <b class='flag-5'>卷積</b><b class='flag-5'>網(wǎng)絡(luò)</b>和<b class='flag-5'>全</b><b class='flag-5'>連接</b><b class='flag-5'>網(wǎng)絡(luò)</b>的比較

    PyTorch教程14.11之卷積網(wǎng)絡(luò)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程14.11之卷積網(wǎng)絡(luò).pdf》資料免費下載
    發(fā)表于 06-05 11:19 ?0次下載
    PyTorch教程14.11之<b class='flag-5'>全</b><b class='flag-5'>卷積</b><b class='flag-5'>網(wǎng)絡(luò)</b>

    卷積神經(jīng)網(wǎng)絡(luò)如何識別圖像

    多層卷積層、池化層和連接層。CNN模型通過訓(xùn)練識別并學(xué)習(xí)高度復(fù)雜的圖像模式,對于識別物體和進行圖像分類等任務(wù)有著非常優(yōu)越的表現(xiàn)。本文將會詳細介紹卷積神經(jīng)
    的頭像 發(fā)表于 08-21 16:49 ?1876次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的基本原理 卷積神經(jīng)網(wǎng)絡(luò)發(fā)展 卷積神經(jīng)網(wǎng)絡(luò)三大特點

    中最重要的神經(jīng)網(wǎng)絡(luò)之一。它是一種由多個卷積層和池化層(也可稱為下采樣層)組成的神經(jīng)網(wǎng)絡(luò)。CNN 的基本思想是以圖像為輸入,通過網(wǎng)絡(luò)卷積、下
    的頭像 發(fā)表于 08-21 16:49 ?2276次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)基本結(jié)構(gòu) 卷積神經(jīng)網(wǎng)絡(luò)主要包括什么

    。它的基本結(jié)構(gòu)由卷積層、池化層和連接層三部分組成,其中卷積層是核心部分,用于提取圖像的特征,池化層用于降低特征圖的大小,
    的頭像 發(fā)表于 08-21 16:57 ?8628次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)層級結(jié)構(gòu) 卷積神經(jīng)網(wǎng)絡(luò)卷積層講解

    像分類、目標檢測、人臉識別等。卷積神經(jīng)網(wǎng)絡(luò)的核心是卷積層和池化層,它們構(gòu)成了網(wǎng)絡(luò)的主干,實現(xiàn)了對圖像特征的提取和抽象。 一、卷積神經(jīng)
    的頭像 發(fā)表于 08-21 16:49 ?7296次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的介紹 什么是卷積神經(jīng)網(wǎng)絡(luò)算法

    的深度學(xué)習(xí)算法。CNN模型最早被提出是為了處理圖像,其模型結(jié)構(gòu)中包含卷積層、池化層和連接層等關(guān)鍵技術(shù),經(jīng)過多個卷積層和池化層的處理,CNN可以提取出圖像中的特征信息,從而對圖像進行分
    的頭像 發(fā)表于 08-21 16:49 ?1805次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)算法代碼matlab

    )、池化層(Pooling Layer)和連接層(Fully Connected Layer)。卷積神經(jīng)網(wǎng)絡(luò)源自對腦神經(jīng)細胞的研究,能夠有效地處理大規(guī)模的視覺和語音數(shù)據(jù)。本文將詳細介
    的頭像 發(fā)表于 08-21 16:50 ?1163次閱讀

    常見的卷積神經(jīng)網(wǎng)絡(luò)模型 典型的卷積神經(jīng)網(wǎng)絡(luò)模型

    LeNet是卷積神經(jīng)網(wǎng)絡(luò)的開山祖師,是由Yan LeCunn在1998年提出的經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)模型。它最初是為手寫體數(shù)字識別而設(shè)計的,由卷積
    的頭像 發(fā)表于 08-21 17:11 ?2752次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)模型的優(yōu)缺點

    等領(lǐng)域中非常流行,可用于分類、分割、檢測等任務(wù)。而在實際應(yīng)用中,卷積神經(jīng)網(wǎng)絡(luò)模型有其優(yōu)點和缺點。這篇文章將詳細介紹卷積神經(jīng)網(wǎng)絡(luò)模型的特點、優(yōu)點和缺點。 一、
    的頭像 發(fā)表于 08-21 17:15 ?4218次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的工作原理和應(yīng)用

    卷積神經(jīng)網(wǎng)絡(luò)(FCN)是深度學(xué)習(xí)領(lǐng)域中的一種特殊類型的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),尤其在計算機視覺領(lǐng)域表現(xiàn)出色。它通過全局平均池化或轉(zhuǎn)置卷積處理任意尺寸
    的頭像 發(fā)表于 07-11 11:50 ?903次閱讀

    神經(jīng)網(wǎng)絡(luò)中的卷積層、池化層與連接

    在深度學(xué)習(xí)中,卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)是一種特別適用于處理圖像數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。它通過卷積層、池化層和
    的頭像 發(fā)表于 07-11 14:18 ?4318次閱讀