DeepLearningの学習曲線をmatplotlibで可視化
TensorBoardのEventsによる学習状況の可視化 を行ったが、今後いろいろとカスタマイズしたくなると思い、matplotlibで可視化することにした。 今回もFizzBuzz問題を例に扱う。詳しくは、Deep Learning入門としてのFizzBuzz問題を参照。
精度とコストの記録
学習過程(train_network()
)で、エポックごとにtrain_loss
、train_accuracy
、test_accuracy
を算出して記録する。
記録はCSV形式で保存する。# Logging
と# Save logs
がそれらの操作にあたる。
def train_network(self, data, network): # data train_data = data[0] train_label = data[1] test_data = data[2] test_label = data[3] # model X = network['X'] Y = network['Y'] Y_ = network['Y_'] loss = network['loss'] step = network['step'] # Setting sess = tf.InteractiveSession() tf.initialize_all_variables().run() accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1)), tf.float32)) logs = [] for epoch in range(N_ITER+1): # Randamize data p = np.random.permutation(range(len(train_data))) train_data, train_label = train_data[p], train_label[p] # Training for start in range(0, train_label.shape[0], BATCH_SIZE): end = start + BATCH_SIZE sess.run(step, feed_dict={X: train_data[start:end], Y_: train_label[start:end]}) # Testing train_loss = sess.run(loss, feed_dict={X: train_data, Y_: train_label}) train_accuracy = sess.run(accuracy, feed_dict={X: train_data, Y_: train_label}) test_accuracy = sess.run(accuracy, feed_dict={X: test_data, Y_: test_label}) # Logging log = {'epoch': epoch, 'train_loss': train_loss, 'train_accuracy': train_accuracy, 'test_accuracy': test_accuracy} logs.append(log) if epoch % 100 == 0: std_output = 'Epoch: %s, \t Train Loss: %s, \t Train Accuracy: %s, \t Test Accuracy: %s' print(std_output % (log['epoch'], log['train_loss'], log['train_accuracy'], log['test_accuracy'])) # Save logs df = pd.DataFrame(logs) df.to_csv("./log/acculoss_train_%s_batch_%s_iter_%s.csv" % (TRAIN_RATE, BATCH_SIZE, N_ITER), index=False)
CSVファイルは以下のようになる。
epoch,test_accuracy,train_accuracy,train_loss 0,0.5247524976730347,0.5341278314590454,1.3275593519210815 1,0.5247524976730347,0.5341278314590454,1.284529209136963 2,0.5247524976730347,0.5341278314590454,1.2487729787826538 ... 9998,0.9801980257034302,1.0,0.008503337390720844 9999,0.9801980257034302,1.0,0.008444004692137241 10000,0.9801980257034302,1.0,0.008517774753272533
可視化
保存したCSVファイルを読み込んで、精度とコストの値をセットして、 背景色がグレーなのが気に入らないのでホワイトにして、各曲線にラベルを付けて、可視化を行う。
def main(self): # Read file df = pd.read_csv('./log/acculoss_train_0.05_batch_100_iter_10000.csv') # Set values x = df['epoch'].values y0 = df['train_loss'].values y1 = df['train_accuracy'].values y2 = df['test_accuracy'].values # Set background color to white fig = plt.figure() fig.patch.set_facecolor('white') # Plot lines plt.xlabel('epoch') plt.plot(x, y0, label='train_loss') plt.plot(x, y1, label='train_accuracy') plt.plot(x, y2, label='test_accuracy') plt.legend() # Visualize plt.show()
可視化すると以下のようになる。
train_accuracy
とtrain_loss
だけを見ると上手くいってるように見えるが、
test_accuracy
を見ると過学習しているのが分かる。
ちなみに最終結果は、以下の通り、まあまあの精度。
Epoch | Train Loss | Train Accuracy | Test Accuracy |
---|---|---|---|
10000 | 0.00851777 | 1.0 | 0.980198 |