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

  上回製作了一個“至少可以運行”的東西,但有個小問題:mnist 在哪?或者,能自己找圖片訓練麼?(雖說28×28且僅黑白通道的圖不多見)


  ——自然是可以,也是應當的。並且我們可以想象,用於製作貓和喂貓的代碼都不該有什麼變化……其實飼料也不變,但是原料變了(從mnist變爲自己的圖集),所需的工具也跟着微調……


  我們回過去看看在製作飼料那一步,究竟做出了什麼飼料——

  • X_train    (訓練用圖)

  • y_train    (訓練圖對應數字)

  • X_test     (測試用圖)

  • y_test     (測試用數字)

  (num_classes 是由於代碼設計不好,在下文只用了1次,而且是y_test的函數,完全可以去掉,用等號右邊代替下文中的出現)


  你完全可以爲了省事,直接把訓練集當測試集,在喂貓的時候用相同的東西就可以了。總之【飼料有4個】。我爲了簡單,後兩個就用前兩個了……另外我根據他人代碼,重新命了名,如下:

    (來源:csdn博客

  • data

  • label

  • data

  • label


  對於原料,自然可以把mnist那一行去掉了,但是又需要 os(系統庫)和PIL(常用的圖像庫);os是python自帶,PIL可以用 pip install pillow 安裝(爲何叫 pillow? ^_^),另外爲了方便,把import numpy 改成 import numpy as np,np是numpy最普遍的別名了————你可以吧。然後這樣製作飼料:(有python基礎的人可能覺得我廢話連篇……)

  (再另:自己找個mnist下載下來,一般是壓縮包,解壓後是圖片文件夾。)

### 製作飼料
def load_data():
	path = "C:/Users/Administrator/Desktop/n/"    #放圖片的文件夾
	name_lst = os.listdir(path)		# 獲取路徑下文件名列表
	lenth = len(name_lst)			# 獲取文件數目
	
	data = np.empty((lenth,28,28,1),dtype="float32")	# 創建空數組 (data是4維數組,label是1維)
	label = np.empty((lenth,),dtype="uint8")

	for i in range(lenth):            # 把文件夾裏的圖填到數組裏    
	                # 前提:28×28px 黑白圖,且圖片數字爲n,則名稱以“n.”開頭,比如某張0的圖片可命名爲0.123.jpg
		s_name = name_lst[i]
		l_name = path + s_name
		img = PIL.Image.open(l_name)
		arr = np.asarray(img,dtype="float32")
		data[i,:,:,0] = arr/255
		n = int(s_name.split('.')[0])
		label[i] = n
		
	label = np_utils.to_categorical(label)    # (重整,之前版本也有這步)
	
	return data,label		
data, label = load_data()

X_train = data
y_train = label
X_test = data
y_test = label


  爲了防止新手看不懂,這裏把完整代碼也放一下:

### 準備原料!
import numpy as np
import os, PIL

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils
# 其實完全可以不用seed,seed一般用於重現演示而已
        
        
### 製作飼料!
def load_data():
	path = "C:/Users/Administrator/Desktop/n/"
	name_lst = os.listdir(path)		# 獲取路徑下文件名列表
	lenth = len(name_lst)			# 獲取文件數目
	
	data = np.empty((lenth,28,28,1),dtype="float32")	
	label = np.empty((lenth,),dtype="uint8")

	for i in range(lenth):
		s_name = name_lst[i]
		l_name = path + s_name
		img = PIL.Image.open(l_name)
		arr = np.asarray(img,dtype="float32")
		data[i,:,:,0] = arr/255
		n = int(s_name.split('.')[0])
		label[i] = n
		
	label = np_utils.to_categorical(label)
	
	return data,label		
data, label = load_data()

X_train = data
y_train = label
X_test = data
y_test = label

        
# 製作貓
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(y_test.shape[1], activation='softmax'))

 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model
 
model = baseline_model()

        
### 喂貓
 
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=15, batch_size=128, verbose=2)


  如果你發現你的貓和別的教程裏不一樣,不要奇怪,貓自然是各種各樣的……


  (2018-2-7 於地球)

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