プログラミング備忘録

初級プログラマ。python、DL勉強中

chainer動かしてみた(作業中)

chainer動かしてみた時のメモ(作業中)

学習

import chainer
import chainer.links as L
import chainer.functions as F
from chainer import optimizers
from chainer import training
from chainer import iterators
from chainer import datasets
from chainer import serializers
from chainer.training import extensions

in_channels=1
out_size=10
uses_device=0
epoch=3
batch_size=20

class MNIST_Conv(chainer.Chain):
    def __init__(self):
        super(MNIST_Conv,self).__init__()
        with self.init_scope():
            self.conv1=L.Convolution2D(in_channels=in_channels,out_channels=8,
                                        stride=(1,1),ksize=(3,3),pad=(1,1))
            self.linear1=L.Linear(in_size=None,out_size=out_size)

    def __call__(self,x,t=None,train=True):
        h1=self.conv1(x)
        h2=F.relu(h1)
        h3=F.max_pooling_2d(h2,ksize=(2,2))
        h4=self.linear1(h3)
        return F.softmax_cross_entropy(h4,t) if train==True else F.softmax(h4)

def train_MNIST():
    model=MNIST_Conv()

    if uses_device>=0:
        chainer.cuda.get_device_from_id(uses_device).use()
        chainer.cuda.check_cuda_available()
        model.to_gpu()

    train,test=chainer.datasets.get_mnist(ndim=3)

    train_iter=iterators.SerialIterator(train,batch_size,shuffle=True)
    test_iter=iterators.SerialIterator(test,batch_size,repeat=False,shuffle=True)

    optimizer=optimizers.Adam()
    optimizer.setup(model)

    updater=training.StandardUpdater(train_iter,optimizer,device=uses_device)
    trainer=training.Trainer(updater,(epoch,"epoch"),out="result")
    trainer.extend(extensions.Evaluator(test_iter,model,device=uses_device))
    trainer.extend(extensions.LogReport(keys=None,
                    trigger=(1,"epoch"),postprocess=None,log_name="MINIST.log"))
    trainer.extend(extensions.ProgressBar())
    trainer.run()

    serializers.save_hdf5("./models/chapt02.hdf5",model)

if __name__=="__main__":
    train_MNIST()

推論

import chainer
import chainer.functions as F
import chainer.link as L
import chainer.training
from chainer import optimizers
from chainer import training
from chainer import datasets
from chainer import iterators
from chainer import serializers
from chainer.training import extensions
from PIL import Image
import numpy as np
import os
import glob

from chapt0201 import MNIST_Conv

uses_device =0

def infer_MNIST():
    model=MNIST_Conv()

    if uses_device >0:
        import cupy as cp
        chainer.cuda.get_device_from_id(0).use()
        chainer.cuda.check_cuda_available()
        model.to_gpu()
    else:
        cp=np

    serializers.load_hdf5("./models/chapt02.hdf5",model)
    targets=sorted(glob.glob("./test/*png"))

    for target in targets:
        image=Image.open(target).convert("L")
        pixels=cp.asarray(image).astype(cp.float32).reshape(1,1,28,28)
        pixels=pixels/255
        inf=model(pixels,train=False)

        result=inf.data[0]
        print(target,">>>",result.argmax(),"  ",result[result.argmax()])

if __name__=="__main__":
    infer_MNIST()