Tensorflow實現ResNet50殘差神經網絡,進行圖像分類

在圖像分類領域內,其中的大殺器莫過於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

加載數據集:app

(train_image,train_label),(test_image,test_label)=tf.keras.datasets.fashion_mnist.load_data()

導入opencv並重命名:dom

import cv2 as cv

讀取數據集當中的500張圖片(注意不要使用全部的圖片進行讀取和resize,否則電腦的內存將會不存,由於resize以後每一張圖片的尺寸大大增長,60000張圖片所須要的電腦內存大體須要8.1Gb,使用CPU進行訓練的話,你的內存條也就須要目前空餘的至少在8gb以上,後期加上resnet的權重參數那更是幾個億,電腦的運行內存是不可能這麼大的,畢竟只要咱們的神經網絡好,幾個epoch就能夠獲得很好的驗證集準確度了,沒有必要追求數量),讀取和同時進行resize爲224*224*3的代碼以下:spa

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當中的數組,代碼以下:code

train_data=np.array(train_data)
train_data.shape

輸出目前的shape爲:對象

(500, 224, 224, 3)

將數據進行歸一化,加速卷積神經網絡的運算:blog

train_data=train_data/255

導入Resnet50模型,同時編譯模型:圖片

model = ResNet50(
    weights=None,
    classes=10
)

model.compile(optimizer="Adam",
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

開始擬合模型:ip

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的神經網絡了!

相關文章
相關標籤/搜索