TensorFlow > link > tensorflow-lstm-regression > sine / cosine curve > lstm_sin.ipynbを試してみた

http://qiita.com/7of9/items/d4fc540c1dc92f2f0c85
において気になった回帰のDeep Learning。

「sine TensorFlow regression」で検索して以下を見つけた。

https://github.com/mouradmourafiq/tensorflow-lstm-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を試してみた

```txt:動作環境
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秒かかった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/88f49cf7-81ba-836f-d411-97cbd751b91f.png)

上記のグラフにおいて、以下の点が未消化

- sin(0)が0.0ではない
- 横軸の値が不明

誤差は以下だった。

`MSE: 0.000156`

コードの中身はまだ未消化。
回帰の学習においてConvNetとRNNの使いわけも未消化。

### code

```py
%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
```

```py
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
```

```py
regressor = learn.Estimator(model_fn=lstm_model(TIMESTEPS, RNN_LAYERS, DENSE_LAYERS),
                            model_dir=LOG_DIR)
```

RNN_LAYERSを与えてregressorというものを作っている。

```py
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()により学習をしていると理解した。


```py
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)
```

誤差計算。

```py
plot_predicted, = plt.plot(predicted, label='predicted')
plot_test, = plt.plot(y['test'], label='test')
plt.legend(handles=[plot_predicted, plot_test])
```

グラフ描画。

### cosineにしてみた

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/05f4e732-385b-e145-ed93-15e389a4315e.png)

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
```


この３つの値をどこで設定しているかは未消化だった。
8097 + 997 + 897 = 9991.

リンク記事でだいたい解決した。
http://qiita.com/7of9/items/d970baf3322b93efb02b