Homework 3 - Convolutional Neural Network
本文是对课程作业代码范例的复现,但也写了一些自己的理解和期间遇到的问题,如有写的不对的地方欢迎各位大佬指正。问题的解决方法和参考资料在文中以链接的形式给出
主要的参考文章是iteapoy的这篇⭐ 李宏毅2020机器学习作业3-CNN:食物图片分类
1作业概述
在food_11文件中有三个文件分别是training、validation、testing,打开training和validation可以看见总共有11种食物(0-10的类别编号),而testing是没有类别编号的。
然后用卷积神经网络对食物图片进行分类。
2导入用到的库
- torch库
这个我弄了半天,直接pip总是timeout,用镜像源下下来又出现OSError: [WinError 126]这个问题。最稳的还是直接去官网下torch和torchvision文件(他会给出你要下的版本),如果用浏览器下载速度太慢可以用迅雷试试,之后进行离线安装。
具体操作看这里,如果用的是Anaconda好像就不用下CUDA和CUDNN。 - opencv-python
import cv2 需要安装opencv-python库,还是用离线安装的方法,先从https://pypi.org/project/opencv-python/#files下对应版本的文件,再安装。
import os
import numpy as np
import cv2
import torch
import torch.nn as nn
import torchvision.transforms as transforms
import pandas as pd
from torch.utils.data import DataLoader, Dataset
import time
3读取图片
def readfile(path, label):
#因为训练集和验证集需要y的值,而test集不需要,label用来确定是哪一种情况
image_dir = sorted(os.listdir(path))
x = np.zeros((len(image_dir),128,128,3), dtype = np.uint8)
y = np.zeros((len(image_dir)), dtype = np.uint8)
for i, file in enumerate(image_dir):
#读取图片
img = cv2.imread(os.path.join(path, file))
# 利用cv2.resize()函数将不同大小的图片统一为128(高)*128(宽)
x[i,:,:] = cv2.resize(img,(128,128))
if label:
y[i] = int(file.split('_')[0])
#label表示需不需要返回y的值
if label:
return x,y
else:
return x
workspace_dir='C:/Users/ASUS/hwdata/hw3/food-11'
print('Reading data')
train_x,train_y = readfile(os.path.join(workspace_dir,'training'), True)
print("Size of training data = {}".format(len(train_x)))
val_x, val_y = readfile(os.path.join(workspace_dir,'validation'), True)
print("Size of validation data = {}".format(len(val_x)))
test_x = readfile(os.path.join(workspace_dir,"testing"), False)
print("Size of Testing data = {}".format(len(test_x)))
Reading data
Size of training data = 9866
Size of validation data = 3430
Size of Testing data = 3347
4数据增强
图像数据准备对神经网络与卷积神经网络模型训练有重要影响,当样本空间不够或者样本数量不足的时候会严重影响训练或者导致训练出来的模型泛化程度不够,识别率与准确率不高。对图像数据进行数据增强,获取样本的多样性与数据的多样性从而为训练模型打下良好基础。
#training 时,通过随机旋转、水平翻转图片来进行数据增强(data augmentation)
train_transform = transforms.Compose([
transforms.ToPILImage(),
transforms.RandomHorizontalFlip(), #随机翻转图片
transforms.RandomRotation(15.0), #随机旋转图片
transforms.ToTensor(), #将图片变成 Tensor,并且把数值normalize到[0,1]
])
#testing 时,不需要进行数据增强(data augmentation)
test_transform = transforms.Compose([
transforms.ToPILImage(),
transforms.ToTensor(),
])
5DataSet 和 DataLoader
具体可参考PyTorch 入门实战(三)——Dataset和DataLoader、pytorch源码分析之torch.utils.data.Dataset类和torch.utils.data.DataLoader类、