Help us understand the problem. What is going on with this article?

Pythonで機械学習やデータ解析やってる人はバグを無くすためにassert文を使うべき

More than 1 year has passed since last update.

背景

研究で画像を扱っていたとき、

  • 次元の違い
  • 正規化する範囲の違い

がバグに繋がるケースが数多くありました。

自分の中でルールを決めていたとしても、

  • 未来の自分が覚えてるかわからない
  • 他の人とルールが同じとは限らない
  • 極力バグを減らしたい

ので最近はassert文を多用しています。

assert文

Pythonの公式リファレンスによると

assert <条件式>

assert <条件式>, <エラーの時に表示したい文字列>

となります。

参考:
7.3. assert 文

用例

機械学習で何かしらの画像分類モデルを作ろうと思ったとき、入力画像を0~1に正規化する必要があるのに忘れていた、なんてことないでしょうか。

「値が0~1になってると思ってたけど、実際は0〜255だった〜〜!!」ってのはよく聞く話です。

assert文が1行だけでも入っていたら、これは防げます。

import numpy as np
from PIL import Image


img = np.array(Image.open("sample.png"))
img = img / 255.0

# 0~1に正規化されててほしい!(正規化されてなければ、エラーが出て処理が止まる)
assert (0.0 <= img).all() and (img <= 1.0).all()

# 画像が3次元(width, heigt, channels)なのを確かめたい場合
assert img.ndim == 3

# widthとheightは同じ値であってほしい! エラー文のカスタマイズはこんな感じ。
assert img.shape[0] == img.shape[1], "widthとheightの値は同じにしてね"

# チャンネル数はRGBの3チャンネルじゃなくてRGBAの4チャンネルであってほしい!
assert img.shape[2] == 4

まとめ

assert文多用しましょう!

友達にコード見てもらうときも、assert文があると必要条件が分かるのでスムーズに理解できそう。

追記

皆さん、多くのいいねありがとうございます!!
補足ですが、エラーは下記のように出力されます。

import numpy as np

tmp = np.arange(10).reshape(2,5)
print("tmp.shape=",tmp.shape)
assert tmp.shape == (2,6)

print("End")

出力

tmp.shape= (2, 5)
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-3-b4bb1727ab0e> in <module>()
      3 tmp = np.arange(10).reshape(2,5)
      4 print("tmp.shape=",tmp.shape)
----> 5 assert tmp.shape == (2,6)
      6
      7 print("End")

AssertionError:

エラーが出た時点で実行が止まるので、安心です。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away