TensorFlow学习笔记--第三节张量(tensor)及其定义方法

在TensorFlow中,所有的数据通过张量的形式来表示

1张量及属性:

可理解为一个 n 维数组,所有类型的数据,包括标量、矢量和矩阵等都是特殊类型的张量,张量并没有真正保存数字,它保存的是计算过程

张量(tensor)的属性——维数(阶)、形状和数据类型

Tensor("name", shape=(), dtype=int32)

1.1维数(阶)

张量的维数来被描述为阶,是张量维数的一个数量描述。

阶数数学实例
0阶标量
1阶1 维数组(向量)
2阶2维数组(矩阵,数据表)
3阶3维数组(数据立体)

1.2 形状

三个术语描述张量的维度:阶(rank)、形状(shape)、维数(dimension number)
n(n>0)阶张量构成元素是n-1阶张量

形状维数例子
0()0-D4
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

1.3数据类型

TensorFlow支持14种不同类型

实数:tf.float32, tf.float64
整数:tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8
布尔:tf.bool
复数:tf.complex64, tf.complet128

不带小数点的数会被默认为int32
带小数点的数会被默认为float32

TensorFlow 支持以下三种类型的张量:

1.常量

常量是值不能改变张量。。

a=tf.constant([[1],[2]],name='a')#常量

2.变量

当一个量在会话中的值需要更新时,使用变量来表示。变量在使用前需要被显示初始化。例如,在神经网络中,权重需要在训练期间更新,可以通过将权重声明为变量来实现。
与传统编程语言不同,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)

特殊情况下需要人工更新的,可用变量赋值语句:

3.占位符

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])]
在这里插入图片描述

张量定义方法举例

在这里插入图片描述

张量阶次及对应形状(shape)

在这里插入图片描述

操作实例1:输出1-10

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()

运行结果:1 2 3 4 5 6 7 8 9 10
在这里插入图片描述

操作实例2:计算1-100累计和

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)

运行结果:5050
在这里插入图片描述

传送门:

TensorFlow学习笔记01:TensorFlow入门
TensorFlow教程:TensorFlow快速入门教程(非常详细)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值