メモするところ

こんにちは

ゼミ課題のニューラルネットワークの課題をTensorFlowでやったはなし

5000兆年ぶりに投稿したくなったのでかきました

動機
ゼミ課題がCでニューラルネットワークを作らされるう〇ちだったのでやりました

やること
2bitの入力をいれてXORの出力をだす
この課題いる?

環境

  • windows10 64bit
  • python3.6
  • CUDA9.0
  • cudnn9.0
  • TensorFlow1.10.0
  • VisualStudio2015
  • 家長むぎと文野環のうどん2人羽織動画

この環境を作るのに5時間くらいかかりました(主に回線速度が原因)
コードと可視化したやつ

import tensorflow as tf
import numpy as np

log_dir = '/Users/machibito2/source/repos/test/test/logs'
if tf.gfile.Exists(log_dir):
    tf.gfile.DeleteRecursively(log_dir)
tf.gfile.MakeDirs(log_dir)

def buildGraph(middle):
    inputLay = tf.placeholder(shape=[None,2], dtype = tf.float32)
    yout = tf.placeholder(shape=[None,1], dtype = tf.float32)
    middleLay = tf.layers.dense(inputs=inputLay,units=middle,activation=tf.nn.relu)
    outLay = tf.layers.dense(middleLay, 1, None)

    diff = outLay - yout
    loss = tf.nn.l2_loss(diff)
    minimize = tf.train.AdamOptimizer().minimize(loss)
    _ = tf.summary.scalar('loss', loss)
    return inputLay,outLay,yout,diff,loss,minimize

tf.reset_default_graph()
inputLay,outLay,yout,diff,loss,minimize = buildGraph(10)

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    for i in range(10000):
        input = np.random.randint(low=0,high=2,size=2)
        y = None
        if(input.tolist() == [0,0]):
            y = 0.1
        elif(input.tolist() == [0,1]):
            y = 0.9
        elif(input.tolist() == [1,1]):
            y = 0.1
        else:
            y = 0.9
        sess.run(minimize, feed_dict={inputLay:[input],yout:[[y]]})
        if i % 1000 is 0:
            print(input, y)
            losstrain = sess.run(loss, feed_dict={inputLay:[input],yout:[[y]]})
            print(i, losstrain)
    print(0,0,sess.run(outLay, feed_dict={inputLay:[[0,0]],yout:[[0]]}))
    print(0,1,sess.run(outLay, feed_dict={inputLay:[[0,1]],yout:[[1]]}))
    print(1,1,sess.run(outLay, feed_dict={inputLay:[[1,1]],yout:[[0]]}))
    print(1,0,sess.run(outLay, feed_dict={inputLay:[[1,0]],yout:[[1]]}))

summary_writer = tf.summary.FileWriter(log_dir , sess.graph)
summary_writer.close()

f:id:machibito2:20180903171937p:plain

出力

[1 0] 0.9
0 0.56225556
[1 1] 0.1
1000 0.022195984
[0 1] 0.9
2000 0.0002413019
[0 0] 0.1
3000 8.665808e-05
[0 1] 0.9
4000 3.3389131e-0
[1 0] 0.9
5000 2.842171e-14
[1 1] 0.1
6000 3.3584246e-1
[0 0] 0.1
7000 3.5971226e-1
[0 1] 0.9
8000 1.7763568e-1
[0 1] 0.9
9000 1.0542965e-0
0 0 [[0.09934975]
0 1 [[0.89922875]
1 1 [[0.100178]]
1 0 [[0.8995937]]

感想
python歴5時間の人間にはさっぱりわからない
可視化されたところでさっぱりわからない
けどなんか動いているのでライブラリはすごい(すごい)
逆伝播が一発で書けるのはめっちゃ楽だとおもった(小並感)

参考にしたサイト
TensorFlowの高レベルAPIの使用方法:tf.layersの使い方と重みなどの取り出し方
【TensorBoard入門】TensorFlow処理を見える化して理解を深める
tf.layers.denseメモ
TensorFlowの基礎
【Tensorflow入門】適当にTensorflowを理解して、モデルを作ってみる
Python でリストを比較する。 - いっきに Python に詳しくなるサイト