TensorFlow函数整理
tf.placeholder()
函数说明:
tf.placeholder(dtype, shape=None, name=None)
dtype
:被填充的张量(Tensor)的元素类型。shape
:被填充张量(Tensor)的形状(可选参数)。如果没有指定张量(Tensor)打形状,你可以填充该张量(Tensor)为任意形状。name
:为该操作提供一个名字(可选参数)。
返回值
一个张量(Tensor)。 必须在使用句柄的情况下赋值,但不可以直接求值。
实例
随机生成1024*1024的矩阵求其平方。
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, shape=(1024, 1024))
y = tf.matmul(x, x)
with tf.Session() as sess:
# print(sess.run(y)) # ERROR: 由于x没有分配具体的数据所以该句将报错,注释掉后运行下面的语句即可
rand_array = np.random.rand(1024, 1024)
print(sess.run(y, feed_dict={x: rand_array})) # feed_dict以字典的方式将生成的rand_array填充进x中
输出:
[[256.57236 251.9136 246.73756 ... 255.34134 258.76617 256.08838]
[247.4614 248.76004 245.5755 ... 255.68884 253.55783 254.72958]
[259.5662 261.3415 262.0701 ... 264.10605 254.40105 260.89197]
...
[261.12183 262.28265 258.7582 ... 264.52927 263.2297 261.29486]
[263.35928 269.88034 259.76392 ... 264.96063 269.3814 273.23434]
[264.03726 260.48154 255.99431 ... 261.76068 262.7351 265.99802]]
参考链接:https://blog.csdn.net/fxmfxm9304/article/details/80159183
sess.run()
函数说明
run(fetches, feed_dict=None, options=None, run_metadata=None)
fetches
:可以是单个图元素(single graph element),也可以是任意嵌套的列表list,元组tuple,名称元组namedtuple,字典dict或包含图元素的OrderedDict。feed_dict
:可选参数 feed_dict允许调用者替换图中张量的值(the value of tensors in the graph)。options
:可选的options参数需要一个RunOptions原型。 选项允许控制该特定步骤的行为(例如,打开跟踪)。run_metadata
:可选的run_metadata参数需要一个RunMetadata原型。 适当时,将在那里收集此步骤的非Tensor输出。 例如,当用户在options中打开跟踪时,配置信息将被收集到此参数中并传回。
返回值
当构建完图后,需要在一个session会话中启动图,第一步是创建一个Session对象。
为了取回(Fetch)操作的输出内容, 可以在使用 Session 对象的 run()调用执行图时,传入一些 tensor, 这些 tensor 会帮助你取回结果。
在python语言中,返回的tensor是numpy ndarray对象。
实例
import tensorflow as tf
# 创建一个变量。在默认的图中创建节点,这个节点是一个变量,命名为“counter”
state = tf.Variable(0, name="counter")
# 创建一个常量
one = tf.constant(1)
# 创建一个op。对常量与变量进行简单的加法操作,这点需要说明的是: 在TensoorFlow中,
# 所有的操作op和变量都视为节点,tf.add() 的意思就是在tf的默认图中添加一个op,这个op是用来做加法操作的。
new_value = tf.add(state, one)
# 赋值操作。将new_value的值赋值给update变量
update = tf.assign(state, new_value)
# 此处用于初始化变量。但是这句话仍然不会立即执行。需要通过sess来将数据流动起来 。如果有Variable,一定需要写这句话
init = tf.initialize_all_variables()
# 启动图,运行op
with tf.Session() as sess:
# 对变量进行初始化,真正的赋值操作
sess.run(init)
# 循环3次,并且打印输出。
for _ in range(3):
sess.run(update)
# 打印变量时也需要用sess.run
print(sess.run(state))
我们在编写代码的时候,总是要先定义好整个图,然后才调用sess.run()。那么调用sess.run()的时候,程序是否执行了整个图
import tensorflow as tf
state = tf.Variable(0.0,dtype=tf.float32)
one = tf.constant(1.0,dtype=tf.float32)
new_val = tf.add(state, one)
update = tf.assign(state, new_val) #返回tensor, 值为new_val
update2 = tf.assign(state, 10000) #没有fetch,便没有执行
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for _ in range(3):
print sess.run(update)
输出:
1.0
2.0
3.0
我们仅仅是fetch “update”,输出是1.0 , 2.0, 3.0,可以看出,tensorflow并没有计算整个图,只是计算了与想要fetch 的值相关的部分。
参考链接:https://blog.csdn.net/lcczzu/article/details/91449731
feed_dict – sess.run() 中的feed_dict
features_, labels_, indexs_ = sess.run([features, labels, indexs])
feed_dict参数的作用是替换图中的某个tensor的值或设置graph的输入值。
1. 是否需要进行传参feed_dict
需要看features, labels, indexs这3个变量的产生是否存在于“一个需要传参的函数中”,如果产生features, labels, indexs这3个变量的函数的形式像下面这样
def xxx():
X = tf.placeholder(dtype=tf.float32, shape=([50,93]))
Y = tf.placeholder(dtype=tf.int32, shape=([50]))
Z = tf.placeholder(dtype=tf.int32, shape=([50]))
...
return features, labels, indexs
features, labels, indexs = xxx()
那么这时候features_, labels_, indexs_ = sess.run([features, labels, indexs]),就需要写成下面这样
features_, labels_, indexs_ = sess.run([features, labels, indexs], feed_dict={X:features_, Y:labels_, Z:indexs_})
并且要注意feed_dict不接受tensor格式的数据,所以features_需要是普通格式,比如numpy,但是传参进去后,会自动进行类型的转化,在xxx()函数中,他们就变成tensor格式
2. 是否执行一次sess.run函数,代码里的“数据迭代生成器”就会更新一次batch
那要取决于sess.run函数里面的参数是否与“数据迭代生成器”有关
假如features, labels, indexs = input_fn(),input_fn()函数每执行一次,就生成一个batch的数据,那么这种sess.run([features, labels, indexs])每每执行一次 就会更新一个batch的数据
举个反面的例子,也就是即使执行了2000次sess.run(),也不会更新batch的数据
pred_new_2 = sess.run([pred_new_1], feed_dict={X:features_, Y:labels_, Z:indexs_})。这里pred_new_1的产生函数 就必须要传进来3个参数,所以有feed_dict传参
当前pred_new_1并不是和“数据迭代生成器”有关,而是另外一个函数的返回结果,那么就符合我的举例
3. sess.run()可以将tensor格式转成numpy格式
可以用来很方便的将一些tensor格式的数据,进行数据具体内容查看,也就是将tensor格式转成numpy格式,上面的所有例子都是这种作用
4. feed 只在调用它的方法内有效
我们都知道feed_dict的作用是给使用placeholder创建出来的tensor赋值。其实,他的作用更加广泛:feed 使用一个值临时替换一个 op 的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失。
import tensorflow as tf
y = tf.Variable(1)
b = tf.identity(y)
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(b,feed_dict={y:3})) #使用3 替换掉
#tf.Variable(1)的输出结果,所以打印出来3
#feed_dict{y.name:3} 和上面写法等价
print(sess.run(b)) #由于feed只在调用他的方法范围内有效,所以这个打印的结果是 1
输出:
3
1
参考链接:https://blog.csdn.net/lcczzu/article/details/91449731
tf.reshape()
tf.reshape(tensor, shape, name=None)
函数说明
重塑张量shape
tensor
:一个Tensor。shape
:一个Tensor;必须是以下类型之一:int32,int64;用于定义输出张量的形状。-1表示由实际情况而定name
:操作的名称(可选)
返回值
该操作返回一个Tensor.与tensor具有相同的类型。