http://qiita.com/7of9/items/d4fc540c1dc92f2f0c85
において気になった回帰のDeep Learning。
「sine TensorFlow regression」で検索して以下を見つけた。
This is an example of a regressor based on recurrent networks:
The objective is to predict continuous values, sin and cos functions in this example, based on previous observations using the LSTM architecture.
LSTMを使っての学習のようだ。
lstm_sin.ipynbなどのJupyter用のファイルがある。
試そうとしたが、以下のパッケージが必要になる
- matplotlib
- pandas
- cython
- gfortran
- scipy
- scikit-learn
lstm_sin.ipynbを試してみた
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
scipy 0.13.3-1build1
python-matplotlib 1.3.1-1ubuntu5
gfortran 4.8.4-2ubuntu1
実行結果
上記のセットアップを済ませてlstm_sin.ipynbを実行してみた。
In[4]
の実行にはこちらの環境(GTX 750 Ti, 2GB)で30秒かかった。
上記のグラフにおいて、以下の点が未消化
- sin(0)が0.0ではない
- 横軸の値が不明
誤差は以下だった。
MSE: 0.000156
コードの中身はまだ未消化。
回帰の学習においてConvNetとRNNの使いわけも未消化。
code
%matplotlib inline
import numpy as np
import pandas as pd
import tensorflow as tf
from matplotlib import pyplot as plt
from tensorflow.contrib import learn
from sklearn.metrics import mean_squared_error
from lstm import generate_data, lstm_model
LOG_DIR = './ops_logs/sin'
TIMESTEPS = 3
RNN_LAYERS = [{'num_units': 5}]
DENSE_LAYERS = None
TRAINING_STEPS = 10000
PRINT_STEPS = TRAINING_STEPS / 10
BATCH_SIZE = 100
regressor = learn.Estimator(model_fn=lstm_model(TIMESTEPS, RNN_LAYERS, DENSE_LAYERS),
model_dir=LOG_DIR)
RNN_LAYERSを与えてregressorというものを作っている。
X, y = generate_data(np.sin, np.linspace(0, 100, 10000, dtype=np.float32), TIMESTEPS, seperate=False)
# create a lstm instance and validation monitor
validation_monitor = learn.monitors.ValidationMonitor(X['val'], y['val'],
every_n_steps=PRINT_STEPS,
early_stopping_rounds=1000)
# print(X['train'])
# print(y['train'])
regressor.fit(X['train'], y['train'],
monitors=[validation_monitor],
batch_size=BATCH_SIZE,
steps=TRAINING_STEPS)
generate_data()を用いてtrainデータを作成している。
regressor.fit()により学習をしていると理解した。
predicted = regressor.predict(X['test'])
rmse = np.sqrt(((predicted - y['test']) ** 2).mean(axis=0))
score = mean_squared_error(predicted, y['test'])
print ("MSE: %f" % score)
誤差計算。
plot_predicted, = plt.plot(predicted, label='predicted')
plot_test, = plt.plot(y['test'], label='test')
plt.legend(handles=[plot_predicted, plot_test])
グラフ描画。
cosineにしてみた
cosine curveとしても位相が0からでないようだが未消化だった。
Xの値
Xにはtrainとtestがあるようだ。
X['train']
array([[[ 1. ],
[ 0.99994999],
[ 0.99979997]],
[[ 0.99994999],
[ 0.99979997],
[ 0.99954993]],
...
testの方は値域が-0.45610371から始まっているようだ。
X['test']
array([[[-0.45610371],
[-0.46498191],
[-0.47380689]],
[[-0.46498191],
[-0.47380689],
[-0.48259121]],
[[-0.47380689],
[-0.48259121],
[-0.49132726]],
...,
[[ 0.83593178],
[ 0.8413794 ],
[ 0.84673876]],
[[ 0.8413794 ],
[ 0.84673876],
[ 0.85201752]],
[[ 0.84673876],
[ 0.85201752],
[ 0.85721111]]], dtype=float32)
X.keys
['test', 'train', 'val']
len(X['train'])
8097
len(X['test'])
997
len(X['val'])
897
この3つの値をどこで設定しているかは未消化だった。
8097 + 997 + 897 = 9991.
リンク記事でだいたい解決した。
http://qiita.com/7of9/items/d970baf3322b93efb02b