• 记intel杯比赛中各种bug与debug【其三】:intel chainer的安装与使用


    现在在训练模型,闲着来写一篇
    顺着这篇文章,顺利安装上intel chainer
    再次感谢 大黄老鼠

    intel chainer 使用

    头一次使用chainer,本以为又入了一个大坑,实际尝试感觉非常兴奋
    chainer的使用十分顺畅,开发起来特别友好
    可能是跟pytorch相似的原因,特喜欢chainer

    网络结构编写

    这里如果用过pytorch,就会发现代码几乎没变,写起来就会非常顺手
    在chainer中layers被视为links,Module被叫做Chain, chainer的意思由此可见
    chainer的创新是突出了一个数据带领结构(“Define-by-Run”),所以就连layer的输入大小都不需要填写
    模型会自动帮我们写

    class Network(chainer.Chain):
        def __init__(self):
            super(Network, self).__init__()
            with self.init__scope():
                self.in=chainer.links.Linear(None, 256)
                self.hidden=chainer.links.Linear(None, 64)
                self.out=chainer.links.Linear(None, 5)
    
        def __call__(self, x):
            x=chainer.functions.relu(self.in(x))
            x=chainer.functions.relu(self.hidden(x))
            x=self.out(x)
            return x
    
    class Classifier(chainer.Chainer):
        def __init__(self, predicor):
            super(Classifier, self).__init__()
            with self.init__scope():
                self.predictor=predictor
        
        def __call__(self, x, t):
            x=self.predictor(x)
            loss=chainer.functions.softmax_cross_entropy(x, t)
            accuracy=chainer.functions.accuracy(x, t)
            chainer.reporter.report({'loss': loss, 'accuracy': accuracy}, self)
            return loss
    

    训练模型

    简要写一下chainer训练时要写什么

    • model
    • optimizer
    • trainer(可选,需要updater和必要的参数)
    • updater(以下皆可选, 需iterator, optimizer)
    • iterator(需dataset,batch_size)
    • dataset(类型为TupleDataset)
    • extensions(需trainer)

    我们把训练方式分为两种

    • 一种为pytorch风格
      定义好model, optimizer, criterion
      嵌套循环,计算loss然后bp即可
    def lossfun(data, label):
        ...
        return loss
        
    model=Network()
    optimizer=chainer.optimizers.Adam()
    optimizer.setup(model)
    for epoch in params['epoch']:
        for step, batch in enumerate(dataset):
            model.cleargrads()
            # model.reset_state()
            
            loss=lossfun(batch['data'], batch['label'])
            loss.backward()
            optimizer.update()
    

    或者简单写成

    model=Network()
    optimizer=chainer.optimizers.Adam()
    optimizer.setup(model)
    for epoch in params['epoch']:
        for step, batch in enumerate(dataset):
            # model.reset_state()
            optimizer.update(lossfun, data, label)
    
    • 另一种是带trainer的chainer风格
      若有需要,重写updater和iterator,塞进trainer即可
      若需要拓展,只需trainer.extend(...),十分方便
      这里就简单的写一下
    model=Classifier(Network())
    optimizer=chainer.optimizers.Adam()
    optimizer.setup(model)
    
    trainset=chainer.datasets.TupleDataset(data, label)
    train_iter=chainer.iterators.SerialIterator(trainset, params['batch_size'], shuffle=True, repeat=True)
    updater=trainer.StandardUpdater(train_iter, model)
    trainer=chainer.training.Trainer(updater, (params['epoch'], 'epoch'), params['name'])
    
    # 这里是各种拓展
    trainer.run()
    

    使用模型

    跟pytorch一样,十分简单

    predict=model(data)
    ...
    
  • 相关阅读:
    HDU 1301 Jungle Roads (最小生成树)
    POJ 1733 Parity game (并查集)
    HDU 3038 How Many Answers Are Wrong (并查集)
    CentOS用yum安装搭建LAMP
    Linux下php安装Redis扩展
    PHPExcel用法
    利用phpmailer类邮件发送
    Vim编辑器配置
    vhost文件设置
    ThinkPHP验证码类
  • 原文地址:https://www.cnblogs.com/tanglizi/p/8410931.html
Copyright © 2020-2023  润新知