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


  (keras安裝可參考個人文章:Windows 下 Python 3.6 下安裝 TensorFlow,和pyopencl不要緊)python


  首先,你要有一些數學和哲學知識,好比:
小程序

  • 據說過【向量】 (知道能夠把數寫成(1,2,3,4)這種形式便可)數組

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

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

  • (技巧:看不很懂就試圖「觀其大略」)
    ide


  對於向量,若是想進一步瞭解,能夠參考視頻:函數

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

相關文章
相關標籤/搜索