7-mnist-cnn

mnist cnn

导入包

%reload_ext autoreload
%autoreload 2
%matplotlib inline
from fastai.vision import *

导入数据

path = untar_data(URLs.MNIST)
path.ls()
[WindowsPath('C:/Users/Wither8848/.fastai/data/mnist_png/testing'),
 WindowsPath('C:/Users/Wither8848/.fastai/data/mnist_png/training')]
  • 转化成灰度图
il = ImageList.from_folder(path, convert_mode='L')
il.items[0]
WindowsPath('C:/Users/Wither8848/.fastai/data/mnist_png/testing/0/10.png')
  • 设置成灰度图模式
defaults.cmap='binary'
il
ImageList (70000 items)
Image (1, 28, 28),Image (1, 28, 28),Image (1, 28, 28),Image (1, 28, 28),Image (1, 28, 28)
Path: C:\Users\Wither8848\.fastai\data\mnist_png
il[0].show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qPyj1Jd9-1585460137806)(output_10_0.png)]

分割数据集

sd = il.split_by_folder(train='training', valid='testing')
  • 获取标签
ll = sd.label_from_folder()
ll
LabelLists;

Train: LabelList (60000 items)
x: ImageList
Image (1, 28, 28),Image (1, 28, 28),Image (1, 28, 28),Image (1, 28, 28),Image (1, 28, 28)
y: CategoryList
0,0,0,0,0
Path: C:\Users\Wither8848\.fastai\data\mnist_png;

Valid: LabelList (10000 items)
x: ImageList
Image (1, 28, 28),Image (1, 28, 28),Image (1, 28, 28),Image (1, 28, 28),Image (1, 28, 28)
y: CategoryList
0,0,0,0,0
Path: C:\Users\Wither8848\.fastai\data\mnist_png;

Test: None
  • 添加变换
    使用随机填充 []表示验证集不使用变换
tfms = ([*rand_pad(padding=3, size=28, mode='zeros')], [])
ll = ll.transform(tfms)
bs = 128
  • 这里不使用预训练,所以不需要加imagenet_stats
data = ll.databunch(bs=bs).normalize()
x,y = data.train_ds[0]
x.show()
print(y)
0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4eJ5wFpB-1585460137808)(output_21_1.png)]

  • 每调用一次就会随机变换
def _plot(i,j,ax): data.train_ds[0][0].show(ax, cmap='gray')
plot_multi(_plot, 3, 3, figsize=(8,8))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jlxeh0wJ-1585460137808)(output_23_0.png)]

  • 一个批次的数据
xb,yb = data.one_batch()
xb.shape,yb.shape
(torch.Size([128, 1, 28, 28]), torch.Size([128]))
data.show_batch(rows=3, figsize=(5,5))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0sQXrvE-1585460137808)(output_26_0.png)]

定义卷积网络

def conv(ni,nf): return nn.Conv2d(ni, nf, kernel_size=3, stride=2, padding=1)
model = nn.Sequential(
    conv(1, 8), # 8*14*14
    nn.BatchNorm2d(8),
    nn.ReLU(),
    conv(8, 16), # 7
    nn.BatchNorm2d(16),
    nn.ReLU(),
    conv(16, 32), # 4(向上取整)7/2
    nn.BatchNorm2d(32),
    nn.ReLU(),
    conv(32, 16), # 2
    nn.BatchNorm2d(16),
    nn.ReLU(),
    conv(16, 10), # 10*1*1
    nn.BatchNorm2d(10),
    Flatten()     # 移除单位轴,得到长度为10的向量
)
learn = Learner(data, model, loss_func = nn.CrossEntropyLoss(), metrics=accuracy)
print(learn.summary())
Sequential
======================================================================
Layer (type)         Output Shape         Param #    Trainable 
======================================================================
Conv2d               [8, 14, 14]          80         True      
______________________________________________________________________
BatchNorm2d          [8, 14, 14]          16         True      
______________________________________________________________________
ReLU                 [8, 14, 14]          0          False     
______________________________________________________________________
Conv2d               [16, 7, 7]           1,168      True      
______________________________________________________________________
BatchNorm2d          [16, 7, 7]           32         True      
______________________________________________________________________
ReLU                 [16, 7, 7]           0          False     
______________________________________________________________________
Conv2d               [32, 4, 4]           4,640      True      
______________________________________________________________________
BatchNorm2d          [32, 4, 4]           64         True      
______________________________________________________________________
ReLU                 [32, 4, 4]           0          False     
______________________________________________________________________
Conv2d               [16, 2, 2]           4,624      True      
______________________________________________________________________
BatchNorm2d          [16, 2, 2]           32         True      
______________________________________________________________________
ReLU                 [16, 2, 2]           0          False     
______________________________________________________________________
Conv2d               [10, 1, 1]           1,450      True      
______________________________________________________________________
BatchNorm2d          [10, 1, 1]           20         True      
______________________________________________________________________
Flatten              [10]                 0          False     
______________________________________________________________________

Total params: 12,126
Total trainable params: 12,126
Total non-trainable params: 0
Optimized with 'torch.optim.adam.Adam', betas=(0.9, 0.99)
Using true weight decay as discussed in https://www.fast.ai/2018/07/02/adam-weight-decay/ 
Loss function : CrossEntropyLoss
======================================================================
Callbacks functions applied 
  • 放到cuda
xb = xb.cuda()
model(xb).shape#调用模型
torch.Size([128, 10])
  • 寻找学习率
learn.lr_find(end_lr=100)
epochtrain_lossvalid_lossaccuracytime

LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.

learn.recorder.plot()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jVQPV6z5-1585460137809)(output_37_0.png)]

learn.fit_one_cycle(3, max_lr=0.1)
epochtrain_lossvalid_lossaccuracytime
00.2059210.2395710.92320001:15
10.1335860.1066500.96670001:15
20.0739120.0379990.98790001:15

重构

def conv2(ni,nf): return conv_layer(ni,nf,stride=2)#fastai将卷积,batch,relu函数整合了
learn = Learner(data, model, loss_func = nn.CrossEntropyLoss(), metrics=accuracy)
learn.fit_one_cycle(10, max_lr=0.1)
epochtrain_lossvalid_lossaccuracytime
00.0758480.0538450.98270001:17
10.1344790.1166630.96290001:17
20.1326100.1292930.95760001:17
30.1204640.0898580.97140001:16
40.1146730.1499740.94980001:17
50.0932950.1554920.94670001:16
60.0763960.0423740.98640001:17
70.0593970.0350040.98900001:17
80.0513650.0258740.99200001:16
90.0401920.0242200.99260001:16

加入resnet

class ResBlock(nn.Module):
    def __init__(self, nf):
        super().__init__()
        self.conv1 = conv_layer(nf,nf)
        self.conv2 = conv_layer(nf,nf)
        
    def forward(self, x): return x + self.conv2(self.conv1(x))
help(res_block)
Help on function res_block in module fastai.layers:

res_block(nf, dense: bool = False, norm_type: Union[fastai.layers.NormType, NoneType] = <NormType.Batch: 1>, bottle: bool = False, **conv_kwargs)
    Resnet block of `nf` features. `conv_kwargs` are passed to `conv_layer`.
model = nn.Sequential(
    conv2(1, 8),
    res_block(8),
    conv2(8, 16),
    res_block(16),
    conv2(16, 32),
    res_block(32),
    conv2(32, 16),
    res_block(16),
    conv2(16, 10),
    Flatten()
)
  • 重构
def conv_and_res(ni,nf): return nn.Sequential(conv2(ni, nf), res_block(nf))
model = nn.Sequential(
    conv_and_res(1, 8),
    conv_and_res(8, 16),
    conv_and_res(16, 32),
    conv_and_res(32, 16),
    conv2(16, 10),
    Flatten()
)
learn = Learner(data, model, loss_func = nn.CrossEntropyLoss(), metrics=accuracy)
learn.lr_find(end_lr=100)
learn.recorder.plot()
epochtrain_lossvalid_lossaccuracytime

LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gx8Gtymk-1585460137809)(output_51_2.png)]

learn.fit_one_cycle(12, max_lr=0.05)
epochtrain_lossvalid_lossaccuracytime
00.2031100.1650420.95240001:20
10.1337230.1808650.94620001:20
20.1134150.0997600.96780001:22
30.0905750.0858400.97330001:20
40.0759670.0535310.98440001:20
50.0588110.0497790.98550001:21
60.0517290.0493160.98510001:20
70.0453100.0306210.98990001:20
80.0373430.0266400.99280001:20
90.0272710.0189840.99430001:20
100.0193440.0167250.99470001:21
110.0186910.0154510.99510001:21
print(learn.summary())
Sequential
======================================================================
Layer (type)         Output Shape         Param #    Trainable 
======================================================================
Conv2d               [8, 14, 14]          72         True      
______________________________________________________________________
ReLU                 [8, 14, 14]          0          False     
______________________________________________________________________
BatchNorm2d          [8, 14, 14]          16         True      
______________________________________________________________________
Conv2d               [8, 14, 14]          576        True      
______________________________________________________________________
ReLU                 [8, 14, 14]          0          False     
______________________________________________________________________
BatchNorm2d          [8, 14, 14]          16         True      
______________________________________________________________________
Conv2d               [8, 14, 14]          576        True      
______________________________________________________________________
ReLU                 [8, 14, 14]          0          False     
______________________________________________________________________
BatchNorm2d          [8, 14, 14]          16         True      
______________________________________________________________________
MergeLayer           [8, 14, 14]          0          False     
______________________________________________________________________
Conv2d               [16, 7, 7]           1,152      True      
______________________________________________________________________
ReLU                 [16, 7, 7]           0          False     
______________________________________________________________________
BatchNorm2d          [16, 7, 7]           32         True      
______________________________________________________________________
Conv2d               [16, 7, 7]           2,304      True      
______________________________________________________________________
ReLU                 [16, 7, 7]           0          False     
______________________________________________________________________
BatchNorm2d          [16, 7, 7]           32         True      
______________________________________________________________________
Conv2d               [16, 7, 7]           2,304      True      
______________________________________________________________________
ReLU                 [16, 7, 7]           0          False     
______________________________________________________________________
BatchNorm2d          [16, 7, 7]           32         True      
______________________________________________________________________
MergeLayer           [16, 7, 7]           0          False     
______________________________________________________________________
Conv2d               [32, 4, 4]           4,608      True      
______________________________________________________________________
ReLU                 [32, 4, 4]           0          False     
______________________________________________________________________
BatchNorm2d          [32, 4, 4]           64         True      
______________________________________________________________________
Conv2d               [32, 4, 4]           9,216      True      
______________________________________________________________________
ReLU                 [32, 4, 4]           0          False     
______________________________________________________________________
BatchNorm2d          [32, 4, 4]           64         True      
______________________________________________________________________
Conv2d               [32, 4, 4]           9,216      True      
______________________________________________________________________
ReLU                 [32, 4, 4]           0          False     
______________________________________________________________________
BatchNorm2d          [32, 4, 4]           64         True      
______________________________________________________________________
MergeLayer           [32, 4, 4]           0          False     
______________________________________________________________________
Conv2d               [16, 2, 2]           4,608      True      
______________________________________________________________________
ReLU                 [16, 2, 2]           0          False     
______________________________________________________________________
BatchNorm2d          [16, 2, 2]           32         True      
______________________________________________________________________
Conv2d               [16, 2, 2]           2,304      True      
______________________________________________________________________
ReLU                 [16, 2, 2]           0          False     
______________________________________________________________________
BatchNorm2d          [16, 2, 2]           32         True      
______________________________________________________________________
Conv2d               [16, 2, 2]           2,304      True      
______________________________________________________________________
ReLU                 [16, 2, 2]           0          False     
______________________________________________________________________
BatchNorm2d          [16, 2, 2]           32         True      
______________________________________________________________________
MergeLayer           [16, 2, 2]           0          False     
______________________________________________________________________
Conv2d               [10, 1, 1]           1,440      True      
______________________________________________________________________
ReLU                 [10, 1, 1]           0          False     
______________________________________________________________________
BatchNorm2d          [10, 1, 1]           20         True      
______________________________________________________________________
Flatten              [10]                 0          False     
______________________________________________________________________

Total params: 41,132
Total trainable params: 41,132
Total non-trainable params: 0
Optimized with 'torch.optim.adam.Adam', betas=(0.9, 0.99)
Using true weight decay as discussed in https://www.fast.ai/2018/07/02/adam-weight-decay/ 
Loss function : CrossEntropyLoss
======================================================================
Callbacks functions applied 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!Fashion-MNIST是一个流行的图像分类数据集,用于训练和测试机器学习模型。卷积神经网络(Convolutional Neural Network,CNN)是一种常用的深度学习模型,特别适用于图像相关的任务。 要使用卷积神经网络对Fashion-MNIST数据集进行分类,通常需要以下步骤: 1. 准备数据集:首先,您需要下载Fashion-MNIST数据集并加载到您的程序中。这个数据集包含了10个类别的服装图像,每个类别有6000张训练图像和1000张测试图像。 2. 数据预处理:在训练模型之前,您需要对数据进行预处理。这通常包括将像素值归一化到0到1之间,将标签转换为独热编码(one-hot encoding),以及将数据划分为训练集和验证集。 3. 构建卷积神经网络模型:使用卷积层、池化层和全连接层来构建您的卷积神经网络模型。您可以选择不同的架构和超参数来优化模型性能。 4. 模型训练:使用训练集对模型进行训练。通过反向传播和梯度下降算法,不断调整模型参数以最小化损失函数。 5. 模型评估:使用测试集评估模型的性能。计算准确率、精确率、召回率等指标,了解模型在未见过的数据上的表现。 6. 模型优化:根据评估结果,对模型进行调整和优化。可以尝试不同的网络架构、正则化技术、优化算法等来提升模型性能。 这只是一个简要的概述,实际上在实现Fashion-MNIST卷积神经网络时,还需要考虑数据增强、调参等细节。如果您需要更具体的代码实现或深入的解释,请告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值