元のデータはこちら
https://github.com/brendenlake/omniglot
今回作ったものはこちら
https://github.com/TatsuyaMizuguchi17/Products
作ったというよりは。まとめた、という感じですが…
#Omniglotとは
OmniglotとはMnistと同じ文字認識用データセットですが、Mnistよりもシビアなものになっています。例えばsklearnのMnistと上のOmniglotを比較すると、
データ数 | 分類クラス | 1クラスあたりのデータ数 | |
---|---|---|---|
Mnist | 70000 | 10 | 7000 |
Omniglot | 32460 | 1623 | 20 |
と1クラスあたりのデータ数が非常に少ないです。
そのため超多クラス分類やOne-shot-learningをやっている人にとっては、より実用に近いデータセットになっています。
#使い方
ダウンロード
形式はsklearn.datasetsのfetch_mldataと同じにしました。
なので、これまでsklearnでMnistを使っていた場合、コードを大きく変更することなく使用できると思います。
もちろん初めからコードを書く場合も扱いやすいようにしています。
sklearnの場合、
from sklearn.datasets import fetch_mldata
mnist = fetch_mldata("MNIST original")
data = mnist["data"].astype(np.float32)
label = mnist["target"].astype(np.int32)
N = 60000
N_test = 10000
train_data = data[:N].reshape((N, 1, 28, 28)) / 255.0
test_data = data[N:].reshape((N_test, 1, 28, 28)) / 255.0
train_label = label[:N]
test_label = label[N:]
と書くところを、今回は
import omniglot
dataset = omniglot.omniglot("small1") #small1 or small2 or large
train_data = dataset["train_data"]
train_label = dataset["train_label"]
test_data = dataset["test_data"]
test_label = dataset["test_label"]
とすればOKです。
次に説明しますが、omniglot.omniglotの引数には、small1、small2、largeのどれかを使います。
#データ内訳
データセットは3種類あります。それぞれクラス数が異なります。
Trainデータ数 | Testデータ数 | クラス数 | 1クラスあたりのデータ数 | |
---|---|---|---|---|
small1 | 2040 | 680 | 136 | 20 |
small2 | 2340 | 780 | 156 | 20 |
large | 14460 | 4820 | 964 | 20 |
試しで使用する場合はsmall1を使うことをお勧めします。
#選択肢付きデータセット
よくある(?)問題設定として、1つの問題画像Aと複数の選択肢画像B,C,...,Nが提示され、画像Aと同じクラスに分類する画像をB~Nの中から1つ選んで解答するというものがあります。
下の例では、一番左が問題画像で、その他の5つが選択肢の画像になっています。
カッコの中身がクラス番号を表していて、一番左の文字と同じクラス(51)に属するものを右の選択肢の画像の中から選ぶ、というのが問題設定です。
今回は、この問題設定に準じたデータセットを簡単に作成することができます。
train_questionset = omniglot.get_omniglot_questionset(train_data,train_label,QUESTION_NUM=1000, CHOICE_NUM = 5)
test_questionset = omniglot.get_omniglot_questionset(test_data,test_label,QUESTION_NUM=300, CHOICE_NUM = 5)
QUESTION_NUMが問題数、CHOICE_NUMが選択肢の数です。
ここでは、選択肢が5つである問題文を1300問(トレーニングデータ1000問、テストデータ300問)とってきています。
get_omniglot_questionsetは問題数の大きさのリストLを返します。
L[i]は"question_data","question_label","ans_data","ans_label"をキーに持つ辞書です。
"question_data" : 問題の画像 shape=(1,1,105,105)
"question_label" : 問題のラベル shape=(1)
"ans_data" : 選択肢の画像 shape=(CHOICE_NUM,1,105,105)
"ans_label" : 選択肢の画像 shape=(CHOICE_NUM)
問題を出力して見たい場合はshow_questionset(data)で出力できます。
omniglot.show_questionset(train_questionset,line=7)
と言うわけで、以上が今回作ったデータセットの説明でした。