2021年時点 「PyTorchで始める深層学習」の修正点(7章-4)

小泉訓著の「PyTorchで始める深層学習」の7章-5、自分のデータセット画像の分類で修正点がいくつかあったので、ここにメモする。

(2018年の本なので仕方ないことである)

 

① リスト7-10のtrain画像のパス

本には

files = os.listdir("./hymenoptera_data/" + d)

と書いてあるが、これではtrainフォルダ内の画像にはアクセスできない。

よって、

files = os.listdir("./hymenoptera_data/train/" + d)

と書き換えると良い。

 

② train画像の種類

trainフォルダにはgifなども混じっている。よって、リスト7-10では

for f in files:
if "jpg" in f or "jpeg" in f or "png" in f:

という様に書き換えれば上手くいく。

 

③ Variableについて

次はエラーでは無いが、pytorchでは

from torch.autograd import Variable

はもう必要無くなっている(depricated)。

よってこれを含むコードは飛ばしてもよい。

(あっても良い)

 

④lossの書き方

学習の部分で

total_loss += loss.data[0]

とあるのだが、以下の様に書き換える必要がある。

total_loss += loss.item()

 

以上で画像分類のコードが動く。

 

2021年時点 「PyTorchで始める深層学習」の修正点(6章-3)

小泉訓著の「PyTorchで始める深層学習」の6章-3、手書き文字の分類で修正点がいくつかあったので、ここにメモする。

(2018年の本なので仕方ないことである)

 

sklearnのdatasetsでmnistデータをダウンロードするコードがあるが、本にあるfetch_mldataはもう使えないらしい。

なのでコードは以下のように書き換えると上手くいく。

mnist = datasets.fetch_openml('mnist_784', version=1, data_home="./data/")

 

train_X, test_X, train_Y, test_Y = model_selection.train_test_split(
mnist_data, mnist_label, train_size = train_size, test_size = test_size
)

で得たtrain_y、test_yはobject型であるため、その後の処理

train_Y = torch.from_numpy(train_Y).long()

などでエラーとなる。

 

これの対処法は

object型→numpyのint

に変えておくことだ。

 

この様なコードを加えると良い。

train_Y = train_Y.astype(np.int)
test_Y = test_Y.astype(np.int)

 

次はエラーでは無いが、pytorchでは

from torch.autograd import Variable

はもう必要無くなっている(depricated)。

よってこれを含むコードは飛ばしてもよい。

(あっても良い)

 

学習の部分で

total_loss += loss.data[0]

とあるのだが、以下の様に書き換える必要がある。

total_loss += loss.item()

 

以上で手書き文字の認識コードが動く。

 

 

sklearnのdatasets.fetch_mldataにおいてのエラー

sklearnのdatasets.fetch_mldataをMNISTなどのデータセットのロードの際、以前は利用していたらしいが、今はエラーとなる。

ものとコード

mnist = datasets.fetch_mldata("MNIST original", data_home = "./data/")
 
代わりにこの様に書くとエラーは出なくなる。
mnist = datasets.fetch_openml('mnist_784', version=1, data_home="./data/")
 
 

 

 

マシンのマウント先が再起動した際に無くなったとき

あるマシン(pc)の/opt/hdd4t/ ディレクトリの下に4Tのメモリをマウントしていたが、再起動したらマウント先が見れなくなってしまった。

こういった場合の対応を記述する。

 

まずは現在マウントされているファイルシステムを一覧表示(容量や使用量が単位付きで表示する)

$ df -h 

Filesystem      Size  Used Avail Use% Mounted on

udev             16G     0   16G   0% /dev

tmpfs           3.2G  299M  2.9G  10% /run

/dev/sdb2       1.8T  1.6T   87G  95% /

tmpfs            16G  192K   16G   1% /dev/shm

tmpfs           5.0M  4.0K  5.0M   1% /run/lock

tmpfs            16G     0   16G   0% /sys/fs/cgroup

/dev/sda1        96M   29M   68M  30% /boot/efi

tmpfs           3.2G   28K  3.2G   1% /run/user/108

tmpfs           3.2G     0  3.2G   0% /run/user/1000

 

こんな感じの出力を得たが4Tらしきものはない。

(本当は >> /dev/sdc1       3.6T  1.8T  1.7T  53% /opt/hdd4t などとでるはず)

 

次に

$ lsblk

sda      8:0    0 232.9G  0 disk 

├─sda1   8:1    0   100M  0 part /boot/efi

├─sda2   8:2    0    16M  0 part 

├─sda3   8:3    0 232.3G  0 part 

└─sda4   8:4    0   450M  0 part 

sdb      8:16   0   1.8T  0 disk 

├─sdb1   8:17   0   512M  0 part 

├─sdb2   8:18   0   1.8T  0 part /

└─sdb3   8:19   0  15.9G  0 part 

sdc      8:32   0   3.7T  0 disk 

└─sdc1   8:33   0   3.7T  0 part 

 

4Tがあった!

これをマウントする。

$ sudo mount /dev/sdc1 /opt/hdd4t/

(sdc1などは/devのしたにある様だ)

 

これでdf -hでマウントできた事を確認できる。

 

fstabを使えばrebootしてもつながったままにできる様なので、今度調べる。

 

Got permission denied while trying to connect to the Docker daemon socket ... permission deniedエラーの対処法

 

$docker ps

とうつと

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http:~

unix /var/run/docker.sock: connect: permission denied

という様なエラーが出た際の対処法を書く。

 

これはユーザーがdocker groupというものに入っていないときに出るエラーだ。

docker groupに入れる必要がある。

以下のサイトが参考になる。

https://stackoverflow.com/questions/48957195/how-to-fix-docker-got-permission-denied-issue

https://www.digitalocean.com/community/questions/how-to-fix-docker-got-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket

 

要するにやることは

$ sudo groupadd docker

$ sudo usermod -aG docker $USER

($USERは人それぞれ)

 

自分の場合はログアウトし、もう一度ログインしたらdockerを使えた。

上のサイトには別の方法ものっている。

 

Amazon Forecastのデータ入手から実行まで

以下のサイトを参考にすれば、データのダウンロードから実行まで行える。

https://dev.classmethod.jp/articles/amazon-forecast-getting-start/

(※UIは変わっている。特にschemaの並び替えは分かりづらいが、左のバーガーのようなアイコンをドラッグできるようになっている。コードからは変更できないようだ(現時点))

TypeError: Expected Ptr<cv::UMat> for argument 'src' エラーの対処法

OpenCVのremap関数を用いた際にこのエラーが出た。

具体的には

warped_img2 = cv2.remap(image1, flow, None, cv2.INTER_LINEAR)

の様なコードだ。

色々調べた結果、入力が間違っている可能性があることがわかった。

自分の場合は例えば

print(flow_up.shape)

の出力は

torch.Size([1, 2, 240, 416])

となっており、pytorchのtensorを入力としてしまっていた。

またC、H、Wの順番も間違っていた。

 

flow = flow.squeeze().cpu().numpy().transpose(1,2,0)
image1 = image1.squeeze().cpu().numpy().transpose(1,2,0)

を行う事で例えばflowは

(240, 416, 2)

になり、エラーも出なくなった。