(keras安裝可參考我的文章:Windows 下 Python 3.6 下安裝 TensorFlow,和pyopencl沒關係)
首先,你要有一些數學和哲學知識,比如:
聽說過【向量】 (知道可以把數寫成(1,2,3,4)這種形式即可)
懂一點【抽象】,能提煉出一些事物的關聯 (比如,汽車和自行車有什麼共同點?)
能不看教程寫出python小程序(比如打印helloworld)
(技巧:看不很懂就試圖“觀其大略”)
對於向量,如果想進一步瞭解,可以參考視頻:
(你至少會從中習慣,可以把向量豎着寫)
接下來的三個視頻也是同樣的來源。顯然他們說的比我好,我只需要放鏈接……
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 於地球)