• 【chainer框架】【pytorch框架】


    教程:

    https://bennix.github.io/

    https://bennix.github.io/blog/2017/12/14/chain_basic/

    https://bennix.github.io/blog/2017/12/18/Chain_Tutorial1/

    模块功能
    datasets 输入数据可以被格式化为这个类的模型输入。它涵盖了大部分输入数据结构的用例。
    variable 它是一个函数/连接/Chain的输出。
    functions 支持深度学习中广泛使用的功能的框架,例如 sigmoid, tanh, ReLU等
    links 支持深度学习中广泛使用的层的框架,例如全连接层,卷积层等
    Chain 连接和函数(层)连接起来形成一个“模型”。
    optimizers 指定用于调整模型参数的什么样的梯度下降方法,例如 SGD, AdaGrad, Adam.
    serializers 保存/加载训练状态。例如 model, optimizer 等
    iterators 定义训练器使用的每个小批量数据。
    training.updater 定义Trainer中使用的每个前向、反向传播的参数更新过程。
    training.Trainer 管理训练器

    下面是chainer模块的导入语句。

    # Initial setup following 
    import numpy as np
    import chainer
    from chainer import cuda, Function, gradient_check, report, training, utils, Variable
    from chainer import datasets, iterators, optimizers, serializers
    from chainer import Link, Chain, ChainList
    import chainer.functions as F
    import chainer.links as L
    from chainer.training import extensions
    

    示例 minst:

    MNIST数据集由70,000个尺寸为28×28(即784个像素)的灰度图像和相应的数字标签组成。数据集默认分为6万个训练图像和10,000个测试图像。我们可以通过datasets.get_mnist()获得矢量化版本(即一组784维向量)。

    train, test = datasets.get_mnist()
    

    此代码自动下载MNIST数据集并将NumPy数组保存到 $(HOME)/.chainer 目录中。返回的训练集和测试集可以看作图像标签配对的列表(严格地说,它们是TupleDataset的实例)。

    我们还必须定义如何迭代这些数据集。我们想要在数据集的每次扫描开始时对每个epoch的训练数据集进行重新洗牌。在这种情况下,我们可以使用iterators.SerialIterator

    train_iter = iterators.SerialIterator(train, batch_size=100, shuffle=True)
    

    另一方面,我们不必洗牌测试数据集。在这种情况下,我们可以通过shuffle = False来禁止混洗。当底层数据集支持快速切片时,它使迭代速度更快。

    test_iter = iterators.SerialIterator(test, batch_size=100, repeat=False, shuffle=False)
    

    当所有的例子被访问时,我们停止迭代通过设定 repeat=False 。测试/验证数据集通常需要此选项;没有这个选项,迭代进入一个无限循环。

    接下来,我们定义架构。我们使用一个简单的三层网络,每层100个单元。

    class MLP(Chain):
        def __init__(self, n_units, n_out):
            super(MLP, self).__init__()
            with self.init_scope():
                # the size of the inputs to each layer will be inferred
                self.l1 = L.Linear(None, n_units)  # n_in -> n_units # 第一个参数为输入维数,第二个参数为输出维数。这里注意,第一个参数填none时,则输入维数将在第一次前向传播时确定
                self.l2 = L.Linear(None, n_units)  # n_units -> n_units
                self.l3 = L.Linear(None, n_out)    # n_units -> n_out
    
        def __call__(self, x):
            h1 = F.relu(self.l1(x))
            h2 = F.relu(self.l2(h1))
            y = self.l3(h2)
            return y
    

    该链接使用relu()作为激活函数。请注意,“l3”链接是最终的全连接层,其输出对应于十个数字的分数。

    为了计算损失值或评估预测的准确性,我们在上面的MLP连接的基础上定义一个分类器连接:

    class Classifier(Chain):
        def __init__(self, predictor):
            super(Classifier, self).__init__()
            with self.init_scope():
                self.predictor = predictor
    
        def __call__(self, x, t):
            y = self.predictor(x)
            loss = F.softmax_cross_entropy(y, t)
            accuracy = F.accuracy(y, t)
            report({'loss': loss, 'accuracy': accuracy}, self)
            return loss
    

    这个分类器类计算准确性和损失,并返回损失值。参数对x和t对应于数据集中的每个示例(图像和标签的元组)。 softmax_cross_entropy()计算给定预测和基准真实标签的损失值。 accuracy() 计算预测准确度。我们可以为分类器的一个实例设置任意的预测器连接。

    report() 函数向训练器报告损失和准确度。收集训练统计信息的具体机制参见 Reporter. 您也可以采用类似的方式收集其他类型的观测值,如激活统计。

    请注意,类似上面的分类器的类被定义为chainer.links.Classifier。因此,我们将使用此预定义的Classifier连接而不是使用上面的示例。

    model = L.Classifier(MLP(100, 10))  # the input size, 784, is inferred
    optimizer = optimizers.SGD()
    optimizer.setup(model)
    

    现在我们可以建立一个训练器对象。

    updater = training.StandardUpdater(train_iter, optimizer)
    trainer = training.Trainer(updater, (20, 'epoch'), out='result')
    

    第二个参数(20,’epoch’)表示训练的持续时间。我们可以使用epoch或迭代作为单位。在这种情况下,我们通过遍历训练集20次来训练多层感知器。

    为了调用训练循环,我们只需调用run()方法。

    这个方法执行整个训练序列。

    上面的代码只是优化了参数。在大多数情况下,我们想看看培训的进展情况,我们可以在调用run方法之前使用扩展插入。

    trainer.extend(extensions.Evaluator(test_iter, model))
    trainer.extend(extensions.LogReport())
    trainer.extend(extensions.PrintReport(['epoch', 'main/accuracy', 'validation/main/accuracy']))
    trainer.extend(extensions.ProgressBar())
    trainer.run()  
    
    epoch       main/accuracy  validation/main/accuracy
         total [..................................................]  0.83%
    this epoch [########..........................................] 16.67%
           100 iter, 0 epoch / 20 epochs
           inf iters/sec. Estimated time to finish: 0:00:00.
         total [..................................................]  1.67%
    this epoch [################..................................] 33.33%
           200 iter, 0 epoch / 20 epochs
        270.19 iters/sec. Estimated time to finish: 0:00:43.672168.
         total [#.................................................]  2.50%
    this epoch [#########################.........................] 50.00%
           300 iter, 0 epoch / 20 epochs
        271.99 iters/sec. Estimated time to finish: 0:00:43.017048.
         total [#.................................................]  3.33%
    this epoch [#################################.................] 66.67%
           400 iter, 0 epoch / 20 epochs
  • 相关阅读:
    JS提取子字符串函数比较
    js事件定义方式和获取事件对象event总结
    让body的clientHeight与html的clientHeight相等的方法
    关于原型链和继承问题的思考:为什么不能直接把父类的prototype赋值给子类的prototype
    [javascript权威指南笔记02]Throw语句和异常处理机制try/catch/finally
    转载:javascript语句标签
    转:JS中强大的正则表达式
    分享我常用的Javascript工具函数
    对prototype,instanceof和constrctor的理解
    xml基础知识总结和回顾
  • 原文地址:https://www.cnblogs.com/zealousness/p/9757292.html
Copyright © 2020-2023  润新知