очень простой классификатор NN с одним 2D-входным узлом и одним выходным узлом для классификации двух точек (1,0) и (1,1), которые обозначены 0 и 1 соответственно. Модель классификатора имеет вид w1 * x1 + w2 * x2 + b = 0
Сеть обучается только одному шагу, а гистограмма параметра b отрисовывается инструментом тензорной доски. Гистограмма выглядит как равномерное распределение в диапазоне [1.97,2.16]. Почему гистограмма b имеет такую форму?
import tensorflow as tf
import numpy as np
'''
generate synthesis dataset
'''
N = 2
x_np = np.array([[1,0],[1,1]]).astype('float32')
y_np = np.array([0,1]).astype('float32')
'''
generate tensorflow graph for the classifier model
'''
with tf.name_scope("placeholders"):
x = tf.placeholder(tf.float32, (N,2))
y = tf.placeholder(tf.float32, (N,))
with tf.name_scope("weights"):
W = tf.Variable([[3.],[5.]])
b = tf.Variable([2.])
with tf.name_scope("prediction"):
y_logit = tf.squeeze(tf.matmul(x,W)+b)
# define the loss function
with tf.name_scope("loss"):
#compute the cross-entropy term for each datapoint
entropy = tf.nn.sigmoid_cross_entropy_with_logits(logits=y_logit, labels=y)
#sum all contributions
l = tf.reduce_sum(entropy)
# add training op
with tf.name_scope("optim"):
train_op = tf.train.GradientDescentOptimizer(.1).minimize(l)
'''
for debugging
'''
with tf.name_scope("summaries"):
tf.summary.histogram("b", b)
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter("/tmp/classifier-train", tf.get_default_graph())
'''
train the classifier model
'''
n_steps = 1
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
train_writer.add_graph(sess.graph)
#train the model
for i in range(n_steps):
feed_dict = {x:x_np, y:y_np}
_,summary,b_val = sess.run([train_op, merged, b], feed_dict=feed_dict)
train_writer.add_summary(summary,i)