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.snet50 import ResNet50
from tensorflow.keras.preprocessing import image
from tensorflow.snet50 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
)
modelpile(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
numpy库运行速度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的神经⽹络了!