Bowyer_Zhang 2024-01-16 08:56 采纳率: 0%
浏览 13

如何模仿手写数字识别的LeNet卷积神经网络,搭建用于对女明星进行分类的程序

如何模仿手写数字识别的LeNet卷积神经网络,搭建用于对女明星进行分类的程序

本项目的文件夹下有一个压缩包,压缩包里有12名女明星的照片,怎么样才能模仿手写数字识别的LeNet卷积神经网络,搭建用于区分女明星的程序。

说明:
1.神经网络训练完成后,再选一张不属于训练集和测试集的图片,用训练好的神经网络进行预测
2.基本步骤提示:
(a).解压缩,用os模块获取每个图片的地址列表和标签 (标签就是文件夹名)
(b).建立数据集对象DataSet类,读取数据集,分割训练集和测试集,对图片进行转换和处理
(c).建立LeNet卷积神经网络的类(注意,由于图片大小、数据集数量有变,否则精度肯定很差)
(d).建立模型,配置参数,训练模型
(e).另下载一张照片,进行预测,输出预测结果

提示:

# 提示:首先请对上述生成每一组图片文件列表进行切割,分为训练集列表、测试集列表,比例为8:2
# 提示:构建DataSet类,用来给paddle2.0喂数据
class MyDataset(paddle.io.Dataset):
    """
    步骤一:继承paddle.io.Dataset类
    """
    def __init__(self, train_list, val_list, mode='train'):
        """
        步骤二:实现构造函数,定义数据读取方式
        """
        super(MyDataset, self).__init__()
        self.data= []

        if mode == 'train':
            
            # 获取训练集的self.data,请同学们自己写

        else:
            
             # 获取测试集的self.data,请同学们自己写

    def load_img(self, image_path):
        
        # 从路径名返回图片的函数请同学们自己写

        return image

    def __getitem__(self, index):
        """
        步骤三:实现__getitem__方法,定义指定index时如何获取数据,并返回单条数据(训练数据,对应的标签)
        """
        image = self.load_img(self.data[index][0])
        label = self.data[index][1]

        # 对图片进行统一化处理,请同学们自己写
        # 提示:图片尺寸要统一,尺寸不要太大,要转换成RGB格式 (CV2默认格式都是BGR)

        return image, np.array(label, dtype='int64')

    def __len__(self):
        """
        步骤四:实现__len__方法,返回数据集总数目
        """
        return len(self.data)

  • 写回答

2条回答 默认 最新

  • &春风有信 2024-01-16 09:34
    关注

    要模仿手写数字识别的LeNet卷积神经网络,搭建用于对女明星进行分类的程序,可以按照以下步骤进行:

    准备数据集:首先,你需要将压缩包中的女明星照片解压缩,并将它们按照相应的标签(即文件夹名)进行分类。可以使用Python的os模块来获取每个图片的地址列表和标签。
    数据预处理:然后,你需要建立一个数据集对象。在这个例子中,你可以创建一个名为MyDataset的类,继承自paddle.io.Dataset。在这个类中,你需要实现数据加载、图片尺寸统一、RGB格式转换等功能。
    建立LeNet卷积神经网络模型:接下来,你需要建立一个LeNet卷积神经网络的类。由于图片大小和数据集数量可能会有所不同,因此你需要根据实际情况进行调整,以确保模型的精度。
    训练模型:建立好模型后,你需要配置参数并训练模型。你可以使用PaddlePaddle框架提供的API来实现这一步。
    预测:最后,你可以下载一张不属于训练集和测试集的女明星照片,使用训练好的模型进行预测,并输出预测结果。
    以下是一个简化的代码示例,供你参考:

    import os
    import paddle
    from paddle.io import Dataset
    from PIL import Image
    import numpy as np
    
    class MyDataset(Dataset):
        def __init__(self, train_list, val_list, mode='train'):
            super(MyDataset, self).__init__()
            self.data = []
            if mode == 'train':
                for image_path, label in train_list:
                    self.data.append((image_path, label))
            else:
                for image_path, label in val_list:
                    self.data.append((image_path, label))
        
        def load_img(self, image_path):
            image = Image.open(image_path).convert('RGB')
            return image
        
        def __getitem__(self, index):
            image_path, label = self.data[index]
            image = self.load_img(image_path)
            image = paddle.to_tensor(np.array(image).astype('float32') / 255.0)
            return image, label
        
        def __len__(self):
            return len(self.data)
    
    # 加载数据集
    train_list = [(os.path.join("train", "明星A", "图片1.jpg"), "明星A")]  # 示例数据,需要根据实际情况修改
    val_list = [(os.path.join("val", "明星B", "图片1.jpg"), "明星B")]  # 示例数据,需要根据实际情况修改
    train_dataset = MyDataset(train_list, [], mode='train')
    val_dataset = MyDataset(train_list, [], mode='test')  # 可以用训练集作为验证集,简化示例
    
    # 创建LeNet卷积神经网络模型(简化示例)
    class Net(paddle.nn.Layer):
        def __init__(self):
            super(Net, self).__init__()
            self.conv1 = paddle.nn.Conv2D(in_channels=3, out_channels=6, kernel_size=5)
            self.pool = paddle.nn.MaxPool2D(kernel_size=2)
            self.fc = paddle.nn.Linear(in_features=6 * 15 * 15, out_features=10)  # 假设最后的卷积输出是15x15像素大小
        
        def forward(self, x):
            x = self.pool(paddle.nn.functional.relu(self.conv1(x)))
            x = paddle.reshape(x, shape=[-1, 6 * 15 * 15])  # 重新整形为适合全连接层的输入形状
            x = self.fc(x)
            return x
        
    # 配置和训练模型(简化示例)
    model = Net()
    criterion = paddle.nn.CrossEntropyLoss()  # 假设使用交叉熵损失函数,实际应用中可能需要其他损失函数或调整参数
    optimizer = paddle.optimizer.Adam(parameters=model.parameters())  # 使用Adam优化器,实际应用中可能需要其他优化器或调整参数
    for epoch in range(10):  # 假设训练10个epoch,实际应用中可能需要更多或更少epoch
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 1月16日

悬赏问题

  • ¥15 R语言regionNames()和demomap()无法选中中文地区的问题
  • ¥15 Open GL ES 的使用
  • ¥15 我如果只想表示节点的结构信息,使用GCN方法不进行训练可以吗
  • ¥15 QT6将音频采样数据转PCM
  • ¥15 本地安装org.Hs.eg.dby一直这样的图片报错如何解决?
  • ¥15 下面三个文件分别是OFDM波形的数据,我的思路公式和我写的成像算法代码,有没有人能帮我改一改,如何解决?
  • ¥15 Ubuntu打开gazebo模型调不出来,如何解决?
  • ¥100 有chang请一位会arm和dsp的朋友解读一个工程
  • ¥50 求代做一个阿里云百炼的小实验
  • ¥15 查询优化:A表100000行,B表2000 行,内存页大小只有20页,运行时3页,设计两个表等值连接的最简单的算法