梯度下降学习算法入门

梯度下降学习算法入门

  • tensorflow基础
    • 数据类型
    • 如何创建一个Tensor
    • 常用函数
  • ## 常用数学运算
  • 代码分析
    • 实验目标
    • tensorflow梯度下降程序中使用的方法
  • 完整代码

tensorflow基础

数据类型

tf.int tf.float
tf.int32 , tf.float32 , tf.float64

tf.bool
tf.constant([True,False])

tf.string
tf.constant(“Hello World!”)

如何创建一个Tensor

  • a=tf.constant(张量内容,dtype=数据类型(可选))
    通过a.dtype和a.shape访问张量的数据类型和形状

  • 将numpy的数据类型转换为Tensor数据类型
    tf.convert_to_tensor(数据名,dtype=数据类型(可选))

  • 创建全为0的张量
    tf.zeros(维度)

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

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

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

  • 生成截断式正态分布的随机数
    tf.random.truncated_normal(维度,mean=均值,stddev=标准差)

  • 生成均匀分布随机数 [minval,maxval)
    tf.random.uniform(维度,minval=最小值,maxval=最大值)

常用函数

  • 强制tensor转换为该数据类型
    tf.cast(张量名,dtype=数据类型)

  • 计算张量维度上元素的最小值
    tf.reduce_min(张量名)

  • 计算张量维度上元素的最大值
    tf.reduce_max(张量名)

  • tf.Variable()将变量标记为“可训练”,被标记的变量会在反向传播中记录梯度信息。在神经网络训练中,常用该函数标记待训练参数。

  • 切分传入张量的第一维度,生成输入特征/标签对,构建数据集data=tf.data.Dataset.from_tensor_slices((输入特征,标签))

  • with结构记录计算过程,gradient求出张量的梯度
    with tf.GradientTape() as tape:
    若干个计算过程
    grad=tape.gradient(函数,对谁求导)
    例如:

with tf.GradientTape() as tape:
    w=tf.Variable(tf.constant(3.0))
    loss=tf.pow(w,2)
grad=tape.gradient(loss,w)
print(grad)

运行结果:

tf.Tensor(6.0, shape=(), dtype=float32)
  • enumerate是python的内建函数,它可以遍历每个元素(如列表、元组或字符串),组合为:索引 元素,常在for循环中使用
    enumerate(列表名)
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
    print(i, element)

运行结果

0 one
1 two
2 three
  • 独热编码:在分类问题中,常用独热码做标签,标记类别:1表示是,0表示非。

  • tf.nn.softmax(x) 使n分类的n个输出(y0,y1,y3, yn-1)输出符合概率分布

  • assign_sub() 在调用这个函数之前首先要将变量定义为可训练(可自更新)

  • 返回张量沿指定维度最大值的索引tf.argmax(张量名,axis=操作轴)axis=0表示每一列,axis=1表示每一行。

## 常用数学运算

  • 对应元素四则运算(维度相同):tf.add, tf.subtract, tf.multiply, tf.divide
  • 平方、次方与开方:tf.square, tf.pow, tf.sqrt
  • 矩阵乘法:tf.matmul

代码分析

实验目标

比较不同学习率对于收敛结果的影响。

tensorflow梯度下降程序中使用的方法

tf.Variable() 变量函数
tf.constant() 常量函数
tf.GradientTape() 求导算法
tf.square() 平方函数; 用于构造loss函数
tf.Variable().assign_sub() 变量自减用于更新变量的值
tf.GradientTape().gradient() 求导函数;求出斜率用于更新变量

完整代码

import tensorflow as tf

w = tf.Variable(tf.constant(5, dtype=tf.float32))
lr = 0.2
epoch = 40

for epoch in range(epoch):  # for epoch 定义顶层循环,表示对数据集循环epoch次,此例数据集数据仅有1个w,初始化时候constant赋值为5,循环40次迭代。
    with tf.GradientTape() as tape:  # with结构到grads框起了梯度的计算过程。
        loss = tf.square(w + 1)
    grads = tape.gradient(loss, w)  # .gradient函数告知谁对谁求导

    w.assign_sub(lr * grads)  # .assign_sub 对变量做自减 即:w -= lr*grads 即 w = w - lr*grads
    print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss))

# lr初始值:0.2   请自改学习率  0.001  0.999 看收敛过程
# 最终目的:找到 loss 最小 即 w = -1 的最优参数w

你可能感兴趣的:(python,tensorflow,python,tensorflow,人工智能)