tensorflow2中的基本概念与常用函数

tensorflow2中的基本概念与常用函数

虽然我们在之前学习了如何手动实现神经网络,那样非常易于我么你理解神经网络的原理个结构。但是就“编写一个可用的高效的神经网络“而言,手动编写太过于低效。因此这里我们介绍一下TensorFlow,帮助我们快速搭建神经网络,本篇文章就先介绍一下tensorflow2中的基本概念与常用函数。

1.基本概念

Tensor表示张量,是多维数组、多维列表,用阶表示张量的维数。

阶数 维数 eg
0阶 标量 1
1阶 向量 [1,2,3,…]
2阶 矩阵 [[1,2,3],[4,5,6],…]
n阶 张量 [[[[[…

张量是任意阶数的数组的统称。

TensorFlow 中数据类型包括 32 位整型(tf.int32)、32 位浮点(tf.float32)、64 位 浮点(tf.float64)、布尔型(tf.bool)、字符串型(tf.string)

创建张量

  1. tf.constant(张量内容,dtype=数据类型(可选)),第一个参数表示张量内容, 第二个参数表示张量的数据类型。
import tensorflow as tf a=tf.constant([1,5],dtype=tf.int64)
print(a) #  
print(a.dtype) # 
print(a.shape) # (2,)
  1. 通过函数tf. convert_to_tensor(数据名,dtype=数据类型(可选)),将numpy格式化为Tensor格式。
import tensorflow as tf
import numpy as np
a = np.arange(0, 5)
b = tf.convert_to_tensor( a, dtype=tf.int64 )
  1. 用 tf.zeros(维度)创建全为 0 的张量

  2. tf.ones(维度)创建全为 1 的张量

  3. tf. fill(维度,指定值)创建全为指定值的张量。

其中维度参数部分,如一维则直接写个数,二维用[行,列]表示,多维用[n,m,j…] 表示

  1. 用 tf.random.normal (维度, mean=均值,stddev=标准差)生成正态分布的随机数,默认均值为 0,标准差为 1

  2. 用 tf.random.truncated_normal (维度,mean=均值,stddev=标准差)生成截断式正态分布的随机数,所谓截断式正态分布就是在 (µ - 2σ,u + 2σ ) 之内的随机数,这样的随机数更加集中。

  3. 利用 tf.random.uniform(维度,minval=最小值,maxval=最大值),生成指定维度的均匀 分布随机数,最小、最大值是前闭后开区间。

2.常用函数

  1. tf.cast (张量名,dtype=数据类型)强制将Tensor转换为该数据类型
x1 = tf.constant ([[1.0, 2.0, 3.0],[2.0,4.0,6.0]], dtype=tf.float64)
x2 = tf.cast (x1, tf.int32)
  1. tf.reduce_min(张量名,axis=操作轴)计算张量维度上元素的最小值;利用tf.reduce_max(张量名,axis=操作轴)计算张量维度上元素的最大值。

  2. tf.reduce_mean (张量名,axis=操作轴)计算张量沿着指定维度的平均值,tf.reduce_sum(张量名,axis=操作轴)计算张量沿着指定维度的和。

    如不指定axis,则表示对所有元素进行操作

    x1 = tf.constant ([[1.0, 2.0, 3.0],[2.0,4.0,6.0]], dtype=tf.float64)
    
    print(tf.reduce_max(x1))
    # tf.Tensor(6.0, shape=(), dtype=float64)
    print(tf.reduce_max(x1,axis=0))
    # tf.Tensor([2. 4. 6.], shape=(3,), dtype=float64)
    print(tf.reduce_max(x1,axis=1))
    # tf.Tensor([3. 6.], shape=(2,), dtype=float64)
    
    print(tf.reduce_min(x1))
    # tf.Tensor(1.0, shape=(), dtype=float64)
    
    print(tf.reduce_mean(x1))
    # tf.Tensor(3.0, shape=(), dtype=float64)
    print(tf.reduce_mean(x1,axis=0))
    # tf.Tensor([1.5 3.  4.5], shape=(3,), dtype=float64)
    print(tf.reduce_mean(x1,axis=1))
    # tf.Tensor([2. 4.], shape=(2,), dtype=float64)
    
    print(tf.reduce_sum(x1))
    # tf.Tensor(18.0, shape=(), dtype=float64)
    

    tensorflow2中的基本概念与常用函数_第1张图片

  3. tf.Variable(initial_value,trainable,validate_shape,name)函数可以将 变量标记为“可训练”的,被它标记了的变量,会在反向传播中记录自己的梯度何为我们在之前文章理解误差反向传播&用python实现自动微分里实现的NumberWithGrad一样。

  4. 对应元素的四则运算,只有维度相同的张量才可以做对应元素的四则运算

    1. tf.add()
    2. tf.subtract()
    3. tf.multiply()
    4. tf.divide()
    a = tf.ones([1, 3])
    b = tf.fill([1, 3], 3.)
    print("a:", a)
    print("b:", b)
    # a: tf.Tensor([[1. 1. 1.]], shape=(1, 3), dtype=float32)
    # b: tf.Tensor([[3. 3. 3.]], shape=(1, 3), dtype=float32)
    
    
    print("a+b:", tf.add(a, b))
    print("a-b:", tf.subtract(a, b))
    print("a*b:", tf.multiply(a, b))
    print("b/a:", tf.divide(b, a))
    # a+b: tf.Tensor([[4. 4. 4.]], shape=(1, 3), dtype=float32)
    # a-b: tf.Tensor([[-2. -2. -2.]], shape=(1, 3), dtype=float32)
    # a*b: tf.Tensor([[3. 3. 3.]], shape=(1, 3), dtype=float32)
    #b/a: tf.Tensor([[3. 3. 3.]], shape=(1, 3), dtype=float32
    
  5. 幂次运算。tf.square计算某个张量的平方;tf.pow计算某个张量的n次方;tf.sqrt计算某个张量的开方,这里也都是对应元素的幂次运算

  6. 矩阵乘法。tf.matmul(矩阵 1,矩阵 2)实现两个矩阵的相乘。

    a = tf.ones([3, 2])
    b = tf.fill([2, 3], 3.)
    print("a:", a)
    print("b:", b)
    #a: tf.Tensor(
    #[[1. 1.]
    # [1. 1.]
    # [1. 1.]], shape=(3, 2), dtype=float32)
    #b: tf.Tensor(
    #[[3. 3. 3.]
    # [3. 3. 3.]], shape=(2, 3), dtype=float32)
    
    print("a*b:", tf.matmul(a, b))
    #a*b: tf.Tensor(
    #[[6. 6. 6.]
    # [6. 6. 6.]
    # [6. 6. 6.]], shape=(3, 3), dtype=float32)
    
  7. tf.data.Dataset.from_tensor_slices((输入特征, 标签))切分传入张量的第一维度,生成输入特征/标签对,构建数据集。

    features = tf.constant([12, 23, 10, 17])
    labels = tf.constant([0, 1, 1, 0])
    dataset = tf.data.Dataset.from_tensor_slices((features, labels))
    for element in dataset:
        print(element)
    
    # (, )
    # (, )
    # (, )
    # (, )
    
  8. 计算梯度。tf.GradientTape()函数搭配 with 结构计算损失函数在某一张量处的梯度。

    with tf.GradientTape() as tape:
        x = tf.Variable(tf.constant(3.0))
        y = tf.pow(x, 2)
    grad = tape.gradient(y, x)
    print(grad)
    #tf.Tensor(6.0, shape=(), dtype=float32)
    

    手动计算验证一下,损失函数为y=x2,x当前取值为3,故dy/dx=2x=6,域代码执行结果一致。

  9. enumerate(列表名)函数枚举出每一个元素,并在元素前配上对应的索引号。

    seq = ['one', 'two', 'three']
    for i, element in enumerate(seq):
        print(i, element)
    #0 one
    #1 two
    #2 three
    
    for k,v in enumerate(seq):
        print(k,v)
    #0 one
    #1 two
    #2 three
    
  10. tf.one_hot(待转换数据,depth=几分类)函数实现用独热码表示标签

    classes = 3
    labels = tf.constant([1, 0, 2])  # 输入的元素值最小为0,最大为2
    output = tf.one_hot(labels, depth=classes)
    print("result of labels1:", output)
    # tf.Tensor([[0. 1. 0.] [1. 0. 0.] [0. 0. 1.]], shape=(3, 3), dtype=float32)#
    
  11. tf.nn.softmax( )函数使前向传播的输出值符合概率分布。只有符合概率分布才能与热码形式的标签作比较。

  12. assign_sub 对参数实现自更新。

    x = tf.Variable(4)
    x.assign_sub(1)
    print("x:", x)  # 4-1=3
    # 
    
  13. tf.argmax (张量名,axis=操作轴)返回张量沿指定维度最大值的索引

    test = np.array([[1, 9, 3], [6, 3, 4], [5, 4, 3], [8, 7, 2]])
    print("test:\n", test)
    print("每一列的最大值的索引:", tf.argmax(test, axis=0))  # 返回每一列最大值的索引
    print("每一行的最大值的索引", tf.argmax(test, axis=1))  # 返回每一行最大值的索引
    
    # 每一列的最大值的索引: tf.Tensor([3 0 1], shape=(3,), dtype=int64)
    # 每一行的最大值的索引 tf.Tensor([1 0 0 0], shape=(4,), dtype=int64)
    

返回每一列最大值的索引

print("每一行的最大值的索引", tf.argmax(test, axis=1))  # 返回每一行最大值的索引

# 每一列的最大值的索引: tf.Tensor([3 0 1], shape=(3,), dtype=int64)
# 每一行的最大值的索引 tf.Tensor([1 0 0 0], shape=(4,), dtype=int64)
```

你可能感兴趣的:(深度学习,python,深度学习,tensorflow,python)