一個月前,我將kaggle里面的food-101(101000張食物圖片),數據包下載下來,想着實現圖像識別,做了很長時間,然后自己電腦也帶不動,不過好在是最后找各種方法實現出了識別,但是准確率真的非常低,我自己都分辨不出來到底是哪種食物,電腦怎么分的出來呢?
在上一篇博客中,我提到了數據的下載處理,然后不斷地測試,然后優化代碼,反正過程極其復雜,很容易出錯。
再說下代碼流程吧:
- 關於數據集的處理,我上篇博客寫道:將其灰度處理,實際上是應該二值化,將彩色圖片轉化為(0,1)的范圍里面,首先是讀取每一個文件的數據(這里的每張圖片都有一個標簽),然后將其隨機分為80%的訓練集,20%的測試集:
for filename in dir: img = np.multiply(img, 1.0/255.0) size = int(config.size * len(images))
這里采用循環的方式,每一張都進行二值化,然后存入列表,再根據我設置的大小進行選擇。 - 神經網絡訓練,我將圖片二值化后,下一步需要將我得圖片數據傳入我得訓練中,循環訓練,分批傳入,我采用卷積操作實現其識別:
def jj(): conv = tf.nn.relu(tf.nn.conv2d(input, filter, [1, 1, 1, 1], padding="SAME")+b) pool = tf.nn.max_pool2d(conv, [1, 2, 2, 1], [1, 2, 2, 1], padding="SAME")
我這里采用的是相同大小卷積,所以我在全連接層的地方就需要注意我的神經元個數,最后通過激勵函數得出結果。
prediction = tf.nn.softmax(fc2,name="y_pred") loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=fc2,labels=labels_batch)) optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=1e-4).minimize(loss) correct_prediction = tf.equal(tf.argmax(prediction,1), tf.argmax(labels_batch,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
- 數據訓練的方法:當我們建立神經網絡后,需要讓機器自動去訓練,所以我們需要將模型保存在電腦中,同時需要電腦能夠停止訓練(當損失函數的值處於某一最小值的時候)。
if loss < 0.01: print("迭代收斂,結束訓練") break
這里我們上傳數據為50一個批次,具體多少按照自己處理。
-
服務器中跑代碼時,需要注意的是肯定需要大型cpu/gpu計算機,不然容易崩潰,然后也沒有什么需要注意的地方了。
其實每個神經網絡的訓練處理方式都不一樣,但是大致流程都差不多:數據處理-網格搭建-數據訓練-網格優化。根據自己數據的不同和側重點不同,需要建立不同的卷積算法。
總結下遇到的問題:
- 圖片處理:在處理圖片的時候我發現有的圖片格式,大小,色彩都不相同,所以我在這里將其分類和處理,主要是分開除黑白圖和彩色圖
def image(url): im=Image.open(url) pix=im.convert('RGB') width=im.size[0] height=im.size[1] type="黑白Image" is_color=[] for x in range(width): for y in range(height): r,g,b=pix.getpixel((x,y)) r=int(r) g=int(g) b=int(b) if (r==g) and (g==b): pass else: type='彩色 Image' return type
數據處理其實是這里面最好做的。
- 在神經網絡搭建中,需要避免過擬合和欠擬合的問題,圖片數據不能太少,同時神經元不能太多,需要考慮到多個問題,以及卷積操作的方式,這里都需要自己摸索
- 雖然大型服務器好用,但是貧民學生不配擁有,借用個服務器真是太難了,真的太難了!
