猫でもわかるWebプログラミング

試行錯誤しながらエンジニア(プログラマー)として働く猫のブログ。技術的な話や、働き方の話、読書録とか、試行錯誤している日常の話。

Kerasを使って名義尺度をone-hot表現に変換する

f:id:yoshiki_utakata:20181208115631j:plain

はじめに: Deep Leraning for us

これは東大松尾研究室が公開している Deep Learning for us を参考にしています。

github.com

one-hot 表現とは

Deep Learning for us の Lesson 1 では、手書きの画像が与えられて、これが 0〜9 のどれなのか分類する問題が挙げられています。

この時、0〜9というのを数字で扱ってしまうと問題が起こります。0と9は数字的には遠く、0と1は数字的には近いのですが、今回の学習で2つの数値の差は関係ありません(「間隔尺度」ではない)。同様に数字の大小も関係ありません(「順序尺度」ではない)。これは「名義尺度」なのです。

そこで、DL4USのテキストにも書いてあるとおり、one-hot表現というベクトル表現を使います。

Keras を使った one-hot 表現への変換

tensorflow をインストールしておいてください

pip install tensorflow

keras の to_categorical 関数を使うことでone-hot表現への変換ができます。

from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

# x: 手書きの画像(28x28の画像)
# y: 正解のラベル(1〜9)
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# yの値は名義尺度なので one-hot 表現に変換します

# 変換前
# [5 0 4 ... 5 6 8] のような数字の配列になっている
print(y_train)

# yの名義尺度の値をone-hot表現へ変換
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

# one-hot 表現に変換する
print(y_train)
"""こういう表現になっているはず
[[0. 0. 0. ... 0. 0. 0.]
 [1. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 1. 0.]]
"""