一.人工智能三学派

  • 行为主义:基于控制论,构造感知-动作控制系统
  • 符号主义:基于算数逻辑表达式,把问题先描述为表达式,再进行求解
  • 连接主义:仿生学,模仿神经元连接关系

二.神经网络设计过程

案例:给鸢尾花分类

  • 0:狗尾草鸢尾
  • 1:杂色鸢尾
  • 2:弗吉尼亚鸢尾

如何确定属于哪类鸢尾花?

人们通过经验总结出规律:测量——花萼长,花萼宽,花瓣长,花瓣宽。即可得出类别(比如花萼长>花萼宽,且 花瓣长/花瓣宽>2,则为1杂色鸢尾。

  • 使用if,case语句,就能进行分类。
  • 但是我们不需要进行这么理性的计算,我们在多次见过鸢尾花后,看到鸢尾花就能凭直觉进行分类。神经网络就是这样赋予计算机感性思维,把数据集给搭建好的神经网络结构,网络优化参数得到模型。当有新的特征传入该模型时,能识别出结果。

在该案例中,输入层为4层,输出层为3层。

给神经网络结构喂入数据

例如,喂入一个标签为 0狗尾草鸢尾 的数据时。

会随机给w权重值和b偏置值。

计算过程:

可以看到这时1类的得分最高,很明显是错的,因为我们给的w和b是随机值,得到的结果是随机的。

损失函数

这时我们需要再定义一个损失函数:表示 预测值(y) 和 标准答案(y_) 的距离。

损失函数可以定量判断w、b的优劣。当损失函数最小时,参数是最优解。

常用的一种损失函数——均方误差:

梯度下降

现在,我们的目的是找出一组参数w和b,使损失函数最小

梯度:损失函数对各参数求偏导后的向量。函数梯度下降方向就是函数减小方向。

梯度下降法:沿损失函数梯度下降的方向,寻找损失函数的最小值。

学习率 lr:

  • 是一个超参数,我们自己设置。
  • 过小时,收敛速度十分慢。
  • 过大时,梯度可能最小值附近来回震荡,甚至无法收敛

反向传播

从后向前,逐层求损失函数对每层神经元参数的偏导值,迭代更新所有参数

假如损失函数为:loss=(W+1)² , 对参数求偏导后为2W+2

(如:参数w初始值为5,学习率我们设置为为0.2)

  • 第一次:参数w:5 。 5-0.2*(2*5+2)=2.6
  • 第二次:参数w:2.6 。 2.6-0.2*(2*2.6+2)=1.16
  • 第三次:参数w:1.16 。 1.16-0.2*(2*2.6+2))=0.296
  • 第四次:参数w:0.296 。 ..........
  • .........
  • (最后找到w=-1)

代码利用反向传播找到w=-1

import tensorflow as tf

w = tf.Variable(tf.constant(5, dtype=tf.float32))  # 设置w的随机初始值为5,Variable:可训练
lr = 0.2  # 学习率为0.2

for epoch in range(35):  # 循环迭代35次
    with tf.GradientTape() as tape:
        loss = tf.square(w + 1)      # 假设损失函数是(w+1)^2
    grads = tape.gradient(loss, w)   # .gradient()函数来表示对哪个函数的谁求导
    
    w.assign_sub(lr * grads)         # 对变量自减,即 w -= lr*grads
    print("第{0}次迭代,w是{1:#f},loss是{2:#f}".format(epoch+1, w.numpy(), loss))

可以看到最终找到w=-1,此时损失函数最小,为0.

三.张量生成

Tensor(张量):多维数组

“阶”表示张量的维数

  • 0阶:标量;s = 1
  • 1阶:向量;v = [1, 2, 3]
  • 2阶:矩阵;m = [[1,2,3],[4,5,6],[7,8,9]]
  • n阶:张量;t = [[[[[[....]]]]]]

数据类型

  • tf.int , tf.float ......
    • tf.int32, tf.float32, tf.float64
  • tf.bool
    • tf.constant([True, False])
  • tf.string
    • tf.constant("Hello,world")

如何创建一个张量

一般方法

tf.constant(张量内容, dtype=数据类型)

将numpy数据转换成Tensor数据类型

`tf.convert_to_tensor(数据名, dtype=数据类型)

创建全为0/1/指定数 的张量

  • 创建全为0:tf.zeros(维度)
    • 如:tf.zeros([2.3])
  • 创建全为1:tf.ones(维度)
    • 如:tf.ones(4)
  • 创建全为指定数:tf.fill(维度, 指定值)
    • 如:tf.fill([2, 2], 9)

生成正态分布的随机数

tf.random.normal(维度, mean=均值, stddev=标准差)

生成更集中的随机数 (u±2σ以内):tf.random.truncated_normal(维度, mean=均值, stddev=标准差)

生成均匀分布随机数

tf.random.uniform(维度, minval=最小值, maxval=最大值)

四.TF2常用函数

最大值、最小值、求和

axis=0/1/不指定 :0表示行,1表示列,不指定表示对所有元素

  • tf.cast(张量名, dtype=数据类型) : 强制转换数据类型
  • tf.reduce_min(张量名, [axis=]) : 计算张量维度上元素的最小值
  • tf.reduce_max(张量名, [axis=]) : 计算张量维度上元素的最大值
  • tf.reduce_sum(张量名, [axis=]) : 计算张量维度上元素的总和

可训练变量Variabel

  • tf.Variable(上面创建变量的函数):将变量标记为可训练,被标记的变量在反向传播中记录梯度信息。
    • 如:tf.Variable( tf.constant(张量内容, dtype=数据类型) )

数学运算

  • 对应四则运算:tf.add(),tf.substract(),tf.multiply(),tf.divide()
    • tf.add(张量1, 张量2)
    • 注:只有维度相同的张量才可以做四则运算
  • 平方、次方、开方:tf.square(),tf.pow(),tf.sqrt()
    • tf.square(张量名),tf.pow(张量名, n次方数)
  • 矩阵乘:tf.matmul()

把特征和标签配对的函数

tf.data.Dataset.from_tensor_slices([输入特征, 标签])

注:该函数对tensor格式和numpy格式的数据都可用