卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)是一類包含卷積或相關(guān)計算且具有深度結(jié)構(gòu)的前饋網(wǎng)絡(luò)神經(jīng)(Feedforward Neural Networks),是深度學(xué)習(xí)(deep learning)的代表算法之一。
卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用的核心領(lǐng)域之一為計算機視覺,Inception模型的提出促進了CNN的發(fā)展,目前Inception模型共有4個版本,本文選用V3作為對象進行學(xué)習(xí)。
圖像識別
現(xiàn)代的圖像識別模型具有數(shù)以百萬計的參數(shù),從頭開始訓(xùn)練(Train from scratch)需要大量的樣本數(shù)據(jù)以及消耗巨大的計算資源(幾百個GPU),因此采用遷移學(xué)習(xí)的方式重訓(xùn)一個模型(Retrain a model)對于學(xué)習(xí)模型的成本較低。
ImageNet是一個巨大的可供視覺訓(xùn)練的圖片庫,利用Inception-V3作為已經(jīng)訓(xùn)練好的模型,移出網(wǎng)絡(luò)的最終分類層(Softmax),只訓(xùn)練CNN的倒數(shù)第二層——瓶頸層(Bottlenecks),這樣只需要幾千張圖片和普通CPU就能完成,而且重訓(xùn)的模型準確性也不差。
一、數(shù)據(jù)下載
網(wǎng)絡(luò)上公開下載的dataset主要是來自國外大學(xué)的一些網(wǎng)站:
史坦福大學(xué)vision lab - dogs dataset
加州理工學(xué)院computational vision - birds dataset
除了下載圖片文件還需要對應(yīng)的標簽文件,如果沒有要自行整理。
二、環(huán)境準備
- 安裝Anaconda
打開Anaconda官網(wǎng)的下載頁,點擊下載windows版本,選擇左邊的Python3版本安裝包,如下圖所示:

下載完成后按步驟完成安裝即可,安裝完成后點擊Anaconda Navigator,成功打開下圖的界面說明安裝成功。由于總所周知的原因,建議將包管理鏡像設(shè)置為國內(nèi)源,點擊界面上方的channel,將defaults刪除,新增清華大學(xué)的源。

- 安裝TensorFlow
打開Anaconda Navigator主界面,點擊 Environments,按照下圖所示安裝TensorFlow。

三、重訓(xùn)模型
重訓(xùn)模型需要安裝PIP包TensorFlow-Hub,在CMD執(zhí)行以下命令:
pip install tensorflow-hub
在github上打開重訓(xùn)的源碼,如何重訓(xùn)可以查看谷歌的官方教程,下面對源碼處理的過程做解讀:
1.create_module_graph
def create_module_graph(module_spec):
height, width = hub.get_expected_image_size(module_spec)
with tf.Graph().as_default() as graph:
resized_input_tensor = tf.placeholder(tf.float32, [None, height, width, 3])
m = hub.Module(module_spec)
bottleneck_tensor = m(resized_input_tensor)
wants_quantization = any(node.op in FAKE_QUANT_OPS
for node in graph.as_graph_def().node)
return graph, bottleneck_tensor, resized_input_tensor, wants_quantization
創(chuàng)建一個圖并載入hub module,參數(shù)中的module_spec為在用的圖像模型(本例中為Inception-V3)。
2.run_bottleneck_on_image
def run_bottleneck_on_image(sess, image_data, image_data_tensor,
decoded_image_tensor, resized_input_tensor,
bottleneck_tensor):
resized_input_values = sess.run(decoded_image_tensor,
{image_data_tensor: image_data})
bottleneck_values = sess.run(bottleneck_tensor,
{resized_input_tensor: resized_input_values})
bottleneck_values = np.squeeze(bottleneck_values)
return bottleneck_values
提取圖片的特征向量到瓶頸層,返回值中的bottleneck_values為提取的瓶頸層。
3.add_final_retrain_ops
在瓶頸層后增加一個最終分類層,用于識別重訓(xùn)的新圖片。返回值中包含了建立最終分類層所需的信息。
執(zhí)行retrain.py
打開Anaconda Navigator中的Spyder運行環(huán)境,將重訓(xùn)的源碼復(fù)制到本機,修改源碼中超參數(shù)的default值:
parser.add_argument(
'--saved_model_dir',
type=str,
default='F:/models/inception_v3',
help='Where to save the exported graph.')
--saved_model_dir:生成模型存儲的本地路徑。
parser.add_argument(
'--image_dir',
type=str,
default='F:/dogs_images',
help='Path to folders of labeled images.'
'--image_dir:下載dataset的本地路徑。
修改完成后執(zhí)行代碼生成模型在本地,執(zhí)行所花的時間根據(jù)機器配置而定,生成的文件如下:

四、可視化過程
訓(xùn)練完成后,在CMD中輸入以下命令:
tensorboard --logdir /tmp/retrain_logs
在瀏覽器中輸入localhost:6006以查看TensorBoard,打開界面如下:

可視化過程直觀地顯示錄入重訓(xùn)過程,可以通過查看標量、圖以及直方圖理解、調(diào)試和優(yōu)化訓(xùn)練過程。
五、測試
最后搖使用得到的模型測試一下效果,在網(wǎng)上隨便下載一張重訓(xùn)對象的圖片,加上測試圖片的絕對路徑參數(shù)--image后執(zhí)行該測試源碼,所得結(jié)果如下:

從測試結(jié)果來看,本次識別的準確率還算不錯,還可以再多測試幾次。