zoukankan      html  css  js  c++  java
  • 完整神经网络样例程序详解

    主要是对《tensorflow 实战google深度学习框架》的第三章中在模拟数据集上训练神经网络的完整程序进行详解,

    所利用的神经网络结构图如下

    详细代码如下

    import tensorflow as tf
    from numpy.random import RandomState
    #定义神经网络的参数,输入和输出节点
    batch_size = 8
    w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
    w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
    x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
    y_= tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
    #定义前向传播过程,损失函数及反向传播算法
      a = tf.matmul(x, w1)
      y = tf.matmul(a, w2)
      cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 
      train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
    
    #生成模拟数据集
    rdm = RandomState(1)
    X = rdm.rand(128,2)
    Y = [[int(x1+x2 < 1)] for (x1, x2) in X]
    #创建一个会话来运行tensorflow程序
    with tf.Session() as sess:
        init_op = tf.global_variables_initializer()
        sess.run(init_op)
        
        # 输出目前(未经训练)的参数取值。
        print("w1:", sess.run(w1))
        print("w2:", sess.run(w2))
        print("
    ") 
        
        # 训练模型。
        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 step(s), cross entropy on all data is %g" % (i, total_cross_entropy))
    • 引入模块的设置,因为实在模拟数据集中运行一个完整的神经网络,因此需要做的事情是引入随机数种子,使得其可以随机产生数据

     下面我们对代码进行详细的解读

    from numpy.random import RandomState

     RandomState():随机数种子 
    功能:随机产生所需数据。这段引入主要是为了引入可以产生随机数组的RandomState

    • 定义神经网络的参数,输入节点和输出节点参数

    由于在每次迭代的开始,首先需要选取一小部分训练数据,这一小部分数据称为一个batch,batch_size的大小决定了一次性读入多少批量的数据

    batch_size = 8
    batch_size的介绍如下
    定义:一次性读入多少批量的样本,不是图片,其有几个子类型
    Full Batch Learning:batch_size=数据集的大小,适用于小数据集
    Mini-batches Learning:Batch_size= N(自己设定),适用于大数据集。
    Online Learning(在线学习):Batch_size=1,
    确定了batch_size之后,我们需要设置W1和w2的权重及其形式
    w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
    w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

     在tensorflow中,变量(tf.Variable)的作用是保存和更新神经网络中的参数,需要指定初始值,一般是使用随机初始值。stddev=1代表矩阵元素中的方差为1

    设置输入输出矩阵

    x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
    y_= tf.placeholder(tf.float32, shape=(None, 1), name='y-input')

    在tensorflow 中提供了placeholder这一机制用于提供输入数据,placeholder相当于定义了一个位置,这个位置中的数据在程序运行时再指定,这样程序中就不需要生成大量常量来提供输入数据,而只需要将这个数据通过placeholder传入tensorflow计算图,在placeholder定义时,这个位置上的数据类型是需要指定的,和其他张量一样,placeholder的类型也是不可以改变的

    这个函数的形式为tf.placeholder(dtype,shape=数据维度,name=数据名称)

    函数功能:

    插入一张张量的占位符,这个张量总是被喂入图片数据,相当于一个形參

    形參:只有在调用时才分配内存单元,在调用结束时,就会释放所分配的内存单元

    • 定义前向传播过程,损失函数及反向传播函数
    a = tf.matmul(x, w1)
    y = tf.matmul(a, w2)

    在这里,由于我们做的神经网络输入层是x,隐含层是a,输出层是y,因此这里主要是调用tensorflow中的矩阵相乘的函数实现矩阵的乘法

    cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 
    train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

    在得到一个batch的前向传播结果之后,需要定义一个损失函数来刻画当前的预测值和真实答案之间的差距,因此我们定义了如上的损失函数来刻画预测值和真实值之间的差距

    y_:正确结果,y:预测结果,tf.clip_by_value(y, 1e-10, 1.0)将张量限制在1e-10和1.0之间,
    • 生成模拟数据集
    rdm = RandomState(1)
    X = rdm.rand(128,2)
    Y = [[int(x1+x2 < 1)] for (x1, x2) in X]
    • 创建一个会话来运行tensorflow程序
    with tf.Session() as sess:

    这是tensorflow创建会话的模式,这个就是创建一个会话,并通过python中的上下文管理器来管理这个会话,通过python的上下文管理机制,只要将所有的计算资源放在"with"的内部就可以,当上下文管理器推出时会自动释放所有资源,这样解决了因为异常退出时资源释放的问题

    init_op = tf.global_variables_initializer()
    sess.run(init_op)

    tensorflow中提供了一种便捷的方式来完成变量初始化过程,,利用以上代码可以直接完成变量的初始化

    STEPS = 5000
        for i in range(STEPS):
         #每次选取batch_size个样本进行训练
            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 step(s), cross entropy on all data is %g" % (i, total_cross_entropy))
  • 相关阅读:
    css3优惠券
    js实现简单的评论和回复功能(数组版)
    ajax获取json形式得题目和答案 实现答题功能
    SEO搜索引擎优化(转)
    iOS 读取大文件时候的注意点
    【转】通过自定义的URL Scheme启动你的App
    友盟分享需要注意的事项
    iOS真机调试引入第三方库(如友盟等)编译时候,出现错误提示
    重写navigationController的push方法后,出现卡顿现象
    通过应用打开系统中设置(定位权限,摄像头权限等等)
  • 原文地址:https://www.cnblogs.com/Cucucudeblog/p/10138587.html
Copyright © 2011-2022 走看看