• paddlepaddle 实现AlexNet模型,复现原创论文


    AlexNet是与LeNet不同的 一种新的深度学习模型。

    论文原文百度云资源链接:链接:https://pan.baidu.com/s/1WdZnD6aVzUXvzs9XxshROQ 提取码:hans 
    

    第一步:模型实现

    1. import os
    2. import cv2
    3. import numpy as np
    4. import paddle
    5. from paddle.io import Dataset
    6. import paddle.vision.transforms as T
    7. import matplotlib.pyplot as plt
    8. from paddle.io import Dataset
    9. from PIL import Image
    10. from PIL import ImageFile
    11. import paddle.nn as nn
    12. import paddle.nn.functional as F
    13. # 打印所使用的GPU编号
    14. print(paddle.device.get_device())
    15. ImageFile.LOAD_TRUNCATED_IMAGES = True
    16. # 搭建Alexnet网络
    17. class alexnet(paddle.nn.Layer):
    18. def __init__(self, ):
    19. super(alexnet, self).__init__()
    20. self.conv1 = paddle.nn.Conv2D(in_channels=3, out_channels=96, kernel_size=7, stride=2, padding=2)
    21. self.conv2 = paddle.nn.Conv2D(in_channels=96, out_channels=256, kernel_size=5, stride=1, padding=2)
    22. self.conv3 = paddle.nn.Conv2D(in_channels=256, out_channels=384, kernel_size=3, stride=1, padding=1)
    23. self.conv4 = paddle.nn.Conv2D(in_channels=384, out_channels=384, kernel_size=3, stride=1, padding=1)
    24. self.conv5 = paddle.nn.Conv2D(in_channels=384, out_channels=256, kernel_size=3, stride=1, padding=1)
    25. self.mp1 = paddle.nn.MaxPool2D(kernel_size=3, stride=2)
    26. self.mp2 = paddle.nn.MaxPool2D(kernel_size=3, stride=2)
    27. self.L1 = paddle.nn.Linear(in_features=256*3*3, out_features=1024)
    28. self.L2 = paddle.nn.Linear(in_features=1024, out_features=512)
    29. self.L3 = paddle.nn.Linear(in_features=512, out_features=10)
    30. def forward(self, x):
    31. x = self.conv1(x)
    32. x = paddle.nn.functional.relu(x)
    33. x = self.mp1(x)
    34. x = self.conv2(x)
    35. x = paddle.nn.functional.relu(x)
    36. x = self.mp2(x)
    37. x = self.conv3(x)
    38. x = paddle.nn.functional.relu(x)
    39. x = self.conv4(x)
    40. x = paddle.nn.functional.relu(x)
    41. x = self.conv5(x)
    42. x = paddle.nn.functional.relu(x)
    43. x = paddle.flatten(x, start_axis=1, stop_axis=-1)
    44. x = self.L1(x)
    45. x = paddle.nn.functional.relu(x)
    46. x = self.L2(x)
    47. x = paddle.nn.functional.relu(x)
    48. x = self.L3(x)
    49. return x

    第二步:查看一下网络结构;

    1. # 网络结构 应用paddle.summary检查网络结构是否正确。
    2. model = alexnet()
    3. paddle.summary(model, (100,3,32,32))

    运行后的输出结果。

    1. ---------------------------------------------------------------------------
    2. Layer (type) Input Shape Output Shape Param #
    3. ===========================================================================
    4. Conv2D-1 [[100, 3, 32, 32]] [100, 96, 15, 15] 14,208
    5. MaxPool2D-1 [[100, 96, 15, 15]] [100, 96, 7, 7] 0
    6. Conv2D-2 [[100, 96, 7, 7]] [100, 256, 7, 7] 614,656
    7. MaxPool2D-2 [[100, 256, 7, 7]] [100, 256, 3, 3] 0
    8. Conv2D-3 [[100, 256, 3, 3]] [100, 384, 3, 3] 885,120
    9. Conv2D-4 [[100, 384, 3, 3]] [100, 384, 3, 3] 1,327,488
    10. Conv2D-5 [[100, 384, 3, 3]] [100, 256, 3, 3] 884,992
    11. Linear-1 [[100, 2304]] [100, 1024] 2,360,320
    12. Linear-2 [[100, 1024]] [100, 512] 524,800
    13. Linear-3 [[100, 512]] [100, 10] 5,130
    14. ===========================================================================
    15. Total params: 6,616,714
    16. Trainable params: 6,616,714
    17. Non-trainable params: 0
    18. ---------------------------------------------------------------------------
    19. Input size (MB): 1.17
    20. Forward/backward pass size (MB): 39.61
    21. Params size (MB): 25.24
    22. Estimated Total Size (MB): 66.02
    23. ---------------------------------------------------------------------------

    在网络设计过程中,往往会出现结构性差错的地方就在卷积层与全连接层之间出现,在进行Flatten(扁平化)之后,出现数据维度对不上。可以在网络定义的过程中,首先将Flatten之后的全连接层去掉,通过paddle.summary输出结构确认卷积层数出为 256×3×3之后,再将全连接层接上。如果出现差错,可以进行每一层校验。
     

    在上面模型的基础上,进行下面相关操作(加载数据,训练,预测)

     第三步,加载Cifar10数据

     原文根据AlexNet的结构,结合 The CIFAR-10 dataset 图片的特点(32×32×3),对AlexNet网络结构进行了微调:

    1. import sys,os,math,time
    2. import matplotlib.pyplot as plt
    3. from numpy import *
    4. import paddle
    5. from paddle.vision.transforms import Normalize
    6. normalize = Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5], data_format='HWC')
    7. from paddle.vision.datasets import Cifar10
    8. cifar10_train = Cifar10(mode='train', transform=normalize)
    9. cifar10_test = Cifar10(mode='test', transform=normalize)
    10. train_dataset = [cifar10_train.data[id][0].reshape(3,32,32) for id in range(len(cifar10_train.data))]
    11. train_labels = [cifar10_train.data[id][1] for id in range(len(cifar10_train.data))]
    12. class Dataset(paddle.io.Dataset):
    13. def __init__(self, num_samples):
    14. super(Dataset, self).__init__()
    15. self.num_samples = num_samples
    16. def __getitem__(self, index):
    17. data = train_dataset[index]
    18. label = train_labels[index]
    19. return paddle.to_tensor(data,dtype='float32'), paddle.to_tensor(label,dtype='int64')
    20. def __len__(self):
    21. return self.num_samples
    22. _dataset = Dataset(len(cifar10_train.data))
    23. train_loader = paddle.io.DataLoader(_dataset, batch_size=100, shuffle=True)

    第四步 训练网络

    1. test_dataset = [cifar10_test.data[id][0].reshape(3,32,32) for id in range(len(cifar10_test.data))]
    2. test_label = [cifar10_test.data[id][1] for id in range(len(cifar10_test.data))]
    3. test_input = paddle.to_tensor(test_dataset, dtype='float32')
    4. test_l = paddle.to_tensor(array(test_label)[:,newaxis])
    5. optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())
    6. def train(model):
    7. model.train()
    8. epochs = 2
    9. accdim = []
    10. lossdim = []
    11. testaccdim = []
    12. for epoch in range(epochs):
    13. for batch, data in enumerate(train_loader()):
    14. out = model(data[0])
    15. loss = paddle.nn.functional.cross_entropy(out, data[1])
    16. acc = paddle.metric.accuracy(out, data[1])
    17. loss.backward()
    18. optimizer.step()
    19. optimizer.clear_grad()
    20. accdim.append(acc.numpy())
    21. lossdim.append(loss.numpy())
    22. predict = model(test_input)
    23. testacc = paddle.metric.accuracy(predict, test_l)
    24. testaccdim.append(testacc.numpy())
    25. if batch%10 == 0 and batch>0:
    26. print('Epoch:{}, Batch: {}, Loss:{}, Accuracys:{}{}'.format(epoch, batch, loss.numpy(), acc.numpy(), testacc.numpy()))
    27. plt.figure(figsize=(10, 6))
    28. plt.plot(accdim, label='Accuracy')
    29. plt.plot(testaccdim, label='Test')
    30. plt.xlabel('Step')
    31. plt.ylabel('Acc')
    32. plt.grid(True)
    33. plt.legend(loc='upper left')
    34. plt.tight_layout()
    35. train(model)

    训练参数:

    BatchSize:100
    LearningRate:0.001

      如果BatchSize过小,训练速度变慢。

     

    训练参数:

    BatchSize:5000
    LearningRate:0.0005

    BatchSize:5000,Lr=0.001, DropOut:0.2:

     BatchSize:5000,Lr=0.0001, DropOut:0.2:

     

     BatchSize:5000,Lr=0.0005, DropOut:0.5:

     

     

    参考链接:

    (164条消息) 在Paddle中利用AlexNet测试CIFAR10数据集合_卓晴的博客-CSDN博客

  • 相关阅读:
    LeetCode 1052. 爱生气的书店老板
    计算机毕业设计SSMjava宠物领养饲养交流管理平台【附源码数据库】
    2022下半年软考「高项&集成」复习计划ta来喽~
    学习JAVA第二课
    Java学习笔记(三十四)
    基于N32G45的按键驱动
    SV基础知识---功能覆盖率 覆盖组、数据采样(语言部分)
    智能清洁行业下半场的「危」与「机」
    使用关键字abstract 声明抽象类-PHP8知识详解
    智能合约,数据资产变现金的一把金钥匙?
  • 原文地址:https://blog.csdn.net/Vertira/article/details/126671494