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)
网友评论