图像分类(image classification)是计算机视觉领域中最简单最基础的任务,学习研究图像分类是每个计算机视觉研究者的必经之路,图像分类网络也是很多更复杂任务(如目标检测、语义分割等)算法的基础。本练习赛旨在让选手们用图像分类任务来以赛代练、熟悉深度学习框架和比赛流程。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜
在图像分类学习中,MNIST数据集常被用来作为入门教学数据集。但是,MNIST数据集存在一些问题:首先,MNIST数据集对于现在的卷积神经网络来说过于简单,SOTA模型的分类精度达到了99.84%,甚至传统机器学习方法也能达到97%的精度,因此模型的精度在此达到了饱和,几乎没有提升的空间;再者,有些专家对MNIST数据集提出了质疑,比如谷歌的深度学习专家、Keras的作者François Chollet曾表示:“MNIST存在很多问题,但最重要的是,它真的不具有计算机视觉任务的代表性。”并补充道:“很多好点子(比如batch norm)在MNIST上效果差,但相反的,一些差的方法可能在MNIST产生好效果,却不能迁移到真实计算机视觉任务中。”
本练习赛采用和MNIST同等规模但更有难度的数据集Fashion-MNIST(github链接:https://github.com/zalandoresearch/fashion-mnist),Fashion-MNIST由60000张训练集图像、10000张测试集图像及对应的标签构成,每张图像是分辨率为28x28的灰度图像,包含10种分类:T恤、裤子、套头衫、连衣裙、大衣、凉鞋、衬衫、运动鞋、包、短靴。
本练习赛的参赛者可以使用Tensorflow、Keras、Pytorch、Paddlepaddle等开源深度学习框架来进行模型的搭建、训练和预测。
In [1]import pandas as pdimport numpy as np# 数据In [2]读取train_df = pd.read_csv('fashion-mnist_train.csv') test_df = pd.read_csv('fashion-mnist_test_data.csv')
train_df.head()
label pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 \ 0 2 0 0 0 0 0 0 0 0 1 9 0 0 0 0 0 0 0 0 2 6 0 0 0 0 0 0 0 5 3 0 0 0 0 1 2 0 0 0 4 3 0 0 0 0 0 0 0 0 pixel9 ... pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 \ 0 0 ... 0 0 0 0 0 0 1 0 ... 0 0 0 0 0 0 2 0 ... 0 0 0 30 43 0 3 0 ... 3 0 0 0 0 1 4 0 ... 0 0 0 0 0 0 pixel781 pixel782 pixel783 pixel784 0 0 0 0 0 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 0 0 0 0 [5 rows x 785 columns]
%pylab inline# 绘制10*10的图片plt.figure(figsize=(10, 10))for idx in range(100): # 图片尺寸从784 -》 28 * 28
xy = train_df.iloc[idx].values[1:].reshape(28,28)
plt.subplot(10, 10, idx+1) # 展示图片
plt.imshow(xy, cmap='gray')
plt.xticks([]); plt.yticks([])
Populating the interactive namespace from numpy and matplotlib
In [4]
import paddle paddle.__version__
'2.2.0'
from paddle.io import DataLoader, Datasetfrom PIL import Image# 自定义数据集完成数据读取class MyDataset(Dataset):
def __init__(self, img, label):
super(MyDataset, self).__init__()
self.img = img
self.label = label
def __getitem__(self, index):
img = self.img[index] # 对数据集进行归一化
return img/255, int(self.label[index]) def __len__(self):
return len(self.label)# 使用5.9w进行训练train_dataset = MyDataset(
train_df.iloc[:-1000, 1:].values.reshape(59000, 28, 28).astype(np.float32),
paddle.to_tensor(train_df.label.iloc[:-1000].values.astype(np.float32))
)
train_loader = DataLoader(train_dataset, batch_size=300, shuffle=True)# 最后1k作为验证集val_dataset = MyDataset(
train_df.iloc[-1000:, 1:].values.reshape(1000, 28, 28).astype(np.float32),
paddle.to_tensor(train_df.label.iloc[-1000:].values.astype(np.float32))
)
val_loader = DataLoader(val_dataset, batch_size=300, shuffle=False)# 最终测试集test_dataset = MyDataset(
test_df.iloc[:, 1:].values.reshape(10000, 28, 28).astype(np.float32),
paddle.to_tensor(np.zeros((test_df.shape[0])))
)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
# 构建全连接模型,先需要从多维转变为二维model = paddle.nn.Sequential(
paddle.nn.Flatten(),
paddle.nn.Linear(28*28,128),
paddle.nn.LeakyReLU(),
paddle.nn.Linear(128, 10)
)
paddle.summary(model, (64, 28, 28))
W1207 20:53:04.353837 104 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1 W1207 20:53:04.359086 104 device_context.cc:465] device: 0, cuDNN Version: 7.6.
--------------------------------------------------------------------------- Layer (type) Input Shape Output Shape Param # =========================================================================== Flatten-1 [[64, 28, 28]] [64, 784] 0 Linear-1 [[64, 784]] [64, 128] 100,480 LeakyReLU-1 [[64, 128]] [64, 128] 0 Linear-2 [[64, 128]] [64, 10] 1,290 =========================================================================== Total params: 101,770 Trainable params: 101,770 Non-trainable params: 0 --------------------------------------------------------------------------- Input size (MB): 0.19 Forward/backward pass size (MB): 0.51 Params size (MB): 0.39 Estimated Total Size (MB): 1.09 ---------------------------------------------------------------------------
{'total_params': 101770, 'trainable_params': 101770}
In [7]
# 定义优化器,损失函数optimizer = paddle.optimizer.Adam(parameters=model.parameters(), learning_rate=0.0001)
criterion = paddle.nn.CrossEntropyLoss()# 每个epoch迭代训练# 每个batch -> 正向传播 -> 计算损失 -> 更新参数for epoch in range(0, 5):
Train_Loss, Val_Loss = [], []
Train_ACC, Val_ACC = [], [] # 训练部分
model.train() for i, (x, y) in enumerate(train_loader):
pred = model(x)
loss = criterion(pred, y)
Train_Loss.append(loss.item())
loss.backward()
optimizer.step()
optimizer.clear_grad()
Train_ACC.append((pred.numpy().argmax(1) == y.numpy()).mean())
if i % 100 == 0: print(f'{i}/{len(train_loader)}\t Loss {np.mean(Train_Loss):3.5f} {np.mean(Train_ACC):3.5f}') # 验证部分
model.eval() for i, (x, y) in enumerate(val_loader):
pred = model(x)
loss = criterion(pred, y)
Val_Loss.append(loss.item())
Val_ACC.append((pred.numpy().argmax(1) == y.numpy()).mean())
if epoch % 1 == 0: print(f'\nEpoch: {epoch}') print(f'Loss {np.mean(Train_Loss):3.5f}/{np.mean(Val_Loss):3.5f}') print(f'ACC {np.mean(Train_ACC):3.5f}/{np.mean(Val_ACC):3.5f}')
0/197 Loss 2.33518 0.17000 100/197 Loss 1.50995 0.55713 Epoch: 0 Loss 1.20884/0.83340 ACC 0.63190/0.71083 0/197 Loss 0.77190 0.74667 100/197 Loss 0.73694 0.76122 Epoch: 1 Loss 0.69631/0.65332 ACC 0.77584/0.77250 0/197 Loss 0.61251 0.80333 100/197 Loss 0.60704 0.80515 Epoch: 2 Loss 0.59082/0.57583 ACC 0.80878/0.80167 0/197 Loss 0.52229 0.84333 100/197 Loss 0.55234 0.81921 Epoch: 3 Loss 0.53963/0.53572 ACC 0.82233/0.80417 0/197 Loss 0.54005 0.81667 100/197 Loss 0.51667 0.82782 Epoch: 4 Loss 0.50867/0.50455 ACC 0.83046/0.82083
# 卷积模型model = paddle.nn.Sequential(
paddle.nn.Conv2D(1, 10, (5, 5)),
paddle.nn.ReLU(),
paddle.nn.Conv2D(10, 20, (5, 5)),
paddle.nn.ReLU(),
paddle.nn.MaxPool2D((2, 2)),
paddle.nn.Flatten(),
paddle.nn.Linear(2000, 10),
)
paddle.summary(model, (64, 1, 28, 28))
---------------------------------------------------------------------------
Layer (type) Input Shape Output Shape Param #
===========================================================================
Conv2D-5 [[64, 1, 28, 28]] [64, 10, 24, 24] 260
ReLU-5 [[64, 10, 24, 24]] [64, 10, 24, 24] 0
Conv2D-6 [[64, 10, 24, 24]] [64, 20, 20, 20] 5,020
ReLU-6 [[64, 20, 20, 20]] [64, 20, 20, 20] 0
MaxPool2D-4 [[64, 20, 20, 20]] [64, 20, 10, 10] 0
Flatten-4 [[64, 20, 10, 10]] [64, 2000] 0
Linear-5 [[64, 2000]] [64, 10] 20,010
===========================================================================
Total params: 25,290
Trainable params: 25,290
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.19
Forward/backward pass size (MB): 15.40
Params size (MB): 0.10
Estimated Total Size (MB): 15.68
---------------------------------------------------------------------------
{'total_params': 25290, 'trainable_params': 25290}
In [12]
# 优化器与损失函数optimizer = paddle.optimizer.Adam(parameters=model.parameters(), learning_rate=0.0001)
criterion = paddle.nn.CrossEntropyLoss()# 训练部分for epoch in range(0, 5):
Train_Loss, Val_Loss = [], []
Train_ACC, Val_ACC = [], []
model.train() for i, (x, y) in enumerate(train_loader):
pred = model(x.reshape((-1, 1, 28, 28)))
loss = criterion(pred, y)
Train_Loss.append(loss.item())
loss.backward()
optimizer.step()
optimizer.clear_grad()
Train_ACC.append((pred.numpy().argmax(1) == y.numpy()).mean())
if i % 100 == 0: print(f'{i}/{len(train_loader)}\t Loss {np.mean(Train_Loss):3.5f} {np.mean(Train_ACC):3.5f}')
model.eval() for i, (x, y) in enumerate(val_loader):
pred = model(x.reshape((-1, 1, 28, 28)))
loss = criterion(pred, y)
Val_Loss.append(loss.item())
Val_ACC.append((pred.numpy().argmax(1) == y.numpy()).mean())
if epoch % 1 == 0: print(f'\nEpoch: {epoch}') print(f'Loss {np.mean(Train_Loss):3.5f}/{np.mean(Val_Loss):3.5f}') print(f'ACC {np.mean(Train_ACC):3.5f}/{np.mean(Val_ACC):3.5f}')
0/197 Loss 2.29863 0.15333 100/197 Loss 1.61717 0.53125 Epoch: 0 Loss 1.23357/0.74845 ACC 0.62601/0.74167 0/197 Loss 0.73336 0.76000 100/197 Loss 0.66099 0.76261 Epoch: 1 Loss 0.63249/0.61879 ACC 0.77187/0.77333 0/197 Loss 0.56483 0.80000 100/197 Loss 0.55956 0.79855 Epoch: 2 Loss 0.54548/0.56240 ACC 0.80436/0.79167 0/197 Loss 0.58850 0.77333 100/197 Loss 0.51179 0.81703 Epoch: 3 Loss 0.50036/0.52460 ACC 0.82221/0.80583 0/197 Loss 0.41658 0.86667 100/197 Loss 0.47553 0.83274 Epoch: 4 Loss 0.47199/0.50074 ACC 0.83300/0.82333
# paddlepaddle
# 能在
# 提出了
# 也能
# 在此
# 代练
# 多维
# 最简单
# 达到了
# 必经之路
# 练习赛
# https
# git
# pytorch
# keras
# tensorflow
# cnn
# 算法
# github
# batch
# igs
# red
# ai
# 谷歌
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化91478 】
【
技术知识72672 】
【
云计算0 】
【
GEO优化84317 】
【
优选文章0 】
【
营销推广36048 】
【
网络运营41350 】
【
案例网站102563 】
【
AI智能45237 】
相关推荐:
AI Excel公式生成工具有哪些_一键生成函数公式的AI工具推荐
利用 ChatGPT 进行复杂数学公式的推导教程
ChatGPT助力Instagram Reels脚本创作:提升内容质量
法国历史古迹修复:探秘 Château de Purnon 城堡的艺术与挑战
文心一言辅助进行中文播客脚本起草教程
AI赋能副业:五大掘金机会,轻松开启智能创收时代
智行ai抢票如何查看抢票进度_智行ai抢票进度查询与状态解读【实操】
Napkin AI:AI驱动的文本可视化工具,轻松创建思维导图
Xcode 26 Beta 新功能:集成 ChatGPT 代码助手全面测评
AI聊天机器人会取代人类吗?深度剖析与未来展望
ATS优化:Euron ResumeAI打造高效求职简历
Claude怎么用新功能诗歌创作_Claude诗歌创作使用【方法】
利用 DeepSeek 辅助进行编译器原理课程学习
百度AI对话助手入口 智能聊天机器人入口
AI助手高效获取谷歌评论:提升本地商家曝光率的终极指南
Filmora 13 AI音乐生成器:创意视频配乐新纪元
Artspace.ai: AI驱动的创意设计平台,提升小企业营销效率
微信AI数字人能否识别语音消息_微信AI数字人语音识别与回复设置【教程】
kimi如何导出对话_导出对话内容方法【攻略】
AI音乐创作:颠覆传统,开启音乐新纪元
千问能否生成多语言年终总结_千问多语言翻译与本地化调整【攻略】
百度AI搜索如何开启无痕搜索_百度AI搜索无痕模式设置与隐私保护【攻略】
E-LabVine:AI赋能的数字化学习平台,提升高中学业表现
打破传统,拥抱幸福:公主如何找到真我?
2025年AI图像生成指南:Google Gemini Nano Banana教程
稿定设计AI抠图怎样调整透明度_稿定设计AI透明度滑块与渐变设置【攻略】
定价3499炒到1.2万,豆包AI手机遭“封杀”,变革之路何去何从?
AI周报生成工具有哪些_一键生成工作总结的AI工具推荐
AI绘画工具怎么用_AI绘画工具使用方法详细指南【教程】
教你用AI将一段旋律扩展成一首完整的曲子
支付宝出行AI能否自动抢票_支付宝AI出行抢票设置与免密支付【方法】
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Removebg怎样快速抠图_Removebg上传图片与自动抠图步骤【教程】
豆包AI能否用提示词调整回答深度_豆包AI深度控制提示词技巧【方法】
AI赋能保险销售:提升邮件营销效果的终极指南
批改网AI检测工具怎样优化检测精度_批改网AI检测工具精度调节与模型选择【实操】
AI照片编辑终极指南:一键打造潮流图像
AI UGC生成器深度测评:四大工具横向对比分析
2025 YouTube自动化终极指南:利用AI实现高效内容创作和多平台发布
MediCa AI:AI赋能的智能医疗保健平台全面解析
tofai官网正版入口 tofai网页版免费使用
批改网ai检测工具怎么检测多语言作文_批改网ai检测工具多语言切换与检测支持【技巧】
AI复古纱丽照片编辑:用Google Gemini轻松生成时尚照片
lovemo网页版直接进入 lovemo官网在线登录
批改网AI检测工具怎样批量检测作文_批改网AI检测工具批量上传与处理流程【攻略】
利用AI自动化生成电子书:Make.com的终极教程
利用AI自动化回复Google Voice短信:终极指南
Postman Flows:构建智能AI驱动型工作流完全指南
《高龄母亲》:从日本民间故事中汲取的人生智慧与家庭真谛
宝可梦化石精灵大揭秘:晶灿钻石视角下的精灵演化
2025-07-31
南京市珐之弘网络技术有限公司专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。