PythonとKerasによるDeepLearning個人的なまとめ No.01

多クラス分類

データの用意

from keras.datasets import reuters
from keras.utils.np_utils import to_categorical
import numpy as np
import keras

(train_data, train_labels),(test_data, test_labels) = reuters.load_data(num_words=10000)

#こんな感じでハッシュになっている(holleb': 30962)
word_index = reuters.get_word_index()

データ前処理

train_dataには文章が入っていて、その文章を構成されている単語にそれぞれindexが割り振られている.文章をテンソルに変換して、出てきた単語に関しては1を立てておく.(numpy配列は普通の多次元配列みたいにアクセス出来る)

def vectorize_sequences(sequences, dimention=10000):
    result = np.zeros((len(sequences), dimention))
    for i, sequence in enumerate(sequences):
        result[i, sequence] = 1
    return result

# train_dataは8982sample -> 
# 10000語を対象としているのでテンソルの形状は(8982, 10000)
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)

# 正解ラベルも0,1表現にしておく
# sample数が8982でそれら1つ1つのsampleに対して46次元を持つので、
# テンソル形状は(8982, 46)
oh_train_labels = to_categorical(train_labels)
oh_test_labels = to_categorical(test_labels)

modelの作成

今回は初めは(8982,10000)のテンソルが入力となる.その後64次元に落とし最終的には分類するために46次元に落とす.

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(10000, )))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))

model.summary()

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

検証

モデルを汎化させるためにも訓練データと検証データはちゃんと分ける

x_val = x_train[:1000]
practical_x_train = x_train[1000:]
y_val = oh_train_labels[:1000]
practical_y_train = oh_train_labels[1000:]

history = model.fit(practical_x_train, practical_y_train, epochs=3, batch_size=512,
validation_data=(x_val, y_val))

print(history.history)
Train on 7982 samples, validate on 1000 samples
Epoch 1/3
2020-01-19 11:08:43.746972: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2020-01-19 11:08:43.748935: I tensorflow/core/common_runtime/process_util.cc:71] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.
7982/7982 [==============================] - 2s 234us/step - loss: 2.5327 - acc: 0.4957 - val_loss: 1.7231 - val_acc: 0.6110
Epoch 2/3
7982/7982 [==============================] - 1s 105us/step - loss: 1.4493 - acc: 0.6868 - val_loss: 1.3504 - val_acc: 0.7070
Epoch 3/3
7982/7982 [==============================] - 1s 110us/step - loss: 1.0995 - acc: 0.7647 - val_loss: 1.1730 - val_acc: 0.7420
{'acc': [0.49574041605533381, 0.68679528983426075, 0.76472062047219047], 'loss': [2.5327453521581798, 1.4492631792813069, 1.0994816560310339], 'val_acc': [0.61100000095367435, 0.70699999094009403, 0.74200000333786009], 'val_loss': [1.7230872917175293, 1.3503756618499756, 1.1729804239273072]}
(mykeras) M-Takaishi-KeitonoMacBook-Pro-2:Chapter0

訓練データセット、検証データセット、テストデータセットを分ける理由

モデルのハイパーパラメーター(層の数、層のサイズなど)をチューニングするために検証データが必要であり、それを評価するためにテストデータが必要になってくるため元々のデータは3分割する必要がある.またこのチューニングの作業も学習に含まれる.