深度学习三:tensorflow,训练一个神经元

初学tensorflow,我做了一个无聊的尝试。构建一个只有两个输入,一个输出的升经网络,然后训练它。这个神经网络应该是这个样子:
这里写图片描述
我的目标是,我给他指定一个输入,比如x1=x2=1,我期望y能输出0,所以我不断的输入x1=x2=1,然后不断的训练它,等训练一万次以后,y的输出应该非常接近0。然后我可以调整期望,比如期望y能输出0.3,然后再训练一万次,y的输入应该能非常接近0.3才行。
下面是程序和实验结果:

import tensorflow as tf

x = tf.placeholder(tf.float32,[1,2])

W = tf.Variable(tf.random_normal([2,1]),name = "weight")
b = tf.Variable(tf.random_normal([1]),name="biases")


y = tf.sigmoid(tf.matmul(x,W)+b)

y_ = tf.placeholder(tf.float32, [1])
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)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)

    for lin in range(10000):
        sess.run(train_step,feed_dict={x: [[1,1]],y_: [0.3]})

    print(sess.run(y,feed_dict={x: [[1,1]]}))

结果如下:
这里写图片描述
可以看到这个结果非常接近0.3。

程序说明

在这个例子中,其实只有一个神经元,x1和x2是输入。因此这个神经元需要有两个权重(weight)和一个偏执(bias)。权重和编制需要反复的修改,所以在tensorflow中需要用Variable来表示。

当我们需要给图输入数据时,我们需要使用placeholder,它被称为占位符。他在这里只是占了个位置,并没有真的数据输入,要输入数据,我们需要使用feed_dict这个字典来数据数据,就像下面这样:

 sess.run(train_step,feed_dict={x: [[1,1]],y_: [0.3]})

例子中的y_其实是期望的输出值。误差函数选用的是交叉熵误差函数,当然你也可以用二次误差函数。交叉熵公式如下:
这里写图片描述
对比这个公式,

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

这行代码就不难理解了。
接下来我们就可以开始训练我们的神经网络了。tensorflow已经帮我们做好了训练需要的东西:

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

这个函数实现了梯度下降算法,0.01是学习的速度。minimize需要传入我们计算出的代价。我们需要反复的调用这个函数来训练我们的神经网络。tensorflow中,我们需要构建一个Sesson来执行我们构建好的神经网络。

with tf.Session() as sess:
    sess.run(init)

    for lin in range(10000):
        sess.run(train_step,feed_dict={x: [[1,1]],y_: [0.3]})

这里就是训练的代码了,可以看到我们不断的输入1,1,并期望输出0.3。最终,进过一万次的训练,你将得到一个非常接近0.3的数。这意味着我们的神经网络能够识别1,1这两个数字了,并且只要你输入1,1.它就会输出0.3。这就是我们训练的结果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章