上回说到RESNET50做迁移学习,今天看一下他在图片分类上面的表现。图像分类是最基础的计算机视觉应用,属于有监督学习类别,先喂一堆猫的照片告诉他这是猫,再喂一堆狗的图片告诉他这是狗。
CIFAR-10数据集共有60000张32*32的彩色图像,分为10个类别,每类有6000张图,数据集一共有50000张训练图片和10000张评估图片。数据量还是很大的。
这里是一些数据集的样本图。虽然包浆比较严重,但是还是可以分辨出来的。各种类型的图片。
在这里插入图片描述
ResNet网络层结构如下图所示,以
- 输入彩色图像 224×224
- 首先通过数量64,卷积核大小为 7×7
- stride为2的卷积层conv1,该层输出图片大小为 112×112
- 输出channel为64;然后通过一个 3×3的最大下采样池化层,该层输出图片大小为 56×56
- 输出channel为64;再堆叠4个残差网络块(conv2_x、conv3_x、conv4_x和conv5_x),此时输出图片大小为 7×7
- 输出channel为2048;最后通过一个平均池化层、全连接层和softmax,得到分类概率。
import matplotlib.pyplot as plt
def visualize_model(best_ckpt_path, dataset_val):
num_class = 10 # 对狼和狗图像进行二分类
net = resnet50(num_class)
# 加载模型参数
param_dict = ms.load_checkpoint(best_ckpt_path)
ms.load_param_into_net(net, param_dict)
# 加载验证集的数据进行验证
data = next(dataset_val.create_dict_iterator())
images = data["image"]
labels = data["label"]
# 预测图像类别
output = net(data['image'])
pred = np.argmax(output.asnumpy(), axis=1)
# 图像分类
classes = []
with open(data_dir + "/batches.meta.txt", "r") as f:
for line in f:
line = line.rstrip()
if line:
classes.append(line)
# 显示图像及图像的预测值
plt.figure()
for i in range(6):
plt.subplot(2, 3, i + 1)
# 若预测正确,显示为蓝色;若预测错误,显示为红色
color = 'blue' if pred[i] == labels.asnumpy()[i] else 'red'
plt.title('predict:{}'.format(classes[pred[i]]), color=color)
picture_show = np.transpose(images.asnumpy()[i], (1, 2, 0))
mean = np.array([0.4914, 0.4822, 0.4465])
std = np.array([0.2023, 0.1994, 0.2010])
picture_show = std * picture_show + mean
picture_show = np.clip(picture_show, 0, 1)
plt.imshow(picture_show)
plt.axis('off')
plt.show()
# 使用测试数据集进行验证
visualize_model(best_ckpt_path=best_ckpt_path, dataset_val=dataset_val)
可以看到 预测的准确率还是不错的。