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

  上回製做了一個「至少能夠運行」的東西,但有個小問題:mnist 在哪?或者,能本身找圖片訓練麼?(雖然說28×28且僅黑白通道的圖很少見)python


  ——天然是能夠,也是應當的。而且咱們能夠想象,用於製做貓和喂貓的代碼都不應有什麼變化……其實飼料也不變,可是原料變了(從mnist變爲本身的圖集),所需的工具也跟着微調……數組


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

  • X_train    (訓練用圖)函數

  • y_train    (訓練圖對應數字)工具

  • X_test     (測試用圖)測試

  • y_test     (測試用數字)ui

  (num_classes 是因爲代碼設計很差,在下文只用了1次,並且是y_test的函數,徹底能夠去掉,用等號右邊代替下文中的出現)
spa


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

    (來源: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 於地球)

相關文章
相關標籤/搜索