感知机是最简单的神经网络,通过输入,进行加权处理,经过刺激函数,得到输出。通过输出计算误差,调整权重,最终,得到合适的加权函数。
今天,我通过tensorflow实现简单的感知机。
首先,初始化变量:
num_nodes = 2
output_units = 1
w = tf.Variable(tf.truncated_normal([num_nodes,output_units], -0.1, 0.1))
b = tf.Variable(tf.truncated_normal([output_units],0.1))
x = tf.placeholder(tf.float32, shape = [None, num_nodes])
y = tf.placeholder(tf.float32, shape = [None,output_units])
计算输出,同时设置损失函数与优化损失,这里采用sigmoid函数,可以将经过加权函数的输出归为0到1之间。采用均方差作为损失函数,如果采用交叉熵函数,交叉熵损失函数主要用于多输出的,不太合适。
output = tf.sigmoid(tf.matmul(x,w) + b)
cross_entropy = tf.reduce_mean(tf.square(output - y))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
输入训练数据进行训练,运行1000次。
sess = tf.Session()
sess.run(tf.global_variables_initializer())
train_x = [[1.0,1.0],[0.0,0.0],[1.0,0.0],[0.0,1.0]]
train_y = [[1.0],[0.0],[0.],[0.]]
for i in range(1000):
sess.run([train_step], feed_dict={x:train_x,y:train_y})
进行预测:
test_x = [[0.0,1.0],[0.0,0.0],[1.0,1.0],[1.0,0.0]]
print(sess.run(output, feed_dict={x:test_x}))
输出结果为[0.11,0.03,0.85,0.11],接近于[0,0,1,0]
与门感知机的实现主要是损失函数,学习率的调整,方能得到不错的结果。输入或门的数据,同样可以获得或门的模型。感知机由于无法处理非线性问题,所以无法实现异或门。
代码地址: https://github.com/summersunshine1/datamining/tree/master/perceptron