2019-01-01から1年間の記事一覧

PyTorch: DatasetとDataLoader (画像処理タスク編)

引き続きPyTorchのお勉強です。 画像処理タスクの文脈でDatasetとDataLoaderの使い方を整理していきます。 DatasetとDataLoader PyTorchに限らず、ディープラーニングタスクのデータの入力については、一般的に以下の要件が挙げられます データをミニバッチ…

どうすれば自分の身に付く技術ブログになるのか

この記事は write-blog-every-week Advent Calendar 2019 の24日目の記事です。ポエム枠です。 adventar.org 2016年12月のアドベントカレンダーからスタートして、週1投稿を3年間継続してきました。投稿を通して技術的なトピックを幅広く学んできました。ま…

PyTorchのモデルをTorchScriptへ変換する

引き続きPyTorchのお勉強してます。 今回はPyTorchで計算資源を有効活用した推論を行うための仕組みの1つTorchScriptについてまとめます。 TorchScriptとは TorchScriptはPyTorchの中間表現 (intermediate representation) コードとその変換機構です。 主な…

PyTorchでネットワークを実装する

引き続きPyTorchのお勉強中です。 前々回はテンソル、前回は誤差逆伝播について見ていきましたが、今回はtorch.nnのモジュールを中心にネットワークの作り方について整理していきます。 前回より少し難しくして、2次関数 (w=4.5, b=7.0, εは誤差) を例にして…

PyTorchは誤差逆伝播とパラメータ更新をどうやって行っているのか?

引き続きお仕事でPyTorchを使った開発を行っているのですが、これまでKerasで高度にラッピングされた学習フレームワークしか経験が無かったので、お作法的なところで躓くこと・疑問に思うことがよくありました。 loss.backward()で計算グラフを伝って誤差逆…

PyTorchのTensorはどうやってデータを持っているのか?

お仕事でPyTorchを扱っているのですが、以下のような疑問がふつふつと湧いてきましたので、Tensorのデータが実際にはどうやって保持・管理されているのかを調べて整理しました。 image_tensor = minibatch_tensor[i, :, :, :]はメモリコピーが発生するのか?…

PyTorchでパラメータ数をカウントする

PyTorchのモデルのパラメータ数をカウントする方法です。2パターンあります。 1. Moduleのparametersメソッドを合計する Module.parametersメソッドで各層のパラメータがtensorで取得できますので、numelで要素数を合計していくことでパラメータ数を計算でき…

論文メモ: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

物体検出の分野でブレイクスルーとなったFaster R-CNNの提案論文 Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (arXiv) についての備忘録として整理します。 ポイント 先発のFast R-CNNで時間を要していた物体領域候補…

SQSを永遠にポーリングするPythonパッケージ sqs-polling を作りました

タイトルの通りで、SQSを永遠にポーリングするPythonパッケージを作ってPyPiに公開しました。 pypi.org GitHubはこちら。 github.com 使い方 pip install sqs-pollingでインストール。あとは以下のように記述すると、延々とSQSからメッセージを取り出し、コ…

論文メモ: MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

今回は軽量・高速なCNNの紹介です。 最新のいかついモデルを、GPUフル回転で学習し、目標の精度を達成したとしても、いざ実際にシステムに組み込む段階になると推論の遅さが足かせになって導入できない、というケースはしばしばあるのかなと思います。そうい…

Python: unittest.mockでモックを作ってテストする

Python (3.3以降) でユニットテストのモックを楽に作れるunittest.mockが標準ライブラリとして提供されてます。今回はその紹介を行います。 外部モジュールに依存した実装をテストする難しさ ユニットテストの実現において、DBやWeb APIなどのアプリケーショ…

AWS SQSのメッセージをPythonで送受信する

AWSのキューメッセージサービスSQSのメッセージを、Boto3を使ってPythonで送受信する方法の備忘録です。 Boto3のインストール、AWSの設定、および、SQSの作成は完了している前提です。 $ pip install boto3 $ aws configure AWS Access Key ID [************…

Python: ファイルパスをオブジェクトっぽく操作するpathlib

Pythonでのファイル操作は os + glob の組み合わせなどでどうにかすることが多いですが、標準モジュールのpathlibを使うとサクッと実装できることもあります。 pathlib --- オブジェクト指向のファイルシステムパス — Python 3.7.5rc1 ドキュメント osモジュ…

Python: requestsでBasic認証

Basic認証がかけられたエンドポイントへ、requestsを使ってリクエストする方法です。 $ pip install requests ID/PWでrequests.auth.HTTPBasicAuthを生成し、requestsのメソッド (ここではpost) の auth へ渡してあげるのがポイントです。 HTTPDigestAuthやH…

OpenCV: ラベリング

今回はOpenCVを使って画像のラベリングを行います。いらすとやさんの画像を使わせていただきました。 ラベリングは画像を連続する領域ごとにラベルを付けることです。上の画像であれば、左の棒人形と右の棒人形が分離しているので、別々のラベルになります。…

SageMakerで起動時に実行するスクリプトを設定する

SageMakerは所定の場所に置かれたファイル以外はインスタンス停止によってリフレッシュされます。そのためSageMakerにプリインストールされていないコマンドやライブラリなどを使いたい場合、起動のたびにインストールする必要があります。 ライフサイクルイ…

SageMakerのコードをGitHubで管理する

SageMakerで分析・学習・推論のために作成した.ipynbファイルなどのバージョン管理やチームメンバへの共有を行いたい、ということが日々あります。 今回はSageMakerとGitHubを連携させる方法について紹介します。スクリーンショットたくさんです。 GitHubで…

Python: プログレスバーを表示する (tqdm)

tqdmを使ってプログレスバーを表示する方法について紹介します。 Kerasなどのフレームワークは良い感じにビジュアライズしてくれるのですが、自前の前処理などで進捗表示したい場合に便利です。 $ pip install tqdm github.com 基本的にはシーケンスやイテレ…

Python: ファイルを移動する (shutil.move)

ファイルのETLを実装しているとLinuxのmvコマンド相当のことをよくやるのですが、Pythonではshutil.moveを使うと便利です。 https://docs.python.org/ja/3/library/shutil.html#shutil.move 例としてこのようなディレクトリ構造を仮定します。 % tree . ├── …

Python: リストのリスト・辞書のリストを展開 (flat) するワンライナー

[[...], [...], [...]] -> [..., ..., ...] としたいケースです。 内包表記は多重ループ可能なので、ワンラインで展開できます。 list_in_list = [[0, 1, 2], [3, 4], [5, 6, 7, 8]] flatten_list = [v for child_list in list_in_list for v in child_list]…

OpenCV: 2値化

前回・前々回と引き続き、OpenCVを触っていきます。 2値化 画像はチャネル (グレー画像であれば1チャネル, RGB画像であれば3チャネル) ごとに階調を持っており、一般的に256階調になります。 これを2階調、つまり白・黒に変換する処理のことを2値化と言いま…

OpenCV: Optical Flowで物体の動きをトラックする

先週に引き続き、OpenCVを使っていきます。 Optical Flow Optical Flowを使って、物体の動きを検出していきます。OpenCVのチュートリアルと↓の記事を参考にしました。 OpenCVでとらえる画像の躍動、Optical Flow - Qiita OpenCVでオプティカルフローをリアル…

OpenCV: 特徴点抽出とマッチング

お仕事で初めて画像処理システムの開発に携わってます。 基本的なツールとしてOpenCVについて知っておいた方が良さそうですので、自分用のメモとしてトピックごとに整理していこうと思います。 OpenCV 言わずと知れたコンピュータビジョンのOSSライブラリで…

Autogradで勾配を計算する

最近、大学院で機械学習の講義に通って勉強してます。今回は講義で知ったAutogradについて紹介します。 Autograd Autogradは勾配を計算するPythonライブラリです。インプットとしてNumPyの行列を渡せる、バックプロパゲーションで計算できるなどの特徴があり…

cvxpyを使った凸最適化

Pythonで凸最適化を行うための便利なライブラリcvxpyを使う機会がありましたので、使い方を整理しておきます。 凸最適化 凸最適化 (convex optimization) は、制約条件がある中で目的関数の最大化 (または最小化) を行う最適化問題の1つですが、特に以下の特…

Comet.mlでJupyter Notebookの学習を記録・レポートする

Comet.mlを使ってJupyter NotebookなどのPythonの学習を記録・レポートする方法についてまとめます。 [7/18 追記] 本投稿では、稼働環境としてGoogle Colaboratoryを使ってます。環境によってデフォルトで送られるデータに差がありますので、注意が必要です…

AWS CodeBuildでGitHubと連携してPythonアプリをビルドする

久しぶりにAWSについての投稿です。AWS CodeBuildでGitHubと連携してPythonアプリケーションをビルドする方法を整理しました。 CodeBuild CodeBuildはその名の通り、アプリケーションをビルドするためのAWSマネージドサービスです。 CodeCommit - CodeBuild …

NumPyでロジスティック回帰を実装する

ディープラーニング以前 (〜2010年) の機械学習について、はじパタを使って整理しています。 今回は「第6章 線形識別関数」を参考にしながら、ロジスティック回帰をNumPyで実装してみます。 はじめてのパターン認識作者: 平井有三出版社/メーカー: 森北出版…

ResNetでCIFAR-10を分類する

KerasでResNetを作ってCIFAR-10を分類し、通常のCNNモデルと比較します。 ResNet ResNetはCNNのモデルの1つです。 Microsoft ResearchのKaiming Heらが2015年に提案1し、その年のILSVRCではResNetで学習したモデルが優勝しました。 VGGやGoogLeNetにて、畳み…

numpyで無相関化・白色化する

最近通っているディープラーニングの講習会にて、BatchNormalizationの文脈でデータの白色化なるものについて触れましたので、「はじめてのパターン認識」を読みながらnumpyで実装してみます。 はじめてのパターン認識作者: 平井有三出版社/メーカー: 森北出…