变量 和占位符
1.变量
变量可以存储,修改,和训练
我们在训练模型实际上就是在不断的优化不看量
注意这里的变量和python里的变量不同。不是一个概念。
1.1 创建变量
tf.Variable(initial_value=None,
trainable=True,
collections=None,
name=None)
一般用的多,常见的就是上面的几个参数
**initial_value=None:**默认的是None。就是初始化值
trainable=True: 是否被训练
**collections=None:**新变量将添加到新列出的图的集合中。刚开始用的很少。就不详细介绍了。
**name=None:**就是添加名字。
示例
import tensorflow as tf
#创建变量
a = tf.Variable(initial_value=40)
b = tf.Variable(initial_value=50)
c = tf.add(a,b)
print('a:',a)
print('b:',b)
print('c:',c)
#初始化变量。有变量一定要有这一句。没有就不行
init = tf.global_variables_initializer()
with tf.Session() as sess:
#变量初始化
sess.run(init)
print(sess.run([a,b,c]))
打印结果
a: <tf.Variable ‘Variable:0’ shape=() dtype=int32_ref>
b: <tf.Variable ‘Variable_1:0’ shape=() dtype=int32_ref>
c: Tensor(“Add:0”, shape=(), dtype=int32)
[40, 50, 90]
代码说明
是创建两个初始值为40和50 的变量。
就是定c =a+b
我们可以看到a,和b两个比变量的类型和c不一样。c是一个Tensor对象。但是a,b就不是。是一个tf.Variable对象。
这一句千万千万不要忘记写。刚开始很容易忘记。
==tf.global_variables_initializer()==固定写法
==with tf.Session() as sess:==这一句是上下文管理器不多说了。
==sess.run(init)==以为前面已经把变量初始化了。但是我们并没有在会话里初始。不然也不行。没有这句话。就会报错。刚开始也可以当成固定写法。
这一句就是打印a,b,c的值。我们也看到了结果就是。40,50,和90.
==sess.run()==就是实例化对象
还有就是:共享变量tf.get_variable()
我觉得我还是在后面实例中讲解好写。现在感兴趣的可以查看官方文档
占位符
很多时候我们的数据不是一次性传入的。我们是在后面才从外部传入的。
这个时候我们就需要实现定义占位符。
可以这样理解。刚开始什么都没有。但是我们在后来有数据了,但是需要一个东西来存储数据。这个时候就需要用到占位符了。
tf.placeholder(dtype,
shape=None,
name=None)
**dtype:**类型必须传入的也就是必须确定的是什么类型
**shape:**形状,默认是None。如果确定的是什么形状,后面传入的也是这个形状
**name:**名字
示例
import tensorflow as tf
import numpy as np
#创建占位符
a = tf.placeholder(tf.float32,shape=[2,2])
b = tf.placeholder(tf.float32,shape = [2,2])
c = tf.matmul(a, b)
#准备数据
a_1 = np.array([[1,2],[3,4]])
b_1 = np.array([[4,3],[2,1]])
print('a:',a)
print('c:',c)
print('-'*50)
with tf.Session() as sess:
print(sess.run(c,feed_dict={a:a_1,b:b_1}))
打印结果
a: Tensor(“Placeholder:0”, shape=(2, 2), dtype=float32)
c: Tensor(“MatMul:0”, shape=(2, 2), dtype=float32)
[[ 8. 5.]
[20. 13.]]
代码说明
就是定义占位符dtype是float32,形状是一个 [2,2]的二阶张量
==c = tf.matmul(a, b)==定义了一个矩阵乘法。axb
我们可以看到a是==Tensor(“Placeholder:0”, shape=(2, 2), dtype=float32)==是一个Tensor对象
c: 是
然后我们定义了两个数据
==sess.run(c,feed_dict={a:a_1,b:b_1})==就是实例化z
由于z是a和b的矩阵乘法。
但是我们并不知道a和b的具体值。==feed_dict={a:a_1,b:b_1}==就是传入a和b的值。a为a_1,b为b_1是以字典的形式传入的。我们也可以定义一个字典。然后就直接使用字典就可以
示例
import tensorflow as tf
import numpy as np
a = tf.placeholder(tf.float32,shape=[2,2])
b = tf.placeholder(tf.float32,shape = [2,2])
c = tf.matmul(a, b)
a_1 = np.array([[1,2],[3,4]])
b_1 = np.array([[4,3],[2,1]])
#定义一个字典
placeholder= {a:a_1,b:b_1}
with tf.Session() as sess:
print(sess.run(c,feed_dict=placeholder))
打印结果
[[ 8. 5.]
[20. 13.]]
可以看到结果还是一样
注意由于我们在刚开始是定义了占位符的形状。所以我们传入的数据形状必须和占位符的形状保持一致。不然就会报错。