1. 程式人生 > >使用自己的圖片訓練CNN分類器-TensorFlow

使用自己的圖片訓練CNN分類器-TensorFlow

在看過吳恩達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])
或者
    permutation = list(np.random.permutation(m))   #生成一個 從0到m打亂的序列
    shuffled_X = X[permutation,:,:,:] 
    shuffled_Y = Y[permutation,:]
3. 準備好資料,劃分好訓練集和測試集,歸一化處理。此時可以列印shape,檢查是否是我們需要的維度
    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  點選開啟連結