tensorflow入门(简单神经网络实现)

来源:互联网 发布:tensorflow最新版本 编辑:程序博客网 时间:2024/06/08 10:34

tensorflow 详细的介绍可以看极客学院的tensorflow的官网:

http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/introduction.html

官网上讲解的比较清楚。。。

这里采用一个简单的神经网络的实现,来对tensorflow基本语法进行介绍,同时也想让大家对用tensorflow实现神经网络有个基本的了解。

神经网络模式:

输入层:2个节点,输入两个数据

隐藏层:一层,3个节点

输出层:1个节点

注意:这里的节点均包括了0节点。

python代码实现:(代码中有详细注释,语法的使用从实例中观察)

# coding:utf-8import tensorflow as tffrom numpy.random import RandomState#BATCH_SIZE这是定义的一个数量,即一次训练模型,投入的样例数,按理说应该是一次投入所有训练数据的#但是实际操作中一次投入太多数据,会导致电脑死机,因此只好对投入样例数,进行限制BATCH_SIZE=8#生成模拟数据#randomState 函数中数字1,相当于一个seed种子,每次产生的随机数都是相同的rdm=RandomState(1)#产生一个128行×2列的随机矩阵X=rdm.rand(128,2)#产生一个布尔型结果矩阵128×1Y=[[int(x0+x1)<1] for(x0,x1)in X]#定义神经网络的常量,参数,输入节点,输出节点,以及前向传播过程#Variable定义一个变量,需要调用初始化,才能产生值#random_normal 产生一个正太随机矩阵,shape=[2,3],stddev是正太分布的标准差,seed随机数种子,设置后每次产生的数字都相同w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))#placeholder占位符,执行时,在通过feed_dict将值传入,dtype:数据类型,shape:数据形状,name:名称#如果在定义占位符时,不能确定值的形状时,用None表示x=tf.placeholder(tf.float32,shape=(None,2),name="x-input")y_=tf.placeholder(tf.float32,shape=(None,1),name="y-input")#前向传播的过程#matmul就是矩阵相乘a=tf.matmul(x,w1)y=tf.matmul(a,w2)#定义损失函数及反向传播算法#cross_entropy是交叉熵#tf.clip_by_value(A, min, max):输入一个张量A,把A中的每一个元素的值都压缩在min和max之间。小于min的让它等于min,大于max的元素的值等于maxcross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))#train_step 就是每次可训练出一组w就是一次反向传播#下面给出里三种反向传播的算法传入的是学习率train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)#train_step=tf.train.GradientDescentOptimizer(0.001).minimize(cross_entropy)#train_step=tf.train.MomentumOptimizer(0.001,0.9).minimize(cross_entropy)#创建一个会话来运行Tensorflow程序,反复运行反向传播#tf中运行必须放在session对象中,且运行过后,要关闭sessionwith tf.Session()as sess:    #初始化变量,也就是上面的Variable变量    init_op=tf.initialize_all_variables()    sess.run(init_op)    # 输出目前(未经训练)的参数取值    #这里为何还要使用sess.run(w1)来进行操作?    #因为此时w1还是个变量,是个对象,直接打印出来是对象的地址    print "w1:\n",sess.run(w1)    print "w2:\n",sess.run(w2)    print "\n"    #训练模型    #训练步数    STEPS=5000    for i in range(STEPS):        start=(i*BATCH_SIZE)%128        end=(i*BATCH_SIZE)%128+BATCH_SIZE        sess.run(train_step,feed_dict={x: X[start:end], y_: Y[start:end]})        if i%1000==0:            total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X,y_:Y})            print ("After %d training steps,cross entropy on all data is %g" % (i,total_cross_entropy))    #输出训练后的参数模型    print "\n"    print "w1:\n",sess.run(w1)    print "w2:\n",sess.run(w2)


输出的结果:

w1:[[-0.81131822  1.48459876  0.06532937] [-2.44270396  0.0992484   0.59122431]]w2:[[-0.81131822] [ 1.48459876] [ 0.06532937]]After 0 training steps,cross entropy on all data is 0.0674925After 1000 training steps,cross entropy on all data is 0.0163385After 2000 training steps,cross entropy on all data is 0.00907547After 3000 training steps,cross entropy on all data is 0.00714436After 4000 training steps,cross entropy on all data is 0.00578471w1:[[-1.9618274   2.58235407  1.68203783] [-3.4681716   1.06982327  2.11788988]]w2:[[-1.8247149 ] [ 2.68546653] [ 1.41819501]]



原创粉丝点击