機械学習で株トレードを目指す(データの次元数について)

プログラム
この記事は約3分で読めます。
スポンサーリンク

機械学習で最初に訳が分からなくなるのが「学習前になんでそんなにデータをこねくり回しているの?」という部分。
私も良く分かっていませんでしたが、理解するとデータの次元数をコントロールする部分に一番時間を使うことになりました。

データの次元数とは

「ベクトル」とか「テンソル」とか出てきますが、要は「多次元配列でデータを扱う」ということになります。機械学習を行う前にやっていることは「データの正規化」と「多次元配列への整形」の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]

プログラムを見ていくときは「今、何次元のデータを作成して学習させているのか?」ということを意識すると理解しやすくなります。

コメント

タイトルとURLをコピーしました