美文网首页
TF - 训练简单神经网络

TF - 训练简单神经网络

作者: 大地瓜_ | 来源:发表于2019-01-11 18:57 被阅读0次

    placeholder占位符

    由于在深度学习训练的时候需要采用大量的数据。如果一次将数据全部读入内存,则可能导致memory errror。为了避免这种错误,我们往往采用迭代器iteror来避免这种错误。迭代器是一种惰性生成数据的过程,只有调用迭代器的时候才会生成一批次数据。

    为了设定这个批次大小的数据,我们引入batch定义为批次数据量。如果一张图像大小为256*256*3,那么生成一个批次batch = 10的数据量 10 * 256 *256 * 3

    tensorflow中,如果我们将输入数据定义为constant或者variable,则每轮迭代都需要通过上面tensor来表示,但是这样会导致数据节点规模特别大,所以我们引入占位符 placeholder

    简单的tf代码

    import tensorflow as tf
    # 省去其中的name和type属性
    # 初始化参数
    w1 = tf.Variable(tf.random_normal([2,3], stddev=1))
    w2 = tf.Variable(tf.random_normal([3,1], stddev=1))
    
    # 定义输入的占位符
    x = tf.placeholder(tf.float32, shape=[1,2], name="input")
    
    # 运算图
    a = tf.matmul(x,w1)
    y = tf.matmul(a,w2)
    
    # 初始化参数
    init = tf.global_variables_initializer()
    
    with tf.Session()  as sess:
        sess.run(init)
        # feed_dict中加入每个批次的数据
        print sess.run(y, feed_dict={x:[[0.7,0.9]]})
    

    上面的代码为单向传播的代码,不需要反向来训练模型的参数

    tf反向传播训练代码

    import tensorflow as tf
    from numpy.random import RandomState
    
    batch_size = 8
    
    w1 = tf.Variable(tf.random_normal([2,3], stddev=1))
    w2 = tf.Variable(tf.random_normal([3,1], stddev=1))
    
    x = tf.placeholder(tf.float32, shape=[None,2], name="input")
    # 真实值
    y_ = tf.placeholder(tf.float32, shape=[None,1], name="output")
    
    a = tf.matmul(x,w1)
    y = tf.matmul(a,w2)
    
    y = tf.sigmoid(y)
    
    # 定义损失函数
    # 原书中定义错误
    cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
    train_step = tf.train.AdadeltaOptimizer(0.001).minimize(cross_entropy)
    
    rdm = RandomState()
    dataset_size = 128
    X = rdm.rand(dataset_size,2)
    
    Y = [[int(x1+x2 < 1)] for (x1, x2) in X]
    
    with tf.Session() as sess:
        init = tf.global_variables_initializer()
        sess.run(init)
    
        print sess.run(w1)
        print sess.run(w2)
    
        step = 5000
        for i in xrange(step):
            start = (i*batch_size)% dataset_size
            end  = min(start+batch_size, dataset_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 is %g"%(i, total_cross_entropy)
    
        print sess.run(w1)
        print sess.run(w2)
    

    解释说明

    tf.sigmoid
      对于每一个值都做如下变化:y = 1/(1 + exp (-x))
    
    # 定义损失函数
    cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
    #  reduce_mean reference : https://www.w3cschool.cn/tensorflow_python/tensorflow_python-hckq2htb.html
    
    
    train_step = tf.train.AdadeltaOptimizer(0.001).minimize(cross_entropy)
    

    相关文章

      网友评论

          本文标题:TF - 训练简单神经网络

          本文链接:https://www.haomeiwen.com/subject/efmxdqtx.html