一邊學,一邊寫出的人工智能教程(一)


  (keras安裝可參考我的文章:Windows 下 Python 3.6 下安裝 TensorFlow,和pyopencl沒關係)


  首先,你要有一些數學和哲學知識,比如:

  • 聽說過【向量】 (知道可以把數寫成(1,2,3,4)這種形式即可)

  • 懂一點【抽象】,能提煉出一些事物的關聯 (比如,汽車和自行車有什麼共同點?)

  • 能不看教程寫出python小程序(比如打印helloworld)

  • (技巧:看不很懂就試圖“觀其大略”)


  對於向量,如果想進一步瞭解,可以參考視頻:

  3Blue1Brown的視頻教程(線性代數) 

  (你至少會從中習慣,可以把向量豎着寫)


  接下來的三個視頻也是同樣的來源。顯然他們說的比我好,我只需要放鏈接……

  3Blue1Brown的視頻教程(神經網絡)1

  3Blue1Brown的視頻教程(神經網絡)2

  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 於地球)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章