PyTorch 練習


#(1) PyTorch installation

```shell
(bash) $ conda create -n py37_pytorch python=3.7 anaconda

(bash) $ conda activate py37_pytorch

(py37_pytorch) $ conda install pytorch torchvision -c pytorch

## Package Plan ##

  environment location: /home/[username]/.pyenv/versions/anaconda3-5.2.0/envs/py37_pytorch

  added / updated specs:
    - pytorch
    - torchvision

```

#(2) IPアドレス確認。

```shell
$ ip -f inet addr
1: lo: <LOOPBACK,UP,LOWER_UP> 

2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> 
    inet aaa.bb.cc.ddd/ee brd PPP.QQ.RR.SSS scope global noprefixroute eno1
       valid_lft forever preferred_lft forever
```

のように出てくるが、ここでは「aaa.bb.cc.ddd」を覚えておく。


#(3) リモート設定

参考　https://qiita.com/syo_cream/items/05553b41277523a131fd

まず、jupyter用のパスワードを設定する。

```bash
(py37_pytorch) $ cd ~/.jupyter/
(py37_pytorch) $ jupyter notebook password

Enter password: 
Verify password: 
[NotebookPasswordApp] Wrote hashed password to /home/[username]/.jupyter/jupyter_notebook_config.json

(py37_pytorch) $ ls
jupyter_notebook_config.py
jupyter_notebook_config.json

```


jupyter_notebook_config.pyは、すでに（多分その昔やろうとして失敗した残骸として）あった。

これを編集する。

具体的に書き加えるのは

```python

# これを最初の行に入れる！
c = get_config()

# Notebook上でplotを表示できるようにする [これはまだやっていない。]
# c.IPKernelApp.pylab = 'inline'

# 全てのIPから接続を許可
c.NotebookApp.ip = '*'

# IPython notebookのログインパスワード
c.NotebookApp.password = '[jsonファイルに書かれている
ハッシュ化されたパスワード]'

# 起動時にブラウザを起動させるかの設定
c.NotebookApp.open_browser = False
# ポート指定
c.NotebookApp.port = [接続ポート]

```

この[接続ポート]は8888がデフォルト。しかし、バッティングしても面倒なので、念のため違う数字にしておいた。


#(4) リモートでjupyter

以上は全てSSH先で行う。最後に、SSH先で

$ jupyter notebook

とやっておく。自分のローカルのパソコンで、ブラウザに
http://aaa.bb.cc.ddd:[接続ポート]
とやると、パスワードを要求されるので、それを入力すると、リモート環境でjupyterが利用できる。

# (5) PyTorch

"Deep Learning with PyTorch" (Eli Stevens, Luca Antiga, and Thomas Viehmann) 
https://github.com/deep-learning-with-pytorch/dlwpt-code

chapter 2. Pretrained networks
chapter 2.6 Exercises
Feed the image of the golden retriever [shetland sheepdog] into the horse-to-zebra model.

- What do you need to do to the image to prepare it?

- What does the output look like?

shetland_sheepdog でGoogle検索して出てきた画像(mv_library_dog_shetland_sheepdog.png)をjpgに変換したあと、horse-to-zebra modelに入れると、「シマウマっぽい模様を持つ犬」になる。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610740/55721acb-6350-167f-fe5e-28a6a5041828.png)


chapter 3.14 Exercises

Create a tensor a from list(range(9)). Predict and then check the size, offset, and stride.

```
import torch 
a = torch.tensor(list(range(9)))
a
# tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])

a.size()
# torch.Size([9])

a.storage_offset()
# 0

a.stride()
# (1,)

a.storage()
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# [torch.LongStorage of size 9]
```

Create a new tensor using b = a.view(3, 3). What does view do? Check that a and b share the same storage.


```
b = a.view(3, 3)
b
#tensor([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]])

b.size()
# torch.Size([3, 3])

b.storage_offset()
# 0

b.stride()
# (3, 1)

id(a.storage)==id(b.storage) ## storageを比較する。
# True
```

Create a tensor c = b[1:,1:]. Predict and then check the size, offset, and stride.

```
c = b[1:,1:]
c
# tensor([[4, 5],
#        [7, 8]])

c.size()
# torch.Size([2, 2])

c.storage_offset()
4

c.stride()
# (3, 1). ### ここは予想と違った。なるほどである。


id(a.storage)==id(c.storage)  # aとcはstorageは同じ。
# True
```


Pick a mathematical operation like cosine or square root. Can you find a corresponding function in the torch library?

Apply the function element-wise to a. Why does it return an error?

```
torch.cos(0.)
# --------------------------------------------
# TypeError Traceback (most recent call last)
# <ipython-input-16-191b65904589> in <module>
# ----> 1 torch.cos(0.)
#
# TypeError: cos(): argument 'input' (position 1) must be Tensor, not float
```


What operation is required to make the function work?

```
torch.cos(a)
# tensor([ 1.0000,  0.5403, -0.4161, -0.9900, -0.6536,  0.2837,  0.9602,  0.7539,
        -0.1455])
```

Is there a version of your function that operates in place?

```
これはよくわからない。
```