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

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

1.代码运行

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

在这里插入图片描述

  1. 输入 2 对测试集整体进行测试,得出准确率(10秒左右)
    在这里插入图片描述

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

2.注意事项

  1. 本程序包含python库较多,请自行配置(pip),如有需求,请评论或私信
    在这里插入图片描述

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

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

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

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

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

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

  8. 如果需要下图格式,请将上面代码中 verbose=0修改为verbose=1在这里插入图片描述

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.主程序

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()



  • 12
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
要使用卷积神经网络进行图像分类Python代码,可以参考以下步骤: 1. 导入所需的库:导入必要的库,例如numpy、matplotlib和torch。 2. 加载和预处理数据:加载图像数据集并进行必要的预处理操作,例如标准化和转换为张量。 3. 定义卷积神经网络模型:使用PyTorch的nn模块定义卷积神经网络模型,包括卷积层、池化层和全连接层等。 4. 定义训练和测试函数:定义训练和测试函数,用于训练模型和评估模型在测试集上的准确性。 5. 训练模型:使用训练函数来训练模型,并根据需要进行多个训练周期。 6. 测试模型:使用测试函数来评估模型在测试集上的准确性。 7. 可视化结果:使用matplotlib库来可视化模型训练过程中的准确率和损失值等。 以上代码段中的引用是一个示例,展示了如何使用Python和PyTorch来加载数据集、定义模型和进行训练和测试。引用提供了一些参考资料和文档链接,可以进一步学习和了解深度学习和PyTorch相关的知识。引用展示了如何查看训练集中的一批样本,并使用matplotlib库来显示图像。 请注意,以上仅是一个示例,实际的卷积神经网络图像分类代码可能会更加复杂和详细,具体实现取决于具体的数据集和需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [卷积神经网络CNN实现图像分类——Python](https://blog.csdn.net/CSDN_WHO/article/details/130610837)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [轻松学Pytorch-使用卷积神经网络实现图像分类](https://blog.csdn.net/weixin_40920183/article/details/106515348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值