RubyでCIFAR-10, CIFAR-100を扱いやすくしました

以前こんな記事を書いていました
blog.hatappi.me

CIFAR-10は10クラス, CIFAR-100は100クラスからなる画像セットです

CIFAR-10 and CIFAR-100 datasets

それぞれはPython(Pickle), Matlab, binaryで提供されます
前の記事でも書いたのですが、Rubyで扱うとなるとbinaryから読み込んで取り出す必要があります
それでも良いのですが、もうちょっと扱いやすくしたいところ

ということでred-datasetsというgemにPRを送りました
github.com

red-datasetsはRed Data Toolsで作成しているRuby向けにwikipediaやirisのdatasetsを提供するgemになっています

red-datasetsの0.0.4から今回のCIFARを取り出すものが入っています

使い方

gem install red-datasetsやGemfileにgem 'red-datasets'を追加します

# CIFAR-10 sample
> require "datasets"
> cifar = Datasets::CIFAR.new(n_classes: 10, type: :train)
> cifar.each do |record|
     p record.pixels
     # => [59, 43, 50, 68, 98, 119, 139, 145, 149, 143, .....]
     p record.label
     # => 6
  end
> cifar.to_a.size
# => 50000

red-datasetsで提供されるdatasetsはここでEnumerableをincludeしているので.firstとか.mapが使えるようになっています

newの際に使用できるオプションは次のようになっています

キー 指定できる値 備考
n_classes 10 or 100 CIFAR-10, 100のどちらを使用するか デフォルトは10
type :train or :test train用、test用のdatasetsのどちらを使用するか デフォルトは:train

CIFAR10, 100をeachなどで取り出す際にそれぞれはDatasets::CIFAR::Record10, Datasets::CIFAR::Record100というインスタンスがかえってきます
それぞれは下記のように取り出すことが出来ます

CIFAR-10

Datasets::CIFAR::Record10.new 取り出すことの出来る値
.data imageのbinary(String)
.pixels RGBそれぞれが0~255の範囲で1024個が1次元で提供されている
.label ラベル

CIFAR-100

Datasets::CIFAR::Record100.new 取り出すことの出来る値
.data imageのbinary(String)
.pixels RGBそれぞれが0~255の範囲で1024個が1次元で提供されている
.coarse_label 粗いラベル 例:) insects
.fine_label 細かいラベル 例:) bee

まとめ

red-datasetsの0.0.4からCIFAR-10, 100が使えるようになりました!!