數據分析之道| TF入門實踐(2):基於 AlexNet 實現貓狗分類

2021-02-20 一席目實驗室

Picture from Internet

現實意義

在電影《九條命》中,導演毫不吝嗇的採用各種電影技巧去刻畫貓的可愛頑皮。但在幕後採訪故事中,導演表示自己其實對貓毛過敏,幾經幸苦才將 movie 拍完。喜愛貓咪但又對貓毛過敏是異常悲傷。所以導演想要養狗。某一天,他了解到一個動物市場,裡面只有兩種動物,狗,貓;主人迫於過敏,不能親自去挑選。於是他想了一個辦法,能不能用搭載了神經網絡的無人機遠程辨識出狗。

環境配置
import tensorflow as tfimport tensorflow.keras as kerasimport tensorflow_datasets as tfdsimport matplotlib.pyplot as plt

在本次實例中,我們採用tensoflow_datasets 第三方庫來加載數據,該庫集合了眾多著名的公開數據集,類型包括文字、圖片、語音、視頻等。本次數據集就來自於該庫中的 cats_vs_dogs 數據集。

數據集準備 —— cats_vs_dogs
(train_datas, val_datas), info = tfds.load('cats_vs_dogs', split=('train[:70%]', 'train[70%:]'), as_supervised=True, with_info=True, shuffle_files=True)infotfds.core.DatasetInfo(    name='cats_vs_dogs',    version=4.0.0,    description='A large set of images of cats and dogs.There are 1738 corrupted images that are dropped.',    homepage='https://www.microsoft.com/en-us/download/details.aspx?id=54765',    features=FeaturesDict({        'image': Image(shape=(None, None, 3), dtype=tf.uint8),        'image/filename': Text(shape=(), dtype=tf.string),        'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=2),}),    total_num_examples=23262,    splits={        'train': 23262,},    supervised_keys=('image', 'label'),    citation="""@Inproceedings (Conference){asirra-a-captcha-that-exploits-interest-aligned-manual-image-categorization,    author = {Elson, Jeremy and Douceur, John (JD) and Howell, Jon and Saul, Jared},    title = {Asirra: A CAPTCHA that Exploits Interest-Aligned Manual Image Categorization},    booktitle = {Proceedings of 14th ACM Conference on Computer and Communications Security (CCS)},    year = {2007},    month = {October},    publisher = {Association for Computing Machinery, Inc.},    url = {https://www.microsoft.com/en-us/research/publication/asirra-a-captcha-that-exploits-interest-aligned-manual-image-categorization/},    edition = {Proceedings of 14th ACM Conference on Computer and Communications Security (CCS)},}""",redistribution_info=,)

tfds.show_examples(train_datas, info)

從上面的信息我們可以看出來,圖片的大小不是固定的,所以我們需要對其加入一點點細節,使其高寬度統一。

def image_resize(image, label):  image = tf.image.resize(image, (227, 227)) / 255.0  return image, labeltrain_datas = train_datas.map(image_resize).shuffle(1000)val_datas = val_datas.map(image_resize).shuffle(1000)def visualize_image(image):  plt.figure()  plt.imshow(image  for image, label in train_datas.take(1):  visualize_image(image)  print(image.shape, label)  print(image.numpy()[1]  (227, 227, 3) tf.Tensor(1, shape=(), dtype=int64


自定義一個函數 image_resize(),該函數將原本不規則大小的圖像統一為(500, 500)的圖像,在除以 255.0 歸一化圖像。

train_datas.map()tf.data.Dataset().map(function) 函數能將自定義函數映射到全數據集,這樣就不用迭代改變圖像大小,大大提高效率。

自定義函數 visualize_image() 用來顯示我們測試的圖片。

圖像已被轉換成張量,萬事具備,只欠模型。

因為辨別貓狗比辨別手寫數字複雜的多,所以為了使準確度高一點, 我們使用 AlexNet,https://zhuanlan.zhihu.com/p/42914388。AlexNet運用了相當多的技巧,比如ReLu、多塊GPU並行訓練、局部響應歸一化、Overlapping池化、Dropout等。下圖為其網絡架構。我自己也嘗試過寫一些網絡層改變性能,但是效果卻不是很好。

model = keras.Sequential([  # layer_1  keras.layers.Conv2D(filters=96, kernel_size=(4, 4), strides=(4, 4),             padding='valid', input_shape=(227, 227, 3), activation='relu'),  keras.layers.BatchNormalization(),  keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid'),  # layer_2  keras.layers.Conv2D(filters=256, kernel_size=(5, 5), strides=(1, 1),            padding='same', activation='relu'),  keras.layers.BatchNormalization(),  keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid'),  # layer_3  keras.layers.Conv2D(filters=384, kernel_size=(3, 3), strides=(1, 1),            padding='same', activation='relu'),  keras.layers.Conv2D(filters=384, kernel_size=(3, 3), strides=(1, 1),            padding='same', activation='relu'),  keras.layers.Conv2D(filters=256, kernel_size=(3, 3), strides=(1, 1),            padding='same', activation='relu'),  keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid'),  # layer_4  keras.layers.Flatten(),  keras.layers.Dense(units=4096, activation='relu'),  keras.layers.Dropout(0.5),  # layer_5  keras.layers.Dense(units=4096, activation='relu'),  keras.layers.Dropout(0.5),  # layer_6  keras.layers.Dense(units=1000, activation='relu'),  keras.layers.Dropout(0.5),  # layer_7  keras.layers.Dense(units=2, activation='softmax')])  model.summary()

Model: "sequential"


模型編譯貓狗分類標籤有兩個種類,且用 1,0 表示,所以採用:
SparseCategoricalCrossentropymodel.compile(    optimizer=keras.optimizers.SGD(1e-3),    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),    metrics=['accuracy']  )

回調函數EarlyStopping 當被監測的數量不再提升,則停止訓練。TensorBoard TensorBoard 是由 Tensorflow 提供的一個可視化工具。可以利用該工具可視化訓練過程:
callback_list = [  keras.callbacks.EarlyStopping(monitor='accuracy', patience=5,), # patience 表示 accuracy 5 次沒有提升後,就停止模型  keras.callbacks.TensorBoard(log_dir='log_1',), # log_dir-->用來保存被 TensorBoard 分析的日誌文件的文件名]

訓練模型

batch大小也會影響模型訓練的好壞。一開始我用的是 32 ,後改成 128 ,精確度肉眼可見的提升。 Epochs 一般情況下為 80。

訓練參數較多的,推薦用GPU,速度會快很多。

model.fit(  train_datas.batch(128),  validation_data=val_datas.batch(128),  epochs=100,  callbacks=callback_list)

可視化訓練過程
%load_ext tensorboard%tensorboard --logdir='log_1'

從上面可以看出,訓練集訓練過中持續變小,上昇平緩。而驗證集波動大,說明模型效果很差。但這也是不可避免的,因為網絡層層數小,訓練次數小。

解決方案,調整超參數,增加網絡層,增加訓練次數。

模型預測

評價一個模型的好壞在於給他一張陌生的圖像或者文字,他正確率有多少。因為驗證機不參與模型訓練,所以我們輸入30張驗證集裡的圖片,來看看他的準確率吧!

class_name = info.features['label'].names # list ['cat', 'dog']images, labels = next(iter(val_datas.batch(30).prefetch(1)))predicted_images = model.predict(images)predicted_labels = tf.math.argmax(predicted_images, axis=-1)plt.figure(figsize=(14, 14))for i in range(30):  plt.subplot(6, 5, i+1)  plt.imshow(images[i])  color = 'blue' if predicted_labels[i] == labels[i] else 'red'  plt.title(class_name[predicted_labels[i]].title(), color=color)  plt.axis('off')

藍色標籤代表預測準確,紅色標籤代表預測失敗。圖中有兩個預測失敗,但是前面也說了,因為驗證集精準度波動極大,所以我們可能只是運氣好罷了。想要有十足的把握識別正確,就要努力提高模型精確度。

看來我們的導演可以放心的足不出戶的挑選喜愛的狗狗了。


參考資料: 

https://www.kaggle.com/seanbenhur/using-tensorflow-hub-to-get-99-accuracy

撰文:塗銀江

編輯:文凌

相關焦點

  • 基於Tensorflow實現FFM
    2.連續值離散化這個方法借鑑了Cart裡面對連續值的處理方式,就是把所有的連續值都當成一個分類變量處理。原始的數據就變成了[1,1,2,2,2,3],再進行2的連續值離散化方法,生成了age_1,age_2,age_3這幾個變量,優化了計算量,而且使得結果更具有解釋性。這個是官方指定的方法,是-1/1做二分類的時候常用的loss計算方法:
  • 數據分析需要嗎?
    基於行業標準的前五項:1)CLOUDERACloudera被認為是Hadoop專業知識的最佳認證之一。Cloudera涵蓋了廣泛的開發和管理技能 提供五項主要認證,包括-CCA數據分析師,CCP數據工程師,CCA管理員以及CCA Spark和Hadoop Developer。
  • 入門 | 想實現DCGAN?從製作一張門票談起!
    此外,本文還詳細說明了 DCGAN 的實現過程,是非常好的實踐教程。熱身假設你附近有個很棒的派對,你真的非常想去。但是,存在一個問題。為了參加聚會,你需要一張特價票——但是,票已經賣完了。等等!難道這不是關於生成對抗網絡(Generative Adversarial Network)的文章嗎?是的,沒錯。
  • 基於python+opencv的圖像目標區域自動提取
    print(srcWidth, srcHeight)2、中值濾波binary = cv2.medianBlur(gray,7)3、轉化為二值圖像ret, binary = cv2.threshold(binary, Config.threshold_thresh, 255, cv2.THRESH_BINARY)cv2
  • TensorFlow 2入門指南,初學者必備!
    字幕組雙語原文:TensorFlow我們在這裡使用CATEGRICAL_CROSENTROPY是因為我們有一個多類分類問題,如果我們有一個二進位分類問題,我們將使用BINARY_CROSENTROPY。衡量標準對於評估一個人的模型是很重要的。 我們可以根據不同的度量標準來評估我們的模型。 對於分類問題,最重要的衡量標準是準確度,它表明我們的預測有多準確。
  • 《AI安全之對抗樣本入門》低調上市
    《AI安全之對抗樣本入門》低調上市了3個月,我也沒做啥宣傳,主要是今年格外忙,所以也沒法像其他作者一樣到處參加會議拿著易拉寶海報做宣傳。看了下京東上的書評,還算不錯。另外據說在最近發布的某重要白皮書上,還被引用。
  • ARM7單片機輕鬆入門與實踐 — 暢學單片機
    本課程是ARM7單片機學習者從入門到深入的一套經典視頻教程,以初學者為對象,從零開始手把手教你學習單片機,循序漸進地基於理論講解並結合實驗項目實戰開發,講解當前最熱門的ARM7單片機的C程序設計!
  • TensorFlow2.0-Keras入門
    之前發了一篇《ULMFiT-用於文本分類的通用語言模型微調》後,由於忙其他的事情,公眾號寫作就暫時擱置了,今天登錄公眾號後臺發現有了26個關注者,那一瞬間簡直是滿滿的感動。最近在知乎上寫一些學習tensorflow2.0的筆記心得,整理成中文教程,希望幫助想學習tensorflow2的朋友更好的了解tensorflow2的同時,也是倒逼自己更好的學習。
  • 哪一個才更適合編程實現深度神經網絡?
    編程實現神經網絡的最佳框架是什麼?TensorFlow還是PyTorch?我的回答是:別擔心,你從哪一個入門,你選擇哪一個並不重要,重要的是自己動手實踐!下面我們開始吧!這兩種框架都提供了編程神經網絡常用的機器學習步驟:導入所需的庫加載並預處理數據定義模型定義優化器和損失函數訓練模型評估模型這些步驟可以在任何一個框架中找到非常類似的實現(即使是像MindSpore這樣的框架)。為此,在本文中,我們將構建一個神經網絡模型,分別在PyTorch API與TensorFlow Keras API下進行手寫數字分類任務的實現。
  • 美國電影:貓狗大戰2:珍珠貓復仇
    :珍珠貓大反撲(臺) / 貓狗鬥多番(港) / 貓狗大戰2:貓怪的復仇 / Cats & Dogs 2 / 貓狗大戰2 / 貓狗大戰:珍珠貓復仇評分:6.5時間:2010國別:美國分類:  劇 情 介 紹: __________       在這部貓狗大戰2中,距離上一次貓狗大戰已經過去了數年之久,來之不易的和平再一次受到威脅。這次的敵人可不是上一部中的笨蛋,它可是原貓咪間諜組織「喵」的頂級特工,名為Kitty Galore。
  • 實戰|基於TensorFlow+Python的文本分類全程詳解
    這是一個典型的二分類問題,是一種重要且廣泛適用的機器學習問題。我們將使用包含50,000條電影評論文本的IMDB(網際網路電影資料庫)數據集,並將其分為訓練集(含25,000條影評)和測試集(含25,000條影評)。訓練集和測試集是平衡的,也即兩者的正面評論和負面評論的總數量相同。
  • 工信部網安學堂:基於「零信任+」的流量威脅管控實踐
    作為可視化網絡安全技術創新者,安博通提供的「基於『零信任+』的流量威脅管控實踐」課程入選工信部網絡安全在線培訓平臺(簡稱「網安學堂」)。安全自適應架構(ASA)定義安全保護是一個連續的過程,業界基於ASA已有大量落地實踐。持續自適應風險與信任評估戰略(CARTA)更是一個龐大的體系,其中包括大數據、人工智慧、行為分析、威脅檢測、防護評估等方面。CARTA強調對風險和信任的評估分析,分析的過程就是尋求平衡的過程。
  • 使用tensorflow進行音樂類型的分類
    更好的選擇是依靠自動音樂類型分類。與我的兩位合作者張偉信(Wilson Cheung)和顧長樂(Joy Gu)一起,我們試圖比較不同的音樂樣本分類方法。特別是,我們評估了標準機器學習和深度學習方法的性能。我們發現特徵工程是至關重要的,而領域知識可以真正提高性能。在描述了所使用的數據源之後,我對我們使用的方法及其結果進行了簡要概述。
  • 95後哈佛小哥撰寫《從零開始的機器學習》,入門必備,書籍資源已開放
    機器之心報導作者:蛋醬、小舟機器學習怎麼入門最簡單?今年剛剛從哈佛大學統計專業畢業的 Danny Friedman 寫了一本「轉專業學生專用教材」,無基礎也可輕鬆入門,資源現已全部開放。
  • 「潔城號」揚帆起航 中國計量大學社會實踐小隊垃圾分類初體驗
    7月3日上午,杭州市餘杭區的浙江虎哥環境有限公司(以下簡稱虎哥公司)迎來了一批年輕的客人——中國計量大學「潔城號」社會實踐小分隊。  潔城號——源清流潔,眾志成城  小分隊由來自中國計量大學法學、智慧財產權、經管、理學等院系和專業的十一名大學生組成,他們致力於通過實踐調研,探尋破解「垃圾圍城」困局的鑰匙。
  • 大數據和數據分析不能混為一談,有哪些區別呢?
    而數據分析是指用適當的統計分析方法對收集來的大量數據進行分析,提取有用信息和形成結論而對數據加以詳細研究和概括總結的過程。這一過程也是質量管理體系的支持過程。在使用中,數據分析可幫助人們作出判斷,以便採取適當行動。數據分析針對所有數據類型而言的,而不是大數據獨有的特性。大數據通過數據挖掘以及數據分析實現其價值。
  • tf.keras文本分類小例子
    前幾天學了tf.keras,趁熱打鐵我就整了一個自己比較熟悉的文本分類任務來試試手,效果可能不是很重要,重要的是能把流程走通,所以一切從簡。懶人目錄:文件結構和模塊劃分思路先聊聊整套方案的算法視角思路,文本分類任務的常規基線是TextCNN,這裡為了簡單我只用了一個簡單的卷積層,而沒有用TextCNN裡面那種複雜形式(有關這個模型的具體解釋詳見:NLP.TM[24] | TextCNN的個人理解)。
  • 「我與貓狗的日常」百家號寵物領域排行,新作者選擇哪個領域好?
    我與貓狗的日常是當前百家號中的普通號,目前帳號百家號權重為2,綜合排名位列809819名,寵物分類排名位列5335名,領先了27.2%的百家號。 站長之家百家號傳媒平臺對我與貓狗的日常的運營數據估算如下: 預估總閱讀數:2000-3000,綜合排名63.8萬 ,寵物分類排名4681
  • 新時代文明實踐丨垃圾分類兒童話劇,童言童語講述文明新風
    日前,三間房定南裡社區新時代文明實踐站開展兒童話劇匯報演出,16位社區青少年完成了3個不同主題的話劇,30餘名居民到場觀演。演出後臺,小朋友們穿好戲服、化好妝,靜待表演的開始,而演出前臺則是一片歡歌笑語,音樂歡快,小朋友們的表演充滿激情。
  • 數據分析的黃金十二宮,從入門到精通,十二類好書,想要拿走
    2.《誰說菜鳥不會數據分析》非常著名的一套書籍,講解數據分析必知必會的知識、數據處理技巧、數據展現的技術、通過專業化的視角來提升圖表之美、數據分析報告的撰寫技能以及持續的修煉。讀者可以把這本書當小說來閱讀。