李宏毅机器学习hw3

Homework 3 - Convolutional Neural Network

本文是对课程作业代码范例的复现,但也写了一些自己的理解和期间遇到的问题,如有写的不对的地方欢迎各位大佬指正。问题的解决方法和参考资料在文中以链接的形式给出

主要的参考文章是iteapoy的这篇⭐ 李宏毅2020机器学习作业3-CNN:食物图片分类

 

 

1作业概述

在food_11文件中有三个文件分别是training、validation、testing,打开training和validation可以看见总共有11种食物(0-10的类别编号),而testing是没有类别编号的。

然后用卷积神经网络对食物图片进行分类。

 

2导入用到的库

  1. torch库
    这个我弄了半天,直接pip总是timeout,用镜像源下下来又出现OSError: [WinError 126]这个问题。最稳的还是直接去官网下torch和torchvision文件(他会给出你要下的版本),如果用浏览器下载速度太慢可以用迅雷试试,之后进行离线安装。
    具体操作看这里,如果用的是Anaconda好像就不用下CUDA和CUDNN。
  2. 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和DataLoaderpytorch源码分析之torch.utils.data.Dataset类和torch.utils.data.DataLoader类

  • 6
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值