GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
v0.1 http://qiita.com/7of9/items/b364d897b95476a30754
AdamOptimizerの学習係数を変更してみた。
使用するinput.csv
Network

code
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import tensorflow.contrib.slim as slim
# ファイル名の Queue を作成
filename_queue = tf.train.string_input_producer(["input.csv"])
# CSV を parse
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
input1, output = tf.decode_csv(value, record_defaults=[[0.], [0.]])
inputs = tf.pack([input1])
output = tf.pack([output])
inputs_batch, output_batch = tf.train.shuffle_batch([inputs, output], 4, capacity=40, min_after_dequeue=4)
## NN のグラフ生成
hiddens = slim.stack(inputs_batch, slim.fully_connected, [1,7,7,7],
activation_fn=tf.nn.sigmoid, scope="hidden")
prediction = slim.fully_connected(hiddens, 1, activation_fn=tf.nn.sigmoid, scope="output")
loss = tf.contrib.losses.mean_squared_error(prediction, output_batch)
# train_op = slim.learning.create_train_op(loss, tf.train.AdamOptimizer(0.01))
train_op = slim.learning.create_train_op(loss, tf.train.AdamOptimizer(0.001))
init_op = tf.initialize_all_variables()
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
sess.run(init_op)
for i in range(20000):
_, t_loss = sess.run([train_op, loss])
if (i+1) % 100 == 0:
print("%d,%f" % (i+1, t_loss))
# print("%d,%f,#step, loss" % (i+1, t_loss))
finally:
coord.request_stop()
coord.join(threads)
結果
train_op = slim.learning.create_train_op(loss, tf.train.AdamOptimizer(0.001))
の行の係数を0.01と0.001とでそれぞれ実行し、以下のファイルを作成した。
- log.learn0p01
- log.learn0p001
上記のファイルを読むJupyter用コードは以下。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('log.learn0p01', delimiter=',')
input1 = data[:,0]
output1 = data[:,1]
data = np.loadtxt('log.learn0p001', delimiter=',')
input2 = data[:,0]
output2 = data[:,1]
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(input1, output1, color='black', linestyle='solid', label='rate=0.01')
ax.plot(input2, output2, color='red', linestyle='solid', label='rate=0.001')
ax.set_title('loss')
ax.set_xlabel('step')
ax.set_ylabel('loss')
ax.grid(True)
ax.legend()
fig.show()
学習係数を変更してもstep20000近辺のlossの値は20%程度はある。
自分が必要としているlossの上限はいくらなのか別途調査する必要あり。lossが20%でも係数の初期値として計算が早くなるのであれば、ここで時間を使うこともないかもしれない。
追加調査
- QMCを用いて入力データを作成してみた
- loss値の改善なし
- prep_data.py内の
y_data = np.sin(2*np.pi*x_data) + 0.3 * np.random.rand()
の0.3を0.03にしてみた- loss値の改善なし
- ネットの形態を適当に変更してみた
- loss値の改善なし
RNNやその一形態のLSTMなどに進むか、実際の学習対象のデータ処理に進むか。
tf.train.shuffle_batch()を使っている部分はデータセットから順番に取り出すように変更する方がいいかもしれない。そうしないとQMCの効果が期待できない。