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))
  • 相关阅读:
    第一节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表、验证码表、轮播图表
    Tensorflow 错误:Unknown command line flag 'f'
    Python 多线程总结
    Git 强制拉取覆盖本地所有文件
    Hive常用函数 傻瓜学习笔记 附完整示例
    Linux 删除指定大小(范围)的文件
    Python 操作 HBase —— Trift Trift2 Happybase 安装使用
    梯度消失 梯度爆炸 梯度偏置 梯度饱和 梯度死亡 文献收藏
    Embedding 文献收藏
    深度学习在CTR预估中的应用 文献收藏
  • 原文地址:https://www.cnblogs.com/Cucucudeblog/p/10138587.html
Copyright © 2011-2022 走看看