可理解为一个 n 维数组,所有类型的数据,包括标量、矢量和矩阵等都是特殊类型的张量,张量并没有真正保存数字,它保存的是计算过程
张量(tensor)的属性——维数(阶)、形状和数据类型
Tensor("name", shape=(), dtype=int32)
张量的维数来被描述为阶,是张量维数的一个数量描述。
阶数 | 数学实例 |
---|---|
0阶 | 标量 |
1阶 | 1 维数组(向量) |
2阶 | 2维数组(矩阵,数据表) |
3阶 | 3维数组(数据立体) |
三个术语描述张量的维度:阶(rank)、形状(shape)、维数(dimension number)
n(n>0)阶张量构成元素是n-1阶张量
阶 | 形状 | 维数 | 例子 |
---|---|---|---|
0 | () | 0-D | 4 |
1 | (D0) | 1-D | [1,2] |
2 | (D0,D1) | 2-D | [[1,2],[2,3]] |
3 | (D0,D1,D2) | 3-D | [[[1,2],[3,4]],[[1,2],[3,4]]] |
n | (D0,D1,…Dn-1) | n-D | … |
TensorFlow支持14种不同类型
实数:tf.float32, tf.float64
整数:tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8
布尔:tf.bool
复数:tf.complex64, tf.complet128
不带小数点的数会被默认为int32
带小数点的数会被默认为float32
常量是其值不能改变的张量。。
a=tf.constant([[1],[2]],name='a')#常量
当一个量在会话中的值需要更新时,使用变量来表示。变量在使用前需要被显示初始化。例如,在神经网络中,权重需要在训练期间更新,可以通过将权重声明为变量来实现。
与传统编程语言不同,TensorFlow中的变量定义后,一般无需人工赋值,系统会根据算法模型,训练优化过程中自动调整变量对应的数值。在机器学习模型训练时更能体会,比如权重Weight变量w,经过多次迭代,会自动调整其值。
在TensorFlow中必须进行初始化操作
创建语句:
name_varible = tf.Variable(value, name)
注意:V是大写的
个别变量初始化:init_op = name_variable.initializer()
所有变量初始化:init_op = tf.global_variables_initializer()
def tensor_test():
a=tf.Variable([1,2,3],name='a')
b=tf.Variable([4,5,6],name='b')
s=tf.add(a,b,name='SUM')
with tf.Session() as sess:
#所有变量初始化
init = tf.global_variables_initializer()
sess.run(init)# 初始化完成
# 单个变量初始化
# sess.run(a.initializer)
# sess.run(b.initializer)
print(sess.run(s))
只有init = tf.global_variables_initializer()一句并未实现变量初始化,它只是定义了一个静态的操作节点,必须利用会话的run()函数去执行这个操作,才能真正实现变量的初始化操作
amount = tf.Variable(0, name='amount', trainable=False)
如果希望自己定义的变量不参加训练,那么需要在定义变量时将参数trainable设置为False。
update_op = tf.assign(variable, new_value)
特殊情况下需要人工更新的,可用变量赋值语句:
TensorFlow中的Variable变量类型,在定义时需要初始化,但有些变量定义时并不知道其数值,只有当真正开始运行程序时,才由外部输入。
需要注意的是,占位符不包含任何数据,因此不需要初始化它们。
在会话中,占位符可以使用 feed_dict 馈送数据。feed_dict是一个字典,在字典中需要给出每一个用到的占位符的取值。
例如在训练神经网络时需要每次提供一个批量的训练样本,如果每次迭代选取的数据要通过常量表示,那么TensorFlow 的计算图会非常大。因为每增加一个常量,TensorFlow 都会在计算图中增加一个结点。所以说拥有几百万次迭代的神经网络会拥有极其庞大的计算图,而占位符却可以解决这一点,它只会拥有占位符这一个结点。
如果构建了一个包含placeholder操作的计算图,当在session中调用run方法时,placeholder占用的变量必须通过feed_dict参数传递进去,否则会报错。
使用 tf.placeholder() 创建占位符 ,在 session.run() 过程中再投递数据
占位符定义格式
tf.placeholder(dtype,shape=None,name=None)
注意:使用feed_dict设置tensor的时候,需要你给出的值类型与占位符定义的类型相同
举例
def PlaceHolder_test():
a=tf.placeholder(tf.int32,shape=(3,),name='a')
b=tf.placeholder('int32',shape=(3,),name='b')
add_op=tf.add(a,b,name='ADD')
mul_op=tf.multiply(a,b,name='MUL')
sub_op=tf.subtract(a,b,name='sub')
with tf.Session() as sess:
print(sess.run([add_op,mul_op,sub_op],feed_dict={a:[3,2,4],b:[1,2,3]}))
with tf.summary.FileWriter('./log',sess.graph) as writer:
writer.flush()
运行结果:[array([4, 4, 7]), array([ 3, 4, 12]), array([2, 0, 1])]
def variable_test():#变量赋值输出1-10
value=tf.Variable(0,name='value')
one=tf.constant(1,name='one')
new_value=tf.add(value,one,name='new_value')
update_op=tf.assign(value,new_value)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for _ in range(10):
#for _ in range(n) 一般仅仅用于循环n次,
# 不用设置变量,用 _ 指代临时变量,只在这个语句中使用一次
sess.run(update_op)
print(value.eval(),end=' ')
with tf.summary.FileWriter('./log',sess.graph) as writer:
writer.flush()
def Iteration_test():#1-100的累加和
value=tf.Variable(0,name='value')
# one=tf.constant(1,name='one')
# new_value=tf.add(value,one)
# update_op=tf.assign(value,new_value,name='update_op')
update_op=tf.assign(value,tf.add(value,1),name='update_op')
Sum=tf.Variable(0,name='sum')
SUM_OP=tf.assign(Sum,tf.add(Sum,value))
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for _ in range(100):
sess.run(update_op)
sess.run(SUM_OP)
print(Sum.eval())
with tf.summary.FileWriter('./log',sess.graph) as writer:
writer.flush()
上述程序计算流程分为两部分:
第一部分:迭代求取新值
第二部分:在迭代过程进行累加和 (sum=sum+new_value)
TensorFlow学习笔记01:TensorFlow入门
TensorFlow教程:TensorFlow快速入门教程(非常详细)