上回製作了一個“至少可以運行”的東西,但有個小問題: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 於地球)