(keras安裝可參考個人文章:Windows 下 Python 3.6 下安裝 TensorFlow,和pyopencl不要緊)python
首先,你要有一些數學和哲學知識,好比:
小程序
據說過【向量】 (知道能夠把數寫成(1,2,3,4)這種形式便可)數組
懂一點【抽象】,能提煉出一些事物的關聯 (好比,汽車和自行車有什麼共同點?)網絡
能不看教程寫出python小程序(好比打印helloworld)dom
(技巧:看不很懂就試圖「觀其大略」)
ide
對於向量,若是想進一步瞭解,能夠參考視頻:函數
(你至少會從中習慣,能夠把向量豎着寫)測試
接下來的三個視頻也是一樣的來源。顯然他們說的比我好,我只須要放連接……翻譯
3Blue1Brown的視頻教程(神經網絡)3 (分上下篇)
再放一個:(我是按順序放的)
知乎回答(卷積層)(卷積神經網絡簡稱CNN)
(做者:地球的外星人君;來源:知乎)
下面的代碼就出自上方回答。但我處理了一下,寫成了僞代碼……
### 準備原料 ### 製做飼料 ### 製做貓 ### 喂貓
(笑)大概就是這麼個過程,雖然比較抽象,但可以說明問題。具體一點的話,第一步是這樣的:
### 準備原料! import numpy from keras.datasets import mnist # data數據,set集合,datasets數據集; mnist是一個著名的數字圖像識別數據集 from keras.models import Sequential # model模型; Sequential 序貫模型(應該就是最簡單的模型——層與層相繼鏈接而已) from keras.layers import Dense # layer層; dense密集的(多是指普通的一層) from keras.layers import Dropout # dropout丟棄 from keras.layers import Flatten # flatten壓平,numpy中此名稱對應函數是把無論多少維的矩陣中的數 列爲一行 from keras.layers.convolutional import Conv2D # convolutional卷積; Conv2D大概是2維卷積 from keras.layers.convolutional import MaxPooling2D # MaxPooling 區域中共同最大值 (記得那個回答中的「池化」麼) from keras.utils import np_utils # util工具; np應該是numpy seed = 7 numpy.random.seed(seed) # 隨機數初始化,seed種子(若是你知道個人世界種子,就很好理解) # 種子隨機就是說,用同一個種子會生成同一個隨機數列,即便反覆運行
第二步:(你可能須要事先理解多維數組)
(代碼較寬,向右選中文字能夠移動)
### 製做飼料! # 加載信息 (X_train, y_train), (X_test,y_test) = mnist.load_data() # 兩個X都是列表,其元素爲圖像(二維矩陣表示);兩個y也都是列表,其元素是X中圖像對應的數字;train表示訓練用,test表示測試用 # 使信息成爲模型能處理的格式 X_train = X_train.reshape(X_train.shape[0],28, 28,1).astype('float32') # (張量,英文tensor,0維張量是標量,1維是向量,2維是矩陣,3維大概是立方陣,等等) # n維張量的shape是由各維度上的元素個數組成的n元向量,好比三階方陣的shape是(3,3) # reshape就是把矩陣按順序展平後從新拼(好比全是1的三階方陣通常是這麼表示的:[[1,1,1],[1,1,1],[1,1,1]],展平就是隻留最外層括號) # 另:最後一個1是圖像通道數,灰度圖天然是1,三色應該就是3 X_test = X_test.reshape(X_test.shape[0],28, 28,1).astype('float32') # 整數類型化爲浮點類型 X_train = X_train / 255 X_test = X_test / 255 # (0-255 -> 0-1) y_train = np_utils.to_categorical(y_train) y_test = np_utils.to_categorical(y_test) # 序列化,即用[1,0,0,0,0,0,0,0,0,0] 代替 0,[0,1,0,0,0,0,0,0,0,0] 代替 1,[0,0,1,0,0,0,0,0,0,0] 代替 2,等等, # 記得3Blue1Brown視頻裏輸出的樣子麼?一列 num_classes = y_test.shape[1] # 結果數量
第三步:
### 製做貓! def baseline_model(): model = Sequential() # 建一個空的「序貫模型」 model.add(Conv2D(32, (3, 3), padding='valid', input_shape=(28, 28,1), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 添加捲積層 model.add(Conv2D(15, (3, 3), padding='valid' ,activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 彷佛是再加一個卷積層 (導入部分已經翻譯了函數名稱) model.add(Flatten()) # 進入一維模式 (記得視頻裏把圖像一維化麼,這裏是先卷積再一維化) model.add(Dense(128, activation='relu')) model.add(Dense(num_classes, activation='softmax')) # 「密集層」(彷佛也叫「全鏈接」) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # compile編譯,這總不應解釋運行了…… return model model = baseline_model() # (用函數加調用來建立模型「看起來更清晰」)
第四步:
### 喂貓 model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=5, batch_size=128, verbose=2)
運行很是慢(這但是神經網絡!),我沒有GPU,訓練一次大約要40秒(最後一行的epoch表示訓練次數)。看着別人的個位數秒數,有點難過。
(2018-2-6 於地球)