卷积神经网络(CNN)实现图像分类——Python

这篇具有很好参考价值的文章主要介绍了卷积神经网络(CNN)实现图像分类——Python。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

卷积神经网络(CNN)实现图像分类——Python

1.代码运行

  1. 输入 1 测试一张图片并预测结果

python图片分类源代码,python基础,python,cnn,分类,开发语言,深度学习

  1. 输入 2 对测试集整体进行测试,得出准确率(10秒左右)
    python图片分类源代码,python基础,python,cnn,分类,开发语言,深度学习

  2. 输入其他数字自动退出程序

2.注意事项

  1. 本程序包含python库较多,请自行配置(pip),如有需求,请评论或私信
    python图片分类源代码,python基础,python,cnn,分类,开发语言,深度学习

  2. 回复其他数字会自动退出程序

  3. 输入图片要求是28*28像素

  4. 模型训练大概需要2分钟,请耐心等候!

  5. 本代码使用在线MNIST数据库,无需本地MNIST数据库!

  6. 文件会自动在同目录下面生成Model文件夹,里面包含两个文件model.pdoptmodel.pdparams

  7. 如果需要可视化,可以将callbacks行注释去除

  8. 如果需要下图格式,请将上面代码中 verbose=0修改为verbose=1python图片分类源代码,python基础,python,cnn,分类,开发语言,深度学习

3.代码分析

  1. 数据预处理,从paddle库得到mnist数据
def data_process():
    transform = T.Normalize(mean=[127.5], std=[127.5])
    train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
    test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
    print('训练样本量:{},测试样本量:{}'.format(len(train_dataset), len(test_dataset)))
    return train_dataset, test_dataset

2.训练模型

def create_model(train_dataset, test_dataset):
    print('查找是否存在模型.')
    # 网络结构代码实现,调用paddle的网络
    network = paddle.vision.models.LeNet(num_classes=10)
    model = paddle.Model(network)
    model.prepare(paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()),  # 优化器
                  paddle.nn.CrossEntropyLoss(),  # 损失函数
                  paddle.metric.Accuracy())  # 评估指标
    if not os.path.exists('Model/model.pdopt') or not os.path.exists('Model/model.pdparams'):
        print('不存在模型,开始训练模型.')
        # callback = paddle.callbacks.VisualDL(log_dir='visualdl_log_dir_LeNet学习率0.001')
        # 启动全流程训练
        model.fit(train_dataset,  # 训练数据集
                  test_dataset,  # 评估数据集
                  epochs=5,  # 训练轮次
                  batch_size=64,  # 单次计算数据样本量
                  verbose=0,
                  # callbacks=callback
                  )  # 日志展示形式
        print("模型训练结束")
        # 进行预测操作
        # result = model_1.predict(test_dataset)
        model.save('Model/model')
    else:
        model.load('Model/model')
        print("已经存在训练好的模型!!!")
    return model

3.测试单张和多张


def Test_one(imgPath, modelPath):
    model = modelPath
    # image = preprocessing.StandardScaler().fit_transform(np.array(Image.open(imgPath).convert('L'), dtype='float32'))
    im = Image.open(imgPath).convert('L')
    # 为灰度图像,每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。 转换公式:L = R * 299/1000 + G * 587/1000+ B * 114/1000。
    # im = im.resize((28, 28), Image.ANTIALIAS)
    im = numpy.array(im).reshape(-1, 1, 28, 28).astype('float32')
    im = im / 255.0 - 1.0
    result = model.predict([im], verbose=True)
    print('预测结果是:', result[0][0].argmax(), '\n')  # argmax()得到最大值下标


# 测试准确率
def Test_all(modelPath):
    model = modelPath
    result = model.evaluate(test_dataset, verbose=1)
    print('准确率为:', result['acc'])

4.主程序文章来源地址https://www.toymoban.com/news/detail-740087.html

if __name__ == '__main__':
    print('训练数据自动使用paddle自带的MINST数据库')
    print('回复数字1为测试一张图片,回复数字2为测试测试集准确率,回复其他数字自动退出程序!!!\n')
    train_dataset, test_dataset = data_process()
    model = create_model(train_dataset, test_dataset)

    while 1:
        ans = input('测试一张(1)还是测试集准确率(2):')
        match (ans):
            case '1':
                modelPath = model  # 模型文件会生成在本文件同目录下不需要选择,这里Path默认直接加载模型
                root = tk.Tk()
                root.withdraw()
                print('请选择测试图片')
                imgPath = filedialog.askopenfilename()
                Test_one(imgPath, modelPath)
                continue
            case '2':
                modelPath = model
                Test_all(modelPath)
                continue
            case _:
                print('测试结束!!!')
                exit()

4.源代码

如果是完成大作业需求,请各位自己适配!!!!
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :CNN3.py
# @Time      :2023/4/24 14:28
# @Author    :YKW
import os
import paddle
import numpy
import tkinter as tk
from PIL import Image
from tkinter import filedialog
import paddle.vision.transforms as T

'protobuf版本建议使用3.20.0,否则会不兼容'
'训练数据自动使用paddle自带的MINST数据库'


# 数据预处理,从paddle库得到mnist数据
def data_process():
    transform = T.Normalize(mean=[127.5], std=[127.5])
    train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
    test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
    print('训练样本量:{},测试样本量:{}'.format(len(train_dataset), len(test_dataset)))
    return train_dataset, test_dataset


# 训练模型
def create_model(train_dataset, test_dataset):
    print('查找是否存在模型.')
    # 网络结构代码实现,调用paddle的网络
    network = paddle.vision.models.LeNet(num_classes=10)
    model = paddle.Model(network)
    model.prepare(paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()),  # 优化器
                  paddle.nn.CrossEntropyLoss(),  # 损失函数
                  paddle.metric.Accuracy())  # 评估指标
    if not os.path.exists('Model/model.pdopt') or not os.path.exists('Model/model.pdparams'):
        print('不存在模型,开始训练模型.')
        # callback = paddle.callbacks.VisualDL(log_dir='visualdl_log_dir_LeNet学习率0.001')
        # 启动全流程训练
        model.fit(train_dataset,  # 训练数据集
                  test_dataset,  # 评估数据集
                  epochs=5,  # 训练轮次
                  batch_size=64,  # 单次计算数据样本量
                  verbose=0,
                  # callbacks=callback
                  )  # 日志展示形式
        print("模型训练结束")
        # 进行预测操作
        # result = model_1.predict(test_dataset)
        '''
        indexs = [5, 20, 48, 210]
        for idx in indexs:
            show_img(test_dataset[idx][0], np.argmax(result[0][idx]))'''
        model.save('Model/model')
    else:
        model.load('Model/model')
        print("已经存在训练好的模型!!!")
    return model


# 测试单张
def Test_one(imgPath, modelPath):
    model = modelPath
    # image = preprocessing.StandardScaler().fit_transform(np.array(Image.open(imgPath).convert('L'), dtype='float32'))
    im = Image.open(imgPath).convert('L')
    # 为灰度图像,每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。 转换公式:L = R * 299/1000 + G * 587/1000+ B * 114/1000。
    # im = im.resize((28, 28), Image.ANTIALIAS)
    im = numpy.array(im).reshape(-1, 1, 28, 28).astype('float32')
    im = im / 255.0 - 1.0
    result = model.predict([im], verbose=True)
    print('预测结果是:', result[0][0].argmax(), '\n')  # argmax()得到最大值下标


# 测试准确率
def Test_all(modelPath):
    model = modelPath
    result = model.evaluate(test_dataset, verbose=1)
    print('准确率为:', result['acc'])


if __name__ == '__main__':
    print('训练数据自动使用paddle自带的MINST数据库')
    print('回复数字1为测试一张图片,回复数字2为测试测试集准确率,回复其他数字自动退出程序!!!\n')
    train_dataset, test_dataset = data_process()
    model = create_model(train_dataset, test_dataset)

    while 1:
        ans = input('测试一张(1)还是测试集准确率(2):')
        match (ans):
            case '1':
                modelPath = model  # 模型文件会生成在本文件同目录下不需要选择,这里Path默认直接加载模型
                root = tk.Tk()
                root.withdraw()
                print('请选择测试图片')
                imgPath = filedialog.askopenfilename()
                Test_one(imgPath, modelPath)
                continue
            case '2':
                modelPath = model
                Test_all(modelPath)
                continue
            case _:
                print('测试结束!!!')
                exit()



到了这里,关于卷积神经网络(CNN)实现图像分类——Python的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 卷积神经网络CNN原理+代码(pytorch实现MNIST集手写数字分类任务)

    前言 若将图像数据输入全连接层,可能会导致丧失一些位置信息 卷积神经网络将图像按照原有的空间结构保存,不会丧失位置信息。 卷积运算: 1.以单通道为例: 将将input中选中的部分与kernel进行数乘 : 以上图为例对应元素相乘结果为211,并将结果填入output矩阵的左上角

    2024年02月04日
    浏览(59)
  • 分类预测 | MATLAB实现POA-CNN鹈鹕算法优化卷积神经网络多特征分类预测

    分类效果 基本描述 1.Matlab实现POA-CNN鹈鹕算法优化卷积神经网络多特征分类预测,多特征输入模型,运行环境Matlab2018b及以上; 2.基于鹈鹕算法(POA)优化卷积神经网络(CNN)分类预测,优化参数为,学习率,批处理,正则化参数; 3.多特征输入单输出的二分类及多分类模型。程序

    2024年02月07日
    浏览(42)
  • Python实现ACO蚁群优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法,由意大利学者M. Dorigo, V. Maniezzo和A.Colorni等人于20世纪90年代初

    2024年02月06日
    浏览(36)
  • 卷积神经网络实现天气图像分类 - P3

    🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍦 参考文章:Pytorch实战 | 第P3周:彩色图片识别:天气识别 🍖 原作者:K同学啊 | 接辅导、项目定制 🚀 文章来源:K同学的学习圈子 系统: Linux 语言: Python3.8.10 深度学习框架: Pytorch2.0.0+cu118 首先是包引用 查询当前环境的

    2024年02月12日
    浏览(34)
  • 【故障分类】基于注意力机制的卷积神经网络结合双向长短记忆神经网络CNN-BiLSTM-attention实现数据分类附matlab代码

    ntion机制加权 4. 加权后的特征进行分类 本文旨在实现一个通用的数据分类模型,可应用于不同领域的数据分类任务。 设计一个CNN网络结构,提取输入数据的特征 将特征序列输入到BiLSTM网络,进行时序建模 在BiLSTM的输出上应用注意力机制,关注重要特征 最后将加权特征输入

    2024年03月11日
    浏览(68)
  • 【深度学习&NLP】基于卷积神经网络(CNN)实现中文文本情感分析(分类)附代码以及数据集链接

    【注】:本文所述的实验的完整实现代码包括数据集的仓库链接会在文末给出(建议读者自行配置GPU来加速TensorFlow的相关模型,运行起来会快非常多) 目录 一、研究的背景和目的 二、文本数据集描述 1、数据集来源以及使用目的 2、数据规模、以及如何划分数据集 3、数据集的

    2024年02月04日
    浏览(59)
  • 【图像分类】基于卷积神经网络和主动学习的高光谱图像分类(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 文献来

    2024年02月12日
    浏览(43)
  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(2)

    参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频4:CNN 中 stride 的概念 如上图,stride 其实就是 ”步伐“ 的概念。 默认情况下,滑动窗口一次移动一步。而当 stride = 2 时,则一次移动两步,垂直移动和水平移动都是。 当我们提高 stride 的值的时

    2024年02月06日
    浏览(34)
  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(1)

    先看卷积是啥,url: https://www.bilibili.com/video/BV1JX4y1K7Dr/?spm_id_from=333.337.search-card.all.clickvd_source=7a1a0bc74158c6993c7355c5490fc600 下面这个式子就是卷积 看完了,感觉似懂非懂 下一个参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频1:简单介绍卷积神经网络

    2024年02月08日
    浏览(42)
  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(3)

    参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频7:CNN 的全局架构 卷积层除了做卷积操作外,还要加上 bias ,再经过非线性的函数,这么做的原因是 “scaled properly” 通常滑动窗口(filter) 不止一个,如下图 如下图是一个 CNN 的全部流程 如上图,

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包