Pythonでグラフを作成

機械学習を試していると、損失関数の値を確認したくなることがあります。
csv等に保存してExcelでグラフを作ってもいいのですが、それは面倒なので、
プログラム内でグラフを表示させるようにします。

使用するのはmatplotlibというライブラリです。
特にインストールしなくても使えたのでAnacondaには最初から入っているのかもしれません。

以下プログラム。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

input=np.array([[0,0],[1,0],[0,1],[1,1]])
output=np.array([[1],[1],[1],[0]])

x=tf.placeholder("float",[None,2])
y_=tf.placeholder("float",[None,1])

w1=tf.Variable(tf.truncated_normal([2,2]))
b1=tf.Variable(tf.truncated_normal([2]))
h=tf.nn.relu(tf.matmul(x,w1)+b1)

w2=tf.Variable(tf.truncated_normal([2,1]))
b2=tf.Variable(tf.truncated_normal([1]))
y=tf.nn.sigmoid(tf.matmul(h,w2)+b2)

cross_entropy=-tf.reduce_sum(y_*tf.log(y)+(1-y_)*tf.log(1-y))

train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

sess=tf.Session()
sess.run(tf.global_variables_initializer())

loss=[]
epochs=10000
    
for step in range(epochs):
    sess.run(train_step,feed_dict={x:input,y_:output})
    loss.append(sess.run(cross_entropy,feed_dict={x:input,y_:output}))
    if step % (epochs/10)==0:
        print (sess.run(cross_entropy,feed_dict={x:input,y_:output}))
            
prob=y.eval(session=sess,feed_dict={x:input})

print (prob)

fig=plt.figure()
plt.plot(range(epochs),loss,color="red")
plt.xlabel("epochs")
plt.ylabel("loss")
plt.show()

機械学習の内容は何でも良かったのですが、とりあえず今回は
簡単なニューラルネットワークでNAND回路の学習をしてみました。

最後の数行がグラフを作成するためのコードです。
必要最小限のものしか書いていませんので非常に短いですが、
ちょっと確認したいだけならこれだけも十分です。

このようなグラフがあると学習回数は何回くらいがいいのか、視覚的にわかるので便利です。

f:id:oki-lab:20170709203253p:plain