• 机器学习-10-基于paddle实现神经网络


    总结

    本系列是机器学习课程的系列课程,主要介绍基于paddle实现神经网络。

    参考

    MNIST 训练_副本

    本门课程的目标

    完成一个特定行业的算法应用全过程:

    懂业务+会选择合适的算法+数据处理+算法训练+算法调优+算法融合
    +算法评估+持续调优+工程化接口实现

    机器学习定义

    关于机器学习的定义,Tom Michael Mitchell的这段话被广泛引用:
    对于某类任务T性能度量P,如果一个计算机程序在T上其性能P随着经验E而自我完善,那么我们称这个计算机程序从经验E中学习
    在这里插入图片描述

    使用MNIST数据集训练和测试模型。

    第一步:数据准备

    MNIST数据集

    import paddle
    from paddle.vision.datasets import MNIST
    from paddle.vision.transforms import ToTensor
    
    train_dataset = MNIST(mode='train', transform=ToTensor())
    test_dataset = MNIST(mode='test', transform=ToTensor())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    展示数据集图片

    import matplotlib.pyplot as plt
    import numpy as np
    
    train_data0, train_label_0 = train_dataset[0][0], train_dataset[0][1]
    train_data0 = train_data0.reshape([28, 28])
    plt.figure(figsize=(2, 2))
    plt.imshow(train_data0, cmap=plt.cm.binary)
    print('train_data0 的标签为: ' + str(train_label_0))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/__init__.py:107: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
      from collections import MutableMapping
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
      from collections import Iterable, Mapping
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
      from collections import Sized
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
      if isinstance(obj, collections.Iterator):
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2366: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
      return list(data) if isinstance(data, collections.MappingView) else data
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:425: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
      a_min = np.asscalar(a_min.astype(scaled_dtype))
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:426: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
      a_max = np.asscalar(a_max.astype(scaled_dtype))
    
    
    train_data0 的标签为: [5]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    第二步:定义网络

    import paddle
    import paddle.nn.functional as F
    from paddle.nn import Conv2D, MaxPool2D, Linear
    
    class MyModel(paddle.nn.Layer):
        def __init__(self):
            super(MyModel, self).__init__()
            self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=2)
            self.max_pool1 = MaxPool2D(kernel_size=2, stride=2)
            self.conv2 = Conv2D(in_channels=6, out_channels=16, kernel_size=5, stride=1)
            self.max_pool2 = MaxPool2D(kernel_size=2, stride=2)
            self.linear1 = Linear(in_features=16*5*5, out_features=120)
            self.linear2 = Linear(in_features=120, out_features=84)
            self.linear3 = Linear(in_features=84, out_features=10)
    
        def forward(self, x):
            x = self.conv1(x)
            x = F.relu(x)
            x = self.max_pool1(x)
            x = F.relu(x)
            x = self.conv2(x)
            x = self.max_pool2(x)
            x = paddle.flatten(x, start_axis=1, stop_axis=-1)
            x = self.linear1(x)
            x = F.relu(x)
            x = self.linear2(x)
            x = F.relu(x)
            x = self.linear3(x)
            return x
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    模型可视化

    import paddle
    mnist = MyModel()
    paddle.summary(mnist, (1, 1, 28, 28))
    
    • 1
    • 2
    • 3
    ---------------------------------------------------------------------------
     Layer (type)       Input Shape          Output Shape         Param #    
    ===========================================================================
       Conv2D-1       [[1, 1, 28, 28]]      [1, 6, 28, 28]          156      
      MaxPool2D-1     [[1, 6, 28, 28]]      [1, 6, 14, 14]           0       
       Conv2D-2       [[1, 6, 14, 14]]     [1, 16, 10, 10]         2,416     
      MaxPool2D-2    [[1, 16, 10, 10]]      [1, 16, 5, 5]            0       
       Linear-1          [[1, 400]]            [1, 120]           48,120     
       Linear-2          [[1, 120]]            [1, 84]            10,164     
       Linear-3          [[1, 84]]             [1, 10]              850      
    ===========================================================================
    Total params: 61,706
    Trainable params: 61,706
    Non-trainable params: 0
    ---------------------------------------------------------------------------
    Input size (MB): 0.00
    Forward/backward pass size (MB): 0.06
    Params size (MB): 0.24
    Estimated Total Size (MB): 0.30
    ---------------------------------------------------------------------------
    
    
    
    
    
    
    {'total_params': 61706, 'trainable_params': 61706}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    第三步:训练网络

    import paddle
    from paddle.metric import Accuracy
    from paddle.static import InputSpec
    
    inputs = InputSpec([None, 784], 'float32', 'x')
    labels = InputSpec([None, 10], 'float32', 'x')
    
    # 用Model封装模型
    model = paddle.Model(MyModel(), inputs, labels)
    
    # 定义损失函数
    optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())
    
    # 配置模型
    model.prepare(optim, paddle.nn.CrossEntropyLoss(), Accuracy())
    # 训练模型
    model.fit(train_dataset, test_dataset, epochs=3, batch_size=64, save_dir='mnist_checkpoint', verbose=1)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    The loss value printed in the log is the current step, and the metric is the average value of previous steps.
    Epoch 1/3
    step 938/938 [==============================] - loss: 0.0208 - acc: 0.9456 - 34ms/step          
    save checkpoint at /home/aistudio/mnist_checkpoint/0
    Eval begin...
    step 157/157 [==============================] - loss: 0.0041 - acc: 0.9777 - 19ms/step          
    Eval samples: 10000
    Epoch 2/3
    step 938/938 [==============================] - loss: 0.0021 - acc: 0.9820 - 34ms/step          
    save checkpoint at /home/aistudio/mnist_checkpoint/1
    Eval begin...
    step 157/157 [==============================] - loss: 2.1037e-04 - acc: 0.9858 - 19ms/step      
    Eval samples: 10000
    Epoch 3/3
    step 938/938 [==============================] - loss: 0.0126 - acc: 0.9876 - 34ms/step          
    save checkpoint at /home/aistudio/mnist_checkpoint/2
    Eval begin...
    step 157/157 [==============================] - loss: 4.7168e-04 - acc: 0.9884 - 19ms/step      
    Eval samples: 10000
    save checkpoint at /home/aistudio/mnist_checkpoint/final
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    第四步:测试训练好的网络

    import paddle
    import numpy as np
    import matplotlib.pyplot as plt
    from paddle.metric import Accuracy
    from paddle.static import InputSpec
    
    inputs = InputSpec([None, 784], 'float32', 'x')
    labels = InputSpec([None, 10], 'float32', 'x')
    model = paddle.Model(MyModel(), inputs, labels)
    model.load('./mnist_checkpoint/final')
    model.prepare(optim, paddle.nn.CrossEntropyLoss(), Accuracy())
    
    # results = model.evaluate(test_dataset, batch_size=64, verbose=1)
    # print(results)
    
    results = model.predict(test_dataset, batch_size=64)
    
    test_data0, test_label_0 = test_dataset[0][0], test_dataset[0][1]
    test_data0 = test_data0.reshape([28, 28])
    plt.figure(figsize=(2,2))
    plt.imshow(test_data0, cmap=plt.cm.binary)
    
    print('test_data0 的标签为: ' + str(test_label_0))
    print('test_data0 预测的数值为:%d' % np.argsort(results[0][0])[0][-1])
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    Predict begin...
    step 157/157 [==============================] - 27ms/step          
    Predict samples: 10000
    test_data0 的标签为: [7]
    test_data0 预测的数值为:7
    
    
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:425: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
      a_min = np.asscalar(a_min.astype(scaled_dtype))
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:426: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
      a_max = np.asscalar(a_max.astype(scaled_dtype))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    
    
    • 1
  • 相关阅读:
    在线流程图和思维导图开发技术详解(六)
    【webrtc】m98 call: 音频发送流、接收流的基础类/配置
    仅从个人的角度,聊聊年底的程序员招聘与入职情况
    SPOOL、SQLLOADER数据导出导入的一点小总结
    基于Springboot实现漫画网站平台
    CSS总结
    服务注册发现_服务自保和服务剔除机制
    Maya 2024:3D艺术的巅 峰之作 mac/win版
    正则表达式2
    leetcode路飞吃桃,递归做法
  • 原文地址:https://blog.csdn.net/m0_38139250/article/details/138077610