使用自己的圖片訓練CNN分類器-TensorFlow
阿新 • • 發佈:2019-02-10
在看過吳恩達CNN 前兩週的課,並且完成了課後作業後,對CNN的實現有了具象的瞭解。整體的實現過程大概分為以下幾部分:
1. 資料準備。我將資料組織成多維陣列的形式,關於tfrecord是什麼還未去了解,這裡就按照cousera課後作業的形式,模仿著來實現。
P.S. 自己的圖片可能比較大,也可能大小不一,因此,將圖片做適當處理,整理成 input [ m, n_H, n_W, n_C ] 。m表示樣本總數,n_H, n_W表示圖片的高和寬, n_C表示圖片的通道數,彩色RGB通道數是3,灰度圖則是1(這裡的1不確定該如何理解:是三個通道具有相同的值?還是一個通道有值,其他兩個通道值都是0?)。調整圖片大小的程式如下:
image_raw_data = tf.gfile.GFile(image_list[i],'r').read() img_data = tf.image.decode_jpeg(image_raw_data) #第一個引數為原始影象,第二個引數為影象大小,第三個引數給出了指定的演算法 resized = tf.image.resize_images(img_data, [64,64],method=0) resized = np.asarray(resized.eval(),dtype='uint8')
2. 如過你的圖片是分好類的,那麼讀取進來後需要打亂順序,另外,標籤與圖片要一一對應。
temp = np.array([class_train,label_train]) # 2*140
temp = temp.transpose() # 140*2
#打亂順序
np.random.shuffle(temp)
#第一列是image,第二列是label
image_list = list(temp[:,0])
label_list = list(temp[:,1])
或者3. 準備好資料,劃分好訓練集和測試集,歸一化處理。此時可以列印shape,檢查是否是我們需要的維度permutation = list(np.random.permutation(m)) #生成一個 從0到m打亂的序列 shuffled_X = X[permutation,:,:,:] shuffled_Y = Y[permutation,:]
X_train = X_train/255.
X_test = X_test/255.
print ("number of training examples = " + str(X_train.shape[0]))
print ("number of test examples = " + str(X_test.shape[0]))
print ("X_train shape: " + str(X_train.shape))
print ("Y_train shape: " + str(Y_train.shape))
print ("X_test shape: " + str(X_test.shape))
print ("Y_test shape: " + str(Y_test.shape))
4. 以下便是仿照Andrew的課後作業來實現CNN的流程,其中需要的根據自己的情況進行修改的地方有:輸出向量的維數(即分類數)以及演算法的各引數。比如minibatch_size要根據你的訓練集大小來設定,樣本數不多的話,size也適當取小一點,另外如果size很小,可適當增加學習的代數。最後代價的曲線如下:
完整程式碼請移步GitHub 點選開啟連結