1 CNN主要用於計算機視覺方面,也就是圖像處理。以前的神經網絡在這些方面也表現不錯,爲啥還要出現CNN?傳統的神經網絡採用的的輸入層、隱藏層、輸出層也基本是是用的全鏈接,這樣就形成參數太多,訓練時間長,結果就就形成經濟上的不划算,爲了追求更高的利益,就有人想用更短的時間獲得相同的效果。網絡
2 但是爲啥CNN就能解決上面的參數過多的問題呢?我想舉個成語來講明這個問題,有個成語叫作「一葉知秋」,也就經過一片樹葉就能知道是秋天。或許這個也不太形象。在咱們生活中,咱們想要辨別一我的是是誰,咱們不須要看到這我的的總體,咱們就看到這我的的臉,咱們就能判斷這我的是誰。這個在CNN中就叫作局部感知。但是咱們人能判斷一我的是誰,那是由於咱們記住了這我的的臉部特徵,那麼機器怎麼判斷呢?機器就要學習到這個臉部特徵,這個特徵如何學到呢?就是經過卷積核學到的。可是同一我的在照片的不一樣位置仍是這我的,那麼咱們想一想,若是咱們要表示這我的,那麼這我的的卷積核的參數應該是同樣的吧。猜想是這樣,事實就是這樣的。利用這個特性,CNN採用了權重共享的方式,也得以往的神網絡的參數大幅度減小,在時間上有有了較大的飛躍,ide
從第2條的舉例中,咱們能夠得出CNN的幾大特徵: 1 具備經過圖形的局部就能判斷該圖形是啥 2 對於同一東西,能夠用同一個卷積核表示,也就不在意該東西在圖形的哪一個位置 3 權重共享使得參數大幅度的下降學習
3 CNN的組成 1 卷積層(主要是卷積核)抽取特徵 2 池化層(取個名字叫池化核,可是操做可跟卷積核不同)保留住主要的特徵,丟棄次要的特徵,也就利用局部感知的特色 3 激活層 就是爲了保證數據不給程序形成溢出(只是一個優勢),還有爲了方便程序的出處理,優化
4 會遇到的問題lua
1 卷積核是怎麼獲得的呢? 其實問題也很簡單,也困惑了我好久。卷積核是經過學習獲得的。如何初始化看下面這篇博客 https://blog.csdn.net/m0_37780420/article/details/80365993.net
2 每層卷積核的數目不一樣,卷積後的層是否是卷積核數量的乘積呢? 不是的,假設第一層的卷積核爲6個,圖像爲2828,第一層卷積後爲62828(注意這裏使用的padding="same",若是不是,則不同的),第三層的卷積核爲8個,那麼卷積後的依然是862828,只是深度不同。code
5 用一句來來講:CNN就是神經網絡的全鏈接裏面有不少權重爲0,不少神經元共用相同的的權重。blog
6 下面是使用keras對CNN進行舉例圖片
注意:我是把數據集下載到本地了get
import numpy as np
from keras import Sequential
from keras.datasets import mnist
from keras.utils import np_utils
from keras.layers import Dense,Activation,Convolution2D,MaxPool2D,Flatten
def load_data(path):
path =path f = np.load(path) x_train, y_train = f['x_train'], f['y_train'] x_test, y_test = f['x_test'], f['y_test'] f.close() return (x_train, y_train), (x_test, y_test)
(x_train,y_train),(x_test,y_test)=load_data(path="d:/test/mnist.npz")
#-1指的是不知道有多少個圖片,1,指的是通道,28,28,長寬 #對數據進行預處理
x_train=x_train.reshape(-1,1,28,28)
x_test=x_test.reshape(-1,1,28,28)
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)
#創建model
model = Sequential()
#建立一個卷積層輸出32,28,28
model.add(Convolution2D(
#有多少個卷積核
filters=32,
kernel_size=(5,5),
input_shape=(1,28,28),padding="same")
) model.add(Activation("relu"))
#池化層,輸出32,14,14
model.add(MaxPool2D(
pool_size=(2,2),
strides=(2,2), padding="same"
) ) #繼續卷積,輸出64,14,14(稍微有一點小疑惑,是32層的每一層出64層仍是)
model.add(Convolution2D(filters=64,kernel_size=(5,5),padding="same"))
model.add(Activation("relu"))
#繼續池化
model.add(MaxPool2D(pool_size=(2,2),padding="same"))
#把數據抹平
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation("relu"))
#輸出10個神經元
model.add(Dense(10)) model.add(Activation("softmax")) from keras.optimizers import Adam
#指定優化器
adam= Adam(lr=0.001)
model.compile(optimizer=adam,loss="categorical_crossentropy", metrics=["accuracy"])
print("train")
model.fit(x_train,y_train,epochs=1,batch_size=32)
print(model.summary())
#評價
loss ,accuary=model.evaluate(x_test,y_test)
print(loss,accuary)