け日記

最近はPythonでいろいろやってます

Pythonの列挙型 (enum)

これまで定数クラスを作ってやり過ごすことが多かったのですが、enumが比較的使いやすかったので、 enum enumはPython 3.4から標準ライブラリに追加されたモジュールで、列挙型をサポートするものです。 docs.python.org 実装 最初にenumをインポートしてお…

SQSのメッセージを別のSQSへ転送するCLIツール sqstransfer をRustで作りました

SQSのメッセージを別のSQSへ転送するCLIツールを作って、crates.ioに公開しました。 https://crates.io/crates/sqstransfer GitHubでバイナリを公開してます。 github.com 使い方 こちらから自身の環境にあったバイナリをダウンロードいただくか、または、ca…

RustでSQSのメッセージを送受信する (Rusoto)

AWSのマネージドサービスのSDKライブラリの最右翼Rusotoの使い方を、SQSとのメッセージのやり取りを通して、ひと通り触れていきます。 Rusoto RusotoはAWSマネージドサービスの非公式SDKです。AWSの各サービスのAPIを叩くラッパ (バインダ) となっており、cr…

pandas小技: 複数の文字列のいずれかを含む (OR + 部分一致) 検索したい

例えば↓のテーブルから 東京都または千葉県 を含む値だけをフィルタする場合に、pandasではどう書くかです。 name 0 東京都葛飾区 1 神奈川県川崎市 2 埼玉県蕨市 3 千葉県蘇我市 pandasのstr.containsは正規表現パターンを含めることができます。 そのため…

Python: データ保持用のクラスを定義する (dataclasses)

DBのエンティティクラスを定義するときなど、データを持つことに特化した構造体のようなクラスが必要なケースがよくあります。 かつてはdict + typeやnamedtupleなどで用をなしてましたが、そういったクラスを簡単に定義できる標準ライブラリとして、Python …

Python: バイナリデータを入出力したい (struct)

お仕事でバイナリのセンサデータをPythonで入出力する必要がありましたので、標準ライブラリ struct について整理します。 struct structは、Pythonの値 (int, double, charなど) とCの構造体 (Pythonではbytesオブジェクト) を相互変換するためのモジュール…

RustモジュールをPythonから実行する (PyO3)

最近少しずつRustに手を出し始めています。 CPUバウンドとなっている重い処理をPythonから切り出してコンバートするユースケースを考えたときに、PythonからRustを呼び出すための仕組みが必要となります。 今回はPythonからRustバイナリを実行する (あるいは…

torchtextを使った自然言語処理タスクの前処理

PyTorch: DatasetとDataLoader (画像処理タスク編) - け日記 にてDatasetとDataLoaderの使い方を紹介しました。 今回は自然言語処理のにフォーカスし、torchtextを使った自然言語処理 (NLP) タスクの前処理について整理します。 NLPタスクの前処理 大別する…

Python: 抽象クラスを実装する (abc)

お仕事のPythonコードを読んでいて、抽象基底クラス (abstract base class: ABC) で実装されているクラスがありました。そういえば使ったことがなかったので、この機に整理しましたのでその覚書です。 $ python --version Python 3.6.8 Pythonでは抽象基底ク…

Python: 辞書の値を属性参照する (AttrDict)

辞書の値を属性参照 (dic["key"] ではなく dic.keyでアクセスする) したいケースがしばしばあります。JSON形式の設定ファイルを読み込んで、オブジェクトの初期化に使うなどです。 そんなときに便利なAttrDictを紹介します。 typeを使えば良いのでは? 組み…

Python: subprocessでOSコマンドを実行する

ちょっとしたツールのためにPythonからGitやDockerなどのコマンドを実行してゴニョゴニョする、ということはよくあるかと思います。 OSコマンドを手軽に実行するPython標準ライブラリ subprocess で頻用する機能について使い方を整理します。 docs.python.or…

Amazon EKSでコンソール画面からKubernetesクラスタを作成する

年末年始にかけてKubernetesを少しだけインプットしてました。ローカルで環境を整えるのもしんどいし、現実的な利用も考えにくいので、Amazon EKS上でクラスタを作成して動かしてました。 今回はAWSコンソールからクラスタを作成する方法についてまとめまし…

AWS Inf1でPyTorchモデルの推論を行う

AWSの推論環境の新たな選択肢として登場したInf1インスタンスを使い、PyTorchのモデルをコンパイル・推論させてみます。 概ねチュートリアル (https://github.com/aws/aws-neuron-sdk/blob/master/docs/pytorch-neuron/tutorial-compile-infer.md) をなぞっ…

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で…