一、如何建立tensorflow模型
第一步:构建图
1、得到输入数据(dataset或placeholder)
2、定义权重(weight)和偏移(bias)
3、定义推论模型(inference model)
4、定义loss function
5、定义Optimizer
第二步:执行计算
1、初始化所有变量
2、初始化training data中的iterator/feed
3、使用inference model和training data执行计算
4、计算cost
5、调节参数,根据模型最小化/最大化cost
二、读入数据的方式
1、placeholder
tf.placeholder(dtype, shape=None, name=None)
在计算placeholder时,必须使用feed_dict传入值。
a = tf.placeholder(tf.float32, shape=[3])
b = tf.constant([5, 5, 5], tf.float32)
# use the placeholder as you would a constant
c = a + b # short for tf.add(a, b)
with tf.Session() as sess:
# compute the value of c given the value of a is [1, 2, 3]
print(sess.run(c, {a: [1, 2, 3]})) # [6. 7. 8.]
writer.close()
2、tf.data
import tensorflow as tf
import numpy as np
dataset = tf.data.Dataset.from_tensor_slices(np.array([1.0, 2.0, 3.0, 4.0, 5.0]))
from_tensor_slices的作用是切割第一个维度
产生迭代器有两种方式:
iterator = dataset.make_one_shot_iterator()
one_element = iterator.get_next()
iterator = dataset.make_initializable_iterator()
X, Y = iterator.get_next()
其中后一种可以多次使用,但每次重新开始都要初始化:
sess.run(iterator.initializer) # initialize the iterator
如果一个dataset中元素被读取完了,再尝试sess.run(one_element)的话,就会抛出tf.errors.OutOfRangeError异常,这个行为与使用队列方式读取数据的行为是一致的。在实际程序中,可以在外界捕捉这个异常以判断数据是否读取完:
with tf.Session() as sess:
try:
while True:
print(sess.run(one_element))
except tf.errors.OutOfRangeError:
print("end!")
在Eager模式中,创建Iterator的方式有所不同。是通过tfe.Iterator(dataset)的形式直接创建Iterator并迭代。迭代时可以直接取出值,不需要使用sess.run():
import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()
dataset = tf.data.Dataset.from_tensor_slices(np.array([1.0, 2.0, 3.0, 4.0, 5.0]))
for one_element in tfe.Iterator(dataset):
print(one_element)