首先在理解CNN之前,我們有必要先理解一下什么是神經網絡,這樣我們才能開始了解更高級的卷積神經網絡。
要學習神經網絡當然有很多途徑,網上不少的大牛寫了很多攻略,有的推崇從理論到工程完成深度學習,有的希望從工程出發發現問題,解決問題。各種各樣的方式都有不同的人去嘗試,攻略也是一大推,這使得不少的小白直接倒在了選擇材料的路上,一直在補先修知識,待到熱情結束就放棄了學習,連卷積網絡都不知道是什么,大大地打擊了大家的學習熱情。今天,sherlock在這里給大家推薦一個學習材料,保證你能夠快速入門cnn,出去裝逼也能夠和別人聊幾句。
這個材料是什么呢,就是大名鼎鼎的standford的cs231n這門課程 http://cs231n.github.io/ stanford大學確實算是深度學習和人工智能領域非常牛逼的學校。
神經網絡
廢話不多說,我們開始學習我們的神經網絡。
這是一張腦神經的圖片,神經網絡的發明也是由此開始的,這就是所謂的一個神經元,上面有各種接受突觸,然后通過一個腦神經來接受,最后得到輸出的結果。
那么由這張腦神經圖能夠抽象出來的神經網絡是什么呢?就是下面這個神經網絡模型。
這個怎么理解呢?就是輸入一個向量,然后給向量的每一個元素分配一個權重,然后通過權重求和得到一個結果,然后將這個結果輸入一個激活函數,得到最后的輸出結果。
激活函數又是什么鬼?激活函數的出現是因為人腦的構造,人腦里面接受信息得到結果這個過程是非線性的,比如你看到一樣東西,你不可能保留這個東西的全部特征,你會重點觀察你感興趣的地方,這就是非線性的,也就是說需要一個非線性變化將輸入的結果變換為非線性的結果。現在常用的非線性函數就是Relu(x) = max(x, 0),就是將小于0的部分去掉,只保留大于0的部分。
這就是個單元的輸入和輸出,將這些單元合在一起就是一個神經網絡。
這就是簡單的一層網絡,也可以由多層網絡
這里面的input layer就是所謂的單個訓練集的維數,將所有的訓練集輸入就可以開始訓練一個神經網絡。
Keras實現簡單的神經網絡
知道了神經網絡的基本結構和原理,如果大家還記得我前面一篇文章說的工具keras,我們可以開始使用keras去實現一個簡單的神經網絡。
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
導入必要的package
x = np.array([[0, 1, 0], [0, 0, 1], [1, 3, 2], [3, 2, 1]])
y = np.array([0, 0, 1, 1]).T
設定輸入的x和y
simple_model = Sequential()
simple_model.add(Dense(5, input_shape=(x.shape[1],), activation='relu', name='layer1'))
simple_model.add(Dense(4, activation='relu', name='layer2'))
simple_model.add(Dense(1, activation='sigmoid', name='layer3'))
輸入一個三層的神經網絡,中間的hidden layer的元素個數是5和4,最后一層輸出一個結果
simple_model.compile(optimizer='sgd', loss='mean_squared_error')
complie這個簡單的模型
simple_model.fit(x, y, epochs=20000)
訓練20000次模型
simple_model.predict(x[0:1])
可以預測一下第一個輸入的x的結果與實際的是否相符
這就是一個簡單三層網絡的keras實現,下一篇文章我們將正式進入Convolutional Neural Network