chainer로 optimizer의 성능 비교

소개



chainer의 Mnist 샘플을 사용하여 optimizer를 비교합니다.

환경



GPU:GTX1070
OS:Ubuntu14.04
CUDA:8.0RC
cuDNN:5.1
파이썬 : 2.7.6
chainer:1.14.0


json 파일을 csv 파일로 변환하는 코드 만들기



mnist 샘플에서는 아래의 83, 84행 부분

train_mnist.py
#Write a log of evaluation statistics for each epoch
trainer.extend(extensions.LogReport())

로 로그에 loss와 accuracy를 json 형식으로 쓰고있다. json은 다루기 어렵기 때문에 csv로 변환하는 코드를 먼저 만든다.

json2csv.py
#!/usr/bin/env python
import json, csv
import argparse

parser = argparse.ArgumentParser(description='experimentation of json to csv')
parser.add_argument('--logfilename', '-l', default='log',
                    help='name of Log file')
parser.add_argument('--csvfilename', '-c', default='log_csv.csv',
                    help='name of output csv file')
args = parser.parse_args()

filename = args.logfilename

#read json file
json_data = open(filename)
data = json.load(json_data)
json_data.close()

#open csv file
f = open(args.csvfilename, 'ab')
csvWriter = csv.writer(f)


header_list = ['iteration', 'epoch', 'main/loss', 'main/accuracy',
               'validation/main/loss', 'validation/main/accuracy']
csvWriter.writerow(header_list)

print 'len(data[0])',
print len(data[0])

for i in range(len(data)):
    if len(data[i]) == 4:
        contents_list = [data[i]["iteration"], data[i]["epoch"], data[i]["main/loss"], data[i]["main/accuracy"]
                         ]
    elif len(data[i]) == 6:
        contents_list = [data[i]["iteration"], data[i]["epoch"], data[i]["main/loss"], data[i]["main/accuracy"],
                         data[i]["validation/main/loss"], data[i]["validation/main/accuracy"]]


    csvWriter.writerow(contents_list)

f.close()

이것으로 Excel 등으로 그래프화하여 비교할 수 있다.

비교 대상



비교 대상은 이하
(1) 통상의 SGD
(2) Momentum
(3) AdaGrad
h tp // w w. jmlr. 오 rg / 파페 rs / ぉぅ메 12 / 즈치 11 아 / 즈치 11 아. pdf
(4) Adam
htps : // / r ぃ v. rg / pdf / 1412. 6980v8. pdf
(5) RMSProp

mnist_train.py의 설정 변경



변경점 1: parser에 optimizer 추가
명령에서 optimizer를 선택할 수 있도록 parser 내에 다음을 추가합니다.

train_mnist.py
parser.add_argument('--optimizer', '-p', type=str, default='Adam',
                    help='optimizer')

변경점 2:optimizer의 선택
다음 부분

train_mnist.py
optimizer = chainer.optimizers.Adam()

args.optimizer에 의해 선택할 수 있도록 변경합니다.

train_mnist.py
# Setup an optimizer
if args.optimizer == 'AdaGrad':
    optimizer = chainer.optimizers.AdaGrad()
elif args.optimizer == 'SGD':
    optimizer = chainer.optimizers.SGD()
elif args.optimizer == 'MomentumSGD':
    optimizer = chainer.optimizers.MomentumSGD()
elif args.optimizer == 'RMSprop':
    optimizer = chainer.optimizers.RMSprop()
else:
    optimizer = chainer.optimizers.Adam()

변경점 3:LogReport()의 변경
디폴트에서는 1 epoch 마다 log에 loss나 accuracy가 기록되지만, 1 epoch 시점에서 상당히 loss가 감소하고 있기 때문에, 보다 세세하게 기록하고 싶다. 따라서 84 행의 다음 부분

train_mnist.py
trainer.extend(extensions.LogReport())

다음과 같이 100 iteration마다 기록한다.

train_mnist.py
trainer.extend(extensions.LogReport(trigger=(100, 'iteration')))

LogReport()의 인수에 대해서는 chainer/training/extensions/log_report.py 에 설명서가 있다.

실험



숨겨진 층의 단위 수는 디폴트의 100, epoch 수는 10, batch 사이즈는 디폴트의 100으로 실험했다. 예를 들어, RMSprop의 경우 실행 명령은 다음과 같습니다.
python train_mnist_opt.py -g=0 -e=10 -p='RMSprop' -u=100

결과



결과는 아래 그래프. 가로축이 iteration, 세로축이 training인 loss.


Adam은 예상대로 좋지만, Momentum이 의외로 노력하고 있다. 조건을 바꾸면 또 달라질지도.

코드 위치



이번 코드는 이쪽으로 들고 있습니다.
htps : // 기주 b. 코 m / 마사타카 46 / 코 m 파레 _ 오 pt_by_ 짱 r

좋은 웹페이지 즐겨찾기