書籍「将棋AIで学ぶディープラーニング」のプログラムコードをCPUで動かす

# やること
『[書籍「将棋AIで学ぶディープラーニング」のプログラムコードを動かす](/kfjt/items/8553cfe6a61dd04b2d0b)』のコードがGPUありきなので、第7章のtrain_policy.pyを対象にCPUで動くように変更してみる。

# Amazonのカスタマーレビュー
星一つの評価者が一人だけいまして、
理由が「GPU前提であるのが残念」らしいんです、
こちらに触発されまして

# ChainerはGPUとCPUの切り替えが簡単
ただしCPUでは満足な学習のためにどれだけの時間がかかることかは知ったこっちゃないです

- いまどきの10万円のGPUを用意することが難しければ
- 古くても2万円のGPUくらい用意した方がまだましだし
- AWSでg2を1時間動かすだけなら百円くらいみたいですよ->[見積り](http://calculator.s3.amazonaws.com/index.html?lng=ja_JP)
 - なんちゃって私は1万円のGPUで遅い遅いですけど

# ChainerのコードをCPU対応にする
[ChainerのコードをGPU対応にする](https://qiita.com/ikeyasu/items/246515375b34e9fb4846)の逆をする
- cuda.get_device()があれば消す
- model.to_gpu()があれば消す
- cuda.cupyをnpに置き換える(import numpy as np)

以上を念頭において、***エラーを吐かせて直していくスタイル***
通常のとおり学習をはじめる
`>python train_policy.py kifulist_train_1000.txt kifulist_test_100.txt --eval_interval 100 --log log`

### "train_policy.py", line 38
```console:エラー
Traceback (most recent call last):
  File "train_policy.py", line 38, in <module>
    model.to_gpu()
  File "C:\home\bin\miniconda3\lib\site-packages\chainer\link.py", line 730, in to_gpu
    super(Chain, self).to_gpu()
  File "C:\home\bin\miniconda3\lib\site-packages\chainer\link.py", line 364, in to_gpu
    cuda.check_cuda_available()
  File "C:\home\bin\miniconda3\lib\site-packages\chainer\backends\cuda.py", line 80, in check_cuda_available
    raise RuntimeError(msg)
RuntimeError: CUDA environment is not correctly set up
(see https://github.com/chainer/chainer#installation).No module named 'cupy'
```

念頭の２点めのやつ、38行めを消せばよい（行数変わると後がややこしいのでコメントアウト）

```python:train_policy.py,38行
model.to_gpu()
↓
# model.to_gpu()
```

### "train_policy.py", line 118
```console:エラー
Traceback (most recent call last):
  File "train_policy.py", line 118, in <module>
    x, t = mini_batch(positions_train_shuffled, i, args.batchsize)
  File "train_policy.py", line 94, in mini_batch
    return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))),
  File "C:\home\bin\miniconda3\lib\site-packages\chainer\backends\cuda.py", line 258, in to_gpu
    check_cuda_available()
  File "C:\home\bin\miniconda3\lib\site-packages\chainer\backends\cuda.py", line 80, in check_cuda_available
    raise RuntimeError(msg)
RuntimeError: CUDA environment is not correctly set up
(see https://github.com/chainer/chainer#installation).No module named 'cupy'
```

118行めで呼ぶ94行めにcuda.to_gpu()がいる（cuda.cupyでなくcuda.to_gpu(np)なんですね）、
こちらも行数を変えずに書き換える

```python:train_policy.py,94-95行
    return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))),
            Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32))))
↓
    return (Variable(np.array(mini_batch_data, dtype=np.float32)),
            Variable(np.array(mini_batch_move, dtype=np.int32)))
```

つぎを実行する前にすぐ後の行が目にはいりました、105行めも同様にします。

```python:train_policy.py,104-105行
    return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))),
            Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32))))
↓
    return (Variable(np.array(mini_batch_data, dtype=np.float32)),
            Variable(np.array(mini_batch_move, dtype=np.int32)))
```

一応これぽちの修正で動きます。
ただし本当に遅いですよ！？

たったこれだけの書き換えをあきらめて
GPUないもんと拗ねるのは勿体ない
みんなでディープラーニングの流行に乗りましょう

おしまい