Pythonいぬ

pythonを使った画像処理に関する記事を書いていきます

Pytorchでのモデルパラメータの確認

Pytorchでニューラルネットワークモデルのパラメータが更新されているかどうかを確認したいときがある。モデルのパラメータを確認する方法はいくつかあるけど、Pytorchはモジュールごとにモデルを作っていくことが多いので、とりあえず簡単に確認する方法を…

Pytorchで学習のチェックポイントの保存

Pytorchでモデルを保存する場合、モデルのパラメータのみを保存することが多い。しかし、モデルパラメータだけではlossがどれくらいか、optimizerは何を使ったか、何イテレーション学習してあるかなどの情報がわからない。これらがわからないと特に途中から…

Pytorchで特徴点のデータ拡張

Deep learningで学習するとき、ほとんどどんなタスクでも使うデータ拡張(data augmentation)。画像の輝度値をランダムで変化させたり、zoom in/outや画像のshift, flip, 回転などを使って、ネットワークを入力の分布にできる正則化の効果がある。 だけどOp…

Pytorchで複素数CNNをやってみる

Python の numpy では複素数のdtypeがあるけど、pytorch tensorには複素数型がない。Githubでtensor自体を複素数にしているものがあるけど、なんとなくまだcudaサポートしていないとか、発展途上な感じ。 github.com そもそもtensorを複素数にするとconvolut…

PytorchでPGGANを実装する

高解像度の画像を生成できるProgressive GAN (PGGAN)を実装してみた。 色々と苦労があって1週間以上時間を使った。ガチで研究するなら再現で1週間くらいかかるようなくらいはやらないといけないのかもしれない。論文ではさらに評価指標をどうするかなどの細…

nvidia-smiでpythonからGPU温度を監視

GPUが古くなったせいか、nvidiaドライバの自動制御があってもGPU温度が高くなるとGPUが勝手に止まるようになってきたので、nvidia-smiをpythonからたたいて温度情報を取り出し、温度が高くなったらGPU計算をいったん停止するスクリプトを書いてみる。 nvidia…

PytorchでGANをやってみる

PytorchでGANをやってみる。前からずっとGANの記事を書こうと思ってたんだけど、自宅PCのGPUまわりの挙動が怪しくなって、しばらくうまくGPUでの学習ができなくなってた。やっと動くようになったので、GANのtrainingをしてみた。 Generative Adversarial Net…

Pytorchでkerasのsummaryをやる

kerasを使っていたときは、model.summary()という関数があって、ネットワークの各レイヤにおける出力サイズがどうなっていくかを簡単に可視化できていた。 Pytorchはdefine by runなのでネットワーク内の各層のサイズはforward処理のときに決まる。なのでな…

PytorchのDataLoaderから任意のバッチを出力

Pytorchで自作Datasetを作って、さらにDataLoaderからのバッチ出力を(x, y)だけではなく(x1, x2, y)とか(x, y, c)などと自由に制御したいときがある。 例えばtriplet lossを使いたいときは、ターゲットクラスyに対して複数の入力(x1, x2)を取ってくる必要が…

Pytorch で VAE の実装と画像生成

PytorchでVAEをやってみる。理論的なところは他に説明がたくさんあるので省略する。VAEは最初から自分で書こうとするといろんなところでハマるので、とりあえず動くモデルを載せてみることにする。 VAEモデルの定義 まずはモデルの実装から。学習はネットワ…

pythonのlistから特定文字列を含む要素を抽出

pythonのlistで指定した文字列を含む要素だけを抽出したい。linuxでいうgrep的なことをlistやりたい。 listから特定の文字列を含む要素を抽出 以下のようにすると指定した要素を取り出せる。keyに探したい言葉を入れる。mylistは検索対象のリスト。outが出力…

Pytorchでdeep dreamをやってみる

Deep dreamが出た頃はまだtensorflowも公開されておらず、ディープラーニングはpythonというよりは、LuaやC++で書かれていた。懐かしのDeep dreamをpytorchを使って実装してみる。 下記のようなアナザーワールドを作ってみよう。 実装上のポイント 実装上の…

Pytorchでモデルの保存と読み込み

Pytorchでモデルを学習した後にモデルの学習済み重みパラメータを保存して、別のプログラムで読み込みたい。特にGPUで学習したモデルを、GPUを持たないCPUのみのPCで使いたい場合によくハマるのでメモを残しておく。 GPUで学習してGPUで読み込む 保存方法(GP…

Pytorch でOptimizerのパラメータにアクセス

Pytorchはdefine by run(実行しながら定義)なライブラリなので、 学習の途中でoptimizerにアクセスして、 learning rateを変更したりしてみたい。ということで、optimizerを定義した後でlearning rateなどにどのようにアクセスするかを調べてみた。 単純に…

Pytorchでネットワーク重みの初期値を固定

Pytorchでネットワークの挙動に再現性を持たせたい。しかしPytorchでは、デフォルトではネットワークの重みは乱数で初期化され、乱数のシード値も固定されていない。Pytorchで乱数シードを固定してネットワークの初期値に再現性をもたせる方法を調べてみた。…

PytorchでDataLoaderからデータを取り出す

PytorchのDataLoaderって便利だなと思いつつも、forループ以外の方法でデータを取り出すことができなかったので、中身を少し調べてみた。以下のようにすればデータがとれることがわかった。 tmp = testloader.__iter__() x1, y1 = tmp.next() x2, y2 = tmp.n…

Pytorchで取得できるMNIST系のdataset一覧

Pytorchのデータセットに入っているMNISTとその亜種について調べてみた。これらのデータセットの呼び出し方と使い方についてまとめてみる。 取得できるMNIST系データセット torchvision.datasetsに入っているMNIST系のデータセットは下記のコマンドで確認で…

PytorchでMNISTの分類をやってみる

Pytorchで自分で定義したCNNを使って、手書き数字MNISTの分類をやってみる。特にpytorchにおけるニューラルネットの書き方と、ネットワークの学習についてソースコードを交えて説明する。 ネットワークの定義 まずはネットワークの定義のやり方。pytorchでは…

Pytorch で LeNet-5 を論文どおりに実装してみる

LeNet5ライクのネットワークを実装したという記事は多いけど、LeNetを論文通りに再現してみた記事がないかなと思ったので、アーキテクチャの部分だけ再現してみた。 LeNet-5 この図の中にもSub-samplingとかGaussian connectionとか聞いたことがない言葉がち…

Pytorchでtensorのbicubic補間

pytorchでtensorの画像サイズを縮小するにはadaptive_avg_pool2dを使えばよかった。しかし拡大する際にはこの関数だとnearest neighbor になる。ということでtorch tensorでbicubic補間をやってみる。 まずは結果から。opencvでbucibucした場合とほとんど変…

Pytorch tensor と numpy ndarray の変換

Pytorch tensor から numpy ndarray への変換とその逆変換についてまとめる。単純にtorch.from_numpy(x)とx.detach().numpy()を覚えておけばよいので、その使い方を示しておく。 すぐ使いたい場合は以下 numpy to tensor x = torch.from_numpy(x.astype(np.f…

Pytorch tips

Pytorchで割とよく検索するけど、ひとつの記事にするほどでもない事をまとめてみる。使っていて便利そうだと思った情報はどんどん追加していくつもり。 cuda.is_available(): GPU動作チェック GPUかCPUかを自動判断 to(x.deice): model中での変数がGPUかCPU…

PytorchでEfficientNetを実装してみる

話題のEfficientNetを実装してみる。基本的な構造はNASNetとほぼ変わらないんだけど、EfficientNet特有の広さ、深さ、解像度などのパラメータも含めてコードを書いてみる。 画像はこちらのサイトから引用しました。 環境 python 3.7.4 torch 1.0.0 ヘッダ im…

numpyで画素毎のGLCM計算を高速化

画素毎にテクスチャの特徴抽出をするのに、全ての画素に対してその周辺窓のGLCMを計算したい。この計算をするのに、pythonなのに画素の二重forループ使って計算する方法があるけど、遅すぎて使い物にならない。そこで、numpyを使って画素毎のGLCM計算をスク…

Pytorchで全学習済みモデルの特徴マップと特徴ベクトルの抽出

転移学習、スタイル変換、物体検知、セマンティックセグメンテーション、メトリックラーニング、perceptual loss、ゼロショット学習など学習済みモデルの中間層を使いたい場合がよくある。Pytorchで使える学習済みモデルの特徴マップと特徴ベクトルを抽出す…

matplotlibの画像を保存せずにnumpy arrayに変換

OpenCVなどでUSBカメラなどから得られた動画を流している際に、各フレームの解析結果をグラフにして動画と一緒にリアルタイムで表示したいときがある。このようなときにプロット図をいったんファイルに保存しながらやると面倒なので、できればメモリ上でのや…

Pytorch で線形回帰 (Linear Regression) を実装してみる

Pytorchを使って1次元の線形回帰 (Linear Regression) の学習を実装してみる。目的はPytorchのモデルの書き方や学習コードの書き方の再確認。 線形回帰モデル まずはPytorchで線形回帰モデルを書いてみる。パラメータは傾き(weight)と切片(bias)の2つ from…

Python, pipでのバージョン確認

pythonのバージョンやフォルダの確認、pipのバージョン、pipでインストールできるライブラリのバージョンなどを確認する方法をリストアップしてみる。この記事で確認できるのは以下の情報。 pythonそのもののバージョン pipそのもののバージョン pipでインス…

OpenCVを使ってHSV色空間の色相Hを回転させる

OpenCVを使って、画像のHSV色空間における色相 Hue を回転させて色を変化させてみる。つまり、下記の図のような出力を得たい。 RGBからHSVへの変換 ja.wikipedia.org 上記のサイトに詳しく書いてあるけど、HSVは色相(Hue)、彩度(Saturation・Chroma)、明度(V…

Pytorchでクラス継承のsuper()の引数は省略できる

ディープラーニングでPytorchを使っていると、モデルの定義やモデルに組み込むモジュールの定義でクラスを作ることが多い。このとき、nn.Moduleを継承して定義するためsuperは必ず使う。ここでsuperの引数にクラス名を書くため、クラステンプレートのコピー…