在圖像分類領域內,其中的大殺器莫過於Resnet50了,這個殘差神經網絡當時被發明出來之后,頓時毀天滅敵,其余任何模型都無法想與之比擬。我們下面用Tensorflow來調用這個模型,讓我們的神經網絡對Fashion-mnist數據集進行圖像分類.由於在這個數據集當中圖像的尺寸是28*28*1的,如果想要使用resnet那就需要把28*28*1的灰度圖變為224*224*3的RGB圖,我們使用OpenCV庫可以很容易將圖像進行resize。
首先我們進行導包:
import os,sys import numpy as np import scipy from scipy import ndimage import tensorflow as tf import matplotlib.pyplot as plt from tensorflow.keras.applications.resnet50 import ResNet50 from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions from PIL import Image import random
加載數據集:
(train_image,train_label),(test_image,test_label)=tf.keras.datasets.fashion_mnist.load_data()
導入opencv並重命名:
import cv2 as cv
讀取數據集當中的500張圖片(注意不要使用所有的圖片進行讀取和resize,不然電腦的內存將會不存,因為resize之后每一張圖片的尺寸大大增加,60000張圖片所需要的電腦內存大致需要8.1Gb,使用CPU進行訓練的話,你的內存條也就需要目前空余的至少在8gb以上,后期加上resnet的權重參數那更是幾個億,電腦的運行內存是不可能這么大的,畢竟只要我們的神經網絡好,幾個epoch就可以得到很好的驗證集准確度了,沒有必要追求數量),讀取和同時進行resize為224*224*3的代碼如下:
train_data = [] for img in train_image[:500]: resized_img = cv.resize(img, (224, 224)) resized_img = cv.cvtColor(resized_img, cv.COLOR_GRAY2BGR) train_data.append(resized_img)
我們最后得到了一個三維的列表數據,但是這並不是一個ndarray,也就是numpy當中的數組對象,還無法進行訓練,我們需要將其轉化為numpy當中的數組,代碼如下:
train_data=np.array(train_data)
train_data.shape
輸出目前的shape為:
(500, 224, 224, 3)
將數據進行歸一化,加速卷積神經網絡的運算:
train_data=train_data/255
導入Resnet50模型,同時編譯模型:
model = ResNet50( weights=None, classes=10 ) model.compile(optimizer="Adam", loss='sparse_categorical_crossentropy', metrics=['accuracy'])
開始擬合模型:
model.fit(train_data,train_label[0:500], epochs=10, batch_size=6)
輸出:
Train on 500 samples Epoch 1/10 500/500 [==============================] - 256s 511ms/sample - loss: 1.5721 - accuracy: 0.4260 Epoch 2/10 500/500 [==============================] - 255s 511ms/sample - loss: 1.3282 - accuracy: 0.5600 Epoch 3/10 500/500 [==============================] - 260s 519ms/sample - loss: 1.1301 - accuracy: 0.6180 Epoch 4/10 500/500 [==============================] - 259s 519ms/sample - loss: 1.1403 - accuracy: 0.6080 Epoch 5/10 500/500 [==============================] - 261s 521ms/sample - loss: 1.0098 - accuracy: 0.6400 Epoch 6/10 500/500 [==============================] - 264s 528ms/sample - loss: 0.9646 - accuracy: 0.6860 Epoch 7/10 500/500 [==============================] - 268s 535ms/sample - loss: 0.8954 - accuracy: 0.6940 Epoch 8/10 500/500 [==============================] - 269s 539ms/sample - loss: 0.7415 - accuracy: 0.7540 Epoch 9/10 500/500 [==============================] - 274s 549ms/sample - loss: 0.7001 - accuracy: 0.7880 Epoch 10/10 500/500 [=============================] - 275s 551ms/sample - loss: 0.5996 - accuracy: 0.8020
從中可以發現只需要500張圖片,進行十次epoch,訓練集的准確度已經達到百分之八十。
這樣我們就使用tensorflow2.0快速實現了一個Resnet50的神經網絡了!