TF - 训练简单神经网络

2019-01-11  本文已影响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)
上一篇 下一篇

猜你喜欢

热点阅读