機械学習で最初に訳が分からなくなるのが「学習前になんでそんなにデータをこねくり回しているの?」という部分。
私も良く分かっていませんでしたが、理解するとデータの次元数をコントロールする部分に一番時間を使うことになりました。
データの次元数とは
「ベクトル」とか「テンソル」とか出てきますが、要は「多次元配列でデータを扱う」ということになります。機械学習を行う前にやっていることは「データの正規化」と「多次元配列への整形」の2つになります。
MNISTのサンプルデータを取得した場合を例に見てみます。1枚の画像データは「28×28」のデータで構成されています。画素数ととらえても良いかもしれません。それが60000あります。そのため、3次元配列としてデータが渡されます。train_images[i][j][k]と考えると分かりやすいかも。
「i」がデータ数(1次元)となり、1つのデータが「x軸(j)」、「y軸(k)」で構成されているので3次元データとなっています。
train_labelsは画像データに対する分類です。これは1次元で渡されています。
データ画像データと同じ要素数になりますね。
train_images[i]に対応する分類データがtrain_labels[i]になります。1対1の関係になっています。
fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data() print(train_images.shape) (60000, 28, 28) print(train_labels.shape) (60000,)
モデル作成について
MNISTのサンプルだと、モデルは以下のようになっています。
最初のレイヤーでは1つのデータ(1組のデータ)として扱うデータの次元数を指定する必要があります。
画像データは1つのデータは「28×28」で構成していますのでその次元数を指定します。
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
データの次元数とモデルの次元数が合わない場合はfitで学習する際にエラーとなります。
例えば、「input_shape=(27, 27)」となると以下のようになります。
モデルでは「27×27(729)」と指定しているのに、実際のデータは「28×28(784)」が渡されているのでエラーとなっています。
ValueError: Input 0 of layer dense_10 is incompatible with the layer: expected axis -1 of input shape to have value 729 but received input with shape [32, 784]
プログラムを見ていくときは「今、何次元のデータを作成して学習させているのか?」ということを意識すると理解しやすくなります。
コメント