变量 和占位符

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

由于zab的矩阵乘法。
但是我们并不知道ab的具体值。==feed_dict={a:a_1,b:b_1}==就是传入ab的值。aa_1bb_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.]]

可以看到结果还是一样

注意由于我们在刚开始是定义了占位符的形状。所以我们传入的数据形状必须和占位符的形状保持一致。不然就会报错。

02-01 08:35