In [1]:
import numpy as np
import tensorflow as tf

# orゲートを学習するときの
x1 = np.array([0, 0])
x2 = np.array([1, 0])
x3 = np.array([0, 1])
x4 = np.array([1, 1])

y1 = np.array([0])
y2 = np.array([1])
y3 = np.array([1])
y4 = np.array([1])

w = tf.Variable(tf.zeros([2, 1]))
b = tf.Variable(tf.zeros([1]))
# をtensorflowで表すと
x = tf.placeholder(tf.float32, shape=[None, 2])
t = tf.placeholder(tf.float32, shape=[None, 1])
y = tf.nn.sigmoid(tf.matmul(x, w) + b)
# (placeholderという名前はデータを格納する入れ物)を示す
# 実際にこのplaceholderに値を入れるときは
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
Y = np.array([[0], [1], [1], [1]])

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

print('w:', sess.run(w))
print('b:', sess.run(b))

# x,t,yはあとから値を入れるplaceholderなので、
# 中身を確認するときはfeed_dictで値を入れる
print('x', sess.run(x, feed_dict={
    x: X
}))
print('t', sess.run(t, feed_dict={
    t: Y
}))
print('y',  sess.run(y, feed_dict={
    x: X,
    t: Y
}))


w: [[ 0.]
 [ 0.]]
b: [ 0.]
x [[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]]
t [[ 0.]
 [ 1.]
 [ 1.]
 [ 1.]]
y [[ 0.5]
 [ 0.5]
 [ 0.5]
 [ 0.5]]

In [3]:
cross_entropy = - tf.reduce_sum(t * tf.log(y) + (1 - t) * tf.log(1 - y))
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy)

# 実際に訓練を回して重みとバイアスの変化、nnの出力内容変化を確認

for epoch in range(10):
    sess.run(train_step, feed_dict={
        x: X,
        t: Y
    })

print('10回回す')
print('w:', sess.run(w))
print('b:', sess.run(b))
print('y',  sess.run(y, feed_dict={
    x: X,
    t: Y
}))


10回回す
w: [[ 0.98534852]
 [ 0.98534852]]
b: [ 0.39265046]
y [[ 0.59692061]
 [ 0.79866946]
 [ 0.79866946]
 [ 0.91398937]]

In [5]:
for epoch in range(100):
    sess.run(train_step, feed_dict={
        x: X,
        t: Y
    })

print('100回回す')
print('w:', sess.run(w))
print('b:', sess.run(b))
print('y',  sess.run(y, feed_dict={
    x: X,
    t: Y
}))


100回回す
w: [[ 2.77059865]
 [ 2.77059865]]
b: [-0.75326324]
y [[ 0.32011068]
 [ 0.8826052 ]
 [ 0.8826052 ]
 [ 0.99173915]]

In [7]:
for epoch in range(1000):
    sess.run(train_step, feed_dict={
        x: X,
        t: Y
    })

print('1000回回す')
print('w:', sess.run(w))
print('b:', sess.run(b))
print('y',  sess.run(y, feed_dict={
    x: X,
    t: Y
}))


1000回回す
w: [[ 8.32319641]
 [ 8.32319641]]
b: [-3.69512796]
y [[ 0.024242  ]
 [ 0.99032098]
 [ 0.99032098]
 [ 0.99999762]]