文章目录

  • 简介
  • 一、CNN卷积神经网络基础知识
  • 二、数据集介绍
  • 三、代码实现
    • 读取数据
    • 数据处理
    • 搭建网络
    • 训练网络
    • 测试网络
    • 保存网络
    • 结果展示
  • 总结

简介

本篇文章利用pytorch搭建CNN卷积神经网络实现简单花卉分类的任务

一、CNN卷积神经网络基础知识

关于CNN卷积神经网络的基础知识以下文章有详细讲解,可供参考:
CNN笔记:通俗理解卷积神经网络

二、数据集介绍

本文使用花卉数据集,该数据集包含了4317张图片,包含雏菊、蒲公英、玫瑰、向日葵、郁金香五种花卉,我已将数据集拆分为训练集和测试集两部分,以下是数据集目录:

数据集已放于以下链接,有需要可自行下载
花卉数据集

三、代码实现

读取数据

step1.读取train\test文件夹,得到其中的五个子文件夹名称(即五种花卉名称)
step2.读取每一种花卉数量,相加得到总图片数目
step3.创建矩阵存放所有图片数据以及其对应标签
step4.返回数据及其标签

def read_file(path):  # 读取数据,文件夹中包含五个子文件夹data_list = os.listdir(path)  # 得到5个子文件夹名称data_len = 0  # 存放总图片数目for flower_type in data_list:data_len += len(os.listdir(os.path.join(path, flower_type)))data = np.zeros((data_len, 128, 128, 3))data_label = np.zeros(data_len)i = 0for j, flower_type in enumerate(data_list):  # 读出所有图片flower_list = os.listdir(os.path.join(path, flower_type))for img in flower_list:data[i, :, :, :] = cv2.resize(cv2.imread(os.path.join(path, flower_type, img)), (128, 128))data_label[i] = ji += 1return data, data_label
train_data, train_label = read_file('C:/Users/superjw/Desktop/flowers/train')
test_data, test_label = read_file('C:/Users/superjw/Desktop/flowers/test')
print("already get data...")

数据处理

step1.将数据转换为tensor(张量)形式并归一化处理
step2.准备Dataset与Dataloader

class ImgDataset(Dataset):def __init__(self, x=None, y=None, transform=None):self.x = xself.y = yself.transform = transformdef __len__(self):return len(self.x)def __getitem__(self, index):X = self.x[index]if self.transform is not None:X = self.transform(X)if self.y is not None:Y = self.y[index]return X, Yelse:return X
train_transform = transforms.Compose([  # 数据处理transforms.ToTensor(),  # 转换为张量transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),  # 归一化处理])test_transform = transforms.Compose([  # 数据处理transforms.ToTensor(),  # 转换为张量transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),  # 归一化处理])train_dataset = ImgDataset(train_data, train_label, train_transform)train_loader = DataLoader(train_dataset, batch_size=20, shuffle=True)test_dataset = ImgDataset(test_data, test_label, test_transform)test_loader = DataLoader(test_dataset, batch_size=20, shuffle=False)print("already process data...")

搭建网络

step1.搭建卷积神经网络
step2.定义损失函数与优化器
step2.查询GPU是否可用
step3.将模型置于GPU上等待训练

class Model(nn.Module):def __init__(self):super(Model, self).__init__()self.cnn = nn.Sequential(nn.Conv2d(3, 64, 3, 1, 1),  # 输入3*128*128,输出64*128*128nn.ReLU(),nn.MaxPool2d(2),  # 输出64*64*64nn.Conv2d(64, 128, 3, 1, 1),  # 输出128*64*64nn.ReLU(),nn.MaxPool2d(2),  # 输出128*32*32nn.Conv2d(128, 256, 3, 1, 1),  # 输出256*32*32nn.ReLU(),nn.MaxPool2d(2),  # 输出256*16*16nn.Conv2d(256, 512, 3, 1, 1),  # 输出512*16*16nn.ReLU(),nn.MaxPool2d(2),  # 输出512*8*8nn.Conv2d(512, 512, 3, 1, 1),  # 输出512*8*8nn.ReLU(),nn.MaxPool2d(2),  # 输出512*4*4)self.fc = nn.Sequential(nn.Linear(512 * 4 * 4, 1024),  # 输入8192,输出1024nn.ReLU(),nn.Linear(1024, 512),  # 输入1024,输出512nn.ReLU(),nn.Linear(512, 5)  # 输入512,输出5)
loss = nn.CrossEntropyLoss()  # 定义损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 定义优化器
print("if GPU can be used?:", torch.cuda.is_available())  # true 查看GPU是否可用
model = Model().cuda()  # 利用GPU加速
print("already prepared model...")

训练网络

step1.设置训练次数
step2.将模型置于训练状态
step3.利用训练集不断更新网络参数
step4.输出每一次训练后网络的准确度

num_epoch = 30print("start training...")for epoch in range(num_epoch):train_loss = 0train_acc = 0model.train()  # 模型置于训练状态for i, data in enumerate(train_loader):  # train_loader = (inputs, label)data[0] = data[0].type(torch.FloatTensor)data[1] = data[1].type(torch.FloatTensor)optimizer.zero_grad()  # 梯度清零pred_label = model(data[0].cuda())  # 实际输出batch_loss = loss(pred_label, data[1].cuda().long())  # 计算误差batch_loss.backward()  # 反向传播optimizer.step()  # 更新参数train_acc += np.sum(np.argmax(pred_label.cpu().data.numpy(), axis=1) == data[1].numpy())  # 计算准确度train_loss += batch_loss.item()  # 计算误差print("epoch:{}" .format(epoch+1))print("model's accuracy in train_data is:{}".format(train_acc/len(train_label)))print("model's loss in train_data is:{}".format(train_loss/len(train_label)))print("finish training...")

测试网络

step1.将网络置于评估模式
step2.计算网络在测试集上的准确度

print("start testing...")model.eval()test_acc = 0with torch.no_grad():for i, data in enumerate(test_loader):data[0] = data[0].type(torch.FloatTensor)data[1] = data[1].type(torch.FloatTensor)pred_label = model(data[0].cuda())  # 实际输出test_acc += np.sum(np.argmax(pred_label.cpu().data.numpy(), axis=1) == data[1].numpy())  # 计算准确度print("model's accuracy in test_data is:{}".format(test_acc / len(test_label)))

保存网络

torch.save(model.state_dict(), "C:/CodeProject/python/cnn/cnn.pt")
print("already save model")

结果展示

epoch:30
model's accuracy in train_data is:0.976594027441485
model's loss in train_data is:0.0043283372970561425
finish training...
start testing...
model's accuracy in test_data is:0.6483333333333333
already save model

总结

以上就是利用卷积神经网络实现图像分类的介绍,完整代码如下:

import os
import torch
import torch.nn as nn
import torchvision.transforms as transforms
import cv2
import numpy as np
from torch.utils.data import DataLoader, Datasetdef read_file(path):  # 读取数据,文件夹中包含五个子文件夹data_list = os.listdir(path)  # 得到5个子文件夹名称data_len = 0  # 存放总图片数目for flower_type in data_list:data_len += len(os.listdir(os.path.join(path, flower_type)))data = np.zeros((data_len, 128, 128, 3))data_label = np.zeros(data_len)i = 0for j, flower_type in enumerate(data_list):  # 读出所有图片flower_list = os.listdir(os.path.join(path, flower_type))for img in flower_list:data[i, :, :, :] = cv2.resize(cv2.imread(os.path.join(path, flower_type, img)), (128, 128))data_label[i] = ji += 1return data, data_labelclass ImgDataset(Dataset):def __init__(self, x=None, y=None, transform=None):self.x = xself.y = yself.transform = transformdef __len__(self):return len(self.x)def __getitem__(self, index):X = self.x[index]if self.transform is not None:X = self.transform(X)if self.y is not None:Y = self.y[index]return X, Yelse:return Xclass Model(nn.Module):def __init__(self):super(Model, self).__init__()self.cnn = nn.Sequential(nn.Conv2d(3, 64, 3, 1, 1),  # 输入3*128*128,输出64*128*128nn.ReLU(),nn.MaxPool2d(2),  # 输出64*64*64nn.Conv2d(64, 128, 3, 1, 1),  # 输出128*64*64nn.ReLU(),nn.MaxPool2d(2),  # 输出128*32*32nn.Conv2d(128, 256, 3, 1, 1),  # 输出256*32*32nn.ReLU(),nn.MaxPool2d(2),  # 输出256*16*16nn.Conv2d(256, 512, 3, 1, 1),  # 输出512*16*16nn.ReLU(),nn.MaxPool2d(2),  # 输出512*8*8nn.Conv2d(512, 512, 3, 1, 1),  # 输出512*8*8nn.ReLU(),nn.MaxPool2d(2),  # 输出512*4*4)self.fc = nn.Sequential(nn.Linear(512 * 4 * 4, 1024),  # 输入8192,输出1024nn.ReLU(),nn.Linear(1024, 512),  # 输入1024,输出512nn.ReLU(),nn.Linear(512, 5)  # 输入512,输出5)def forward(self, x):out = self.cnn(x)out = out.view(out.size()[0], -1)  # batch_size*8192return self.fc(out)if __name__ == '__main__':train_data, train_label = read_file('C:/Users/superjw/Desktop/flowers/train')test_data, test_label = read_file('C:/Users/superjw/Desktop/flowers/test')print("already get data...")train_transform = transforms.Compose([  # 数据处理transforms.ToTensor(),  # 转换为张量transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),  # 归一化处理])test_transform = transforms.Compose([  # 数据处理transforms.ToTensor(),  # 转换为张量transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),  # 归一化处理])train_dataset = ImgDataset(train_data, train_label, train_transform)train_loader = DataLoader(train_dataset, batch_size=20, shuffle=True)test_dataset = ImgDataset(test_data, test_label, test_transform)test_loader = DataLoader(test_dataset, batch_size=20, shuffle=False)print("already process data...")print("if GPU can be used?:", torch.cuda.is_available())  # true 查看GPU是否可用model = Model().cuda()  # 利用GPU加速print("already prepared model...")loss = nn.CrossEntropyLoss()  # 定义损失函数optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 定义优化器num_epoch = 30print("start training...")for epoch in range(num_epoch):train_loss = 0train_acc = 0model.train()  # 模型置于训练状态for i, data in enumerate(train_loader):  # train_loader = (inputs, label)data[0] = data[0].type(torch.FloatTensor)data[1] = data[1].type(torch.FloatTensor)optimizer.zero_grad()  # 梯度清零pred_label = model(data[0].cuda())  # 实际输出batch_loss = loss(pred_label, data[1].cuda().long())  # 计算误差batch_loss.backward()  # 反向传播optimizer.step()  # 更新参数train_acc += np.sum(np.argmax(pred_label.cpu().data.numpy(), axis=1) == data[1].numpy())  # 计算准确度train_loss += batch_loss.item()  # 计算误差print("epoch:{}" .format(epoch+1))print("model's accuracy in train_data is:{}".format(train_acc/len(train_label)))print("model's loss in train_data is:{}".format(train_loss/len(train_label)))print("finish training...")print("start testing...")model.eval()test_acc = 0with torch.no_grad():for i, data in enumerate(test_loader):data[0] = data[0].type(torch.FloatTensor)data[1] = data[1].type(torch.FloatTensor)pred_label = model(data[0].cuda())  # 实际输出test_acc += np.sum(np.argmax(pred_label.cpu().data.numpy(), axis=1) == data[1].numpy())  # 计算准确度print("model's accuracy in test_data is:{}".format(test_acc / len(test_label)))torch.save(model.state_dict(), "C:/CodeProject/python/cnn/cnn.pt")print("already save model")

CNN卷积神经网络:花卉分类相关推荐

  1. 基于TensorFlow的CNN卷积网络模型花卉分类GUI版(2)

    一.项目描述 10类花的图片1100张,按{牡丹,月季,百合,菊花,荷花,紫荆花,梅花,-}标注,其中1000张作为训练样本,100张作为测试样本,设计一个CNN卷积神经网络花卉分类器进行花卉的分类, ...

  2. CNN卷积神经网络(数字分类)

    CNN卷积神经网络--手写数字识别 import torch import torch.nn as nn from torch.autograd import Variable import torc ...

  3. 基于TensorFlow的CNN卷积网络模型花卉分类(1)

    一.项目描述 使用TensorFlow进行卷积神经网络实现花卉分类的项目,加载十种花分类,建立模型后进行预测分类图片 环境:win10 +TensorFlow gpu 1.12.0+pycharm 训 ...

  4. cnn 预测过程代码_代码实践 | CNN卷积神经网络之文本分类

    学习目录阿力阿哩哩:深度学习 | 学习目录​zhuanlan.zhihu.com 前面我们介绍了:阿力阿哩哩:一文掌握CNN卷积神经网络​zhuanlan.zhihu.com阿力阿哩哩:代码实践|全连 ...

  5. Tensorflow使用CNN卷积神经网络以及RNN(Lstm、Gru)循环神经网络进行中文文本分类

    Tensorflow使用CNN卷积神经网络以及RNN(Lstm.Gru)循环神经网络进行中文文本分类 本案例采用清华大学NLP组提供的THUCNews新闻文本分类数据集的一个子集进行训练和测试http ...

  6. 分类预测 | MATLAB实现CNN卷积神经网络数据分类预测

    分类预测 | MATLAB实现CNN卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现CNN卷积神经网络数据分类预测 基本介绍 模型设计 学习总结 参考资料 基本介绍 使用卷积网络的潜在好 ...

  7. TensorFlow CNN卷积神经网络实现工况图分类识别(一)

    1. Tensorflow知识点 1.1. 张量 在Tensorflow程序中,所有的数据都是通过张量的形式来表示.从功能的角度上看,张量可以简单的理解为多维数组. (1)占位符Placeholder ...

  8. CV之IC之AlexNet:基于tensorflow框架采用CNN卷积神经网络算法(改进的AlexNet,训练/评估/推理)实现猫狗分类识别案例应用

    CV之IC之AlexNet:基于tensorflow框架采用CNN卷积神经网络算法(改进的AlexNet,训练/评估/推理)实现猫狗分类识别案例应用 目录 基于tensorflow框架采用CNN(改进 ...

  9. Top2:CNN 卷积神经网络实现猫狗图片识别二分类

    Top2:CNN 卷积神经网络实现猫狗图片识别二分类 系统:Windows10 Professional 环境:python=3.6 tensorflow-gpu=1.14 ```python &qu ...

最新文章

  1. 怎么对 Java 程序调优?不看别后悔!
  2. 【深度学习】449页pdf,FaceBook称其迈出“重塑AI科学的第一步”
  3. 网络延长器分为哪几类?其应用领域有哪些?
  4. canopy算法流程_Canopy聚类算法(经典,看图就明白)
  5. Windows Server 2012 R2安装体验
  6. java web 21_JavaWeb——day21
  7. Linux头文件引用小技巧
  8. java笔记--查看和修改线程名称
  9. 使用cordova,使html5也能像IOS,Android那样可以 调取手机的相机拍照功能
  10. 对象流的序列化和反序列化
  11. Java视频教程等百度云资源分享
  12. 网络历史之金融投资三剑客0
  13. cesium中文教程(cesium中文教程PDF)
  14. flutter仿ReadHub+
  15. android夜景录像模式,【图片】三种夜景拍摄手法优缺点对比,仅供参考【android吧】_百度贴吧...
  16. mysql级联是什么意思_MySql级联操作
  17. HTML的基本结构语法
  18. 如何区分正反馈,负反馈放大电路?【模电02课】
  19. 51单片机 (九)定时器
  20. 我们进入微服务世界的旅程-以及我们从中学到的东西。

热门文章

  1. [ACNOI2022]猜数
  2. 汽车上的“黑匣子”,EDR成为中美智能汽车产业竞争的关键战场
  3. 真!无钥匙!数字钥匙在智能电动车领域的实践
  4. 牛客竞赛数学专题班生成函数I 题解
  5. 马云厌恶美国 阿里巴巴转道香港上市
  6. ElasticSearch 之 文本搜索
  7. 一图看懂TensorFlow2.0系列(十一)如何用TensorFlow2.0实现seq2seq的机器翻译?
  8. 水煮旅途之“天山夜话”
  9. android studio 读音,simplicity
  10. Django笔记七之ManyToMany和OneToOne介绍