第四次作业:CNN实战

OUC2022秋季软工09组第四次作业

声明

本博客为OUC2022秋季软件工程第四次作业

鄢凯瑞

一、下载数据集并处理数据

猫和狗的图片放在单独的文件夹中, 同时还提供了一个Validation数据。如果没有GPU设备,请减少用做训练的图像数据量即可。
因为这个代码需要在colab上跑,速度会相对较慢。因此,我们重新整理了数据,制作了新的数据集,训练集包含1800张图(猫的图片900张,狗的图片900张),测试集包含2000张图。
datasets 是 torchvision 中的一个包,可以用做加载图像数据。它可以以多线程(multi-thread)的形式从硬盘中读取数据,使用 mini-batch 的形式,在网络训练中向 GPU 输送。在使用CNN处理图像时,需要进行预处理。图片将被整理成 224 × 224 × 3 224\times 224 \times 3 224×224×3 的大小,同时还将进行归一化处理。
torchvision 支持对输入数据进行一些复杂的预处理/变换 (normalization, cropping, flipping, jittering 等)。具体可以参照 torchvision.tranforms 的官方文档说明。

image-20221022114138105

二、创建VGG 模型

torchvision中集成了很多在 ImageNet (120万张训练数据) 上预训练好的通用的CNN模型,可以直接下载使用。
在本课程中,我们直接使用预训练好的 VGG 模型。同时,为了展示 VGG 模型对本数据的预测结果,还下载了 ImageNet 1000 个类的 JSON 文件。
在这部分代码中,对输入的5个图片利用VGG模型进行预测,同时,使用softmax对结果进行处理,随后展示了识别结果。可以看到,识别结果是比较非常准确的。

image-20221022114307469

三、修改最后一层,冻结前面层的参数

VGG 模型如下图所示,注意该网络由三种元素组成:
卷积层(CONV)是发现图像中局部的 pattern
全连接层(FC)是在全局上建立特征的关联
池化(Pool)是给图像降维以提高特征的 invariance

四、训练并测试全连接层

包括三个步骤:第1步,创建损失函数和优化器;第2步,训练模型;第3步,测试模型。

image-20221022114415504

五、可视化模型预测结果(主观分析)

主观分析就是把预测的结果和相对应的测试图像输出出来看看,一般有四种方式:

  • 随机查看一些预测正确的图片
  • 随机查看一些预测错误的图片
  • 预测正确,同时具有较大的probability的图片
  • 预测错误,同时具有较大的probability的图片
  • 最不确定的图片,比如说预测概率接近0.5的图片
六、AI研习社测试截图

在这里插入图片描述
哪些技术可以提升分类准确率:

提高训练次数
改进算法,如激活函数等等
加深网络层数

王义钧

使用VGG模型进行猫狗大战

    在本次实验中,我们将利用给定的数据集训练模型,完成Kaggle大数据竞赛的赛题——Cats vs Dogs(猫狗大战),实现对猫或狗的识别。本次实验使用 fine-tuneVGG 网络进行测试(因为原网络的分类结果是1000类,所以这里进行迁移学习,即固定前面若干层,作为特征提取器,只重新训练最后两层)。

1、载入头文件

    载入头文件并分配GPU设备(这里我将Colab环境设置为GPU)。

import numpy as np
import matplotlib.pyplot as plt
import os
import torch
import torch.nn as nn
import torchvision
from torchvision import models,transforms,datasets
import time
import json


# 判断是否存在GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('Using gpu: %s ' % torch.cuda.is_available())

在这里插入图片描述

2、配置文件读取路径和下载数据集

    因为使用了云端服务,需要将Google colaboratory连接到云端硬盘。同时,文件使用了重新整理的数据,包含两个文件——train和valid,测试集包含2000张图。

# 连接到Google云盘
import os
from google.colab import drive
drive.mount('/content/drive')

path = "/content/drive/My Drive"

os.chdir(path)
os.listdir(path)

# 下载数据集
! wget http://fenggao-image.stor.sinaapp.com/dogscats.zip
! unzip dogscats.zip

在这里插入图片描述在这里插入图片描述

3、数据处理

    datasets 是 torchvision 中的一个包,可以用做加载图像数据。它可以以多线程(multi-thread)的形式从硬盘中读取数据,使用 mini-batch 的形式,在网络训练中向 GPU 输送。在使用CNN处理图像时,需要进行预处理。图片将被整理成 224 × 224 × 3 224\times 224 \times 3 224×224×3 的大小,同时还将进行归一化处理。

normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
 
vgg_format = transforms.Compose([
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                normalize,
            ])
 
data_dir = './dogscats'
 
dsets = {
   x: datasets.ImageFolder(os.path.join(data_dir, x), vgg_format)
         for x in ['train', 'valid']}
 
dset_sizes = {
   x: len(dsets[x]) for x in ['train', 'valid']}
dset_classes = dsets['train'].classes

    查看当前dsets训练集的训练类别,图片对应的标签,图片间隔和训练集大小。

print(dsets['train'].classes)
print(dsets['train'].class_to_idx)
print(dsets['train'].imgs[:5])
print("dset_sizes",dset_sizes) 

在这里插入图片描述

loader_train = torch.utils.data.DataLoader(dsets['train'], batch_size=64, shuffle=True, num_workers=6)
loader_valid = torch.utils.data.DataLoader(dsets['valid'], batch_size=5, shuffle=False, num_workers=6)
 
 
'''
valid 数据一共有2000张图,每个batch是5张,因此,下面进行遍历一共会输出到 400
同时,把第一个 batch 保存到 inputs_try, labels_try,分别查看
'''
count = 1
for data in loader_valid:
    print(count, end='\n')
    if count == 1:
        inputs_try,labels_try = data
    count +=1
 
print(labels_try)
print(inputs_try.shape)

在这里插入图片描述
    显示 labels_try 的5张图片,即valid里第一个batch的5张图片。

# 显示图片的小程序
 
def imshow(inp, title=None):
#   Imshow for Tensor.
    inp = inp.numpy().transpose((1, 2, 0))
    mean = np.array([0.485, 0.456, 0.406])
    std = np.array([0.229, 0.224, 0.225])
    inp = np.clip
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值