目录

1、神经网络

2、TensorFlow

3、在TensorFlow中构建神经网络

4、模型训练代码流程

【逻辑回归训练模型】

【神经网络训练模型】

对前面的内容进行补充:

损失函数和成本函数是一个递进的关系。

损失函数是针对单个训练样本,成本函数是针对全局的训练样本。梯度下降的计算逻辑——分别对成本函数的 w 和 b 偏导,而计算这个偏导时,需要先用到单个样本的损失。

“先借损失算成本,再对成本求偏导”

1.【正向计算】阶段:当前的参数w和b,对每个样本计算预测值y^​(i),再通过损失函数计算每个样本的误差L(y^​(i),y(i)),并聚合为全局的成本函数J(w,b)—— 这一步是 “从参数到成本的正向传递”,为后续优化提供 “误差基准”。

2.【反向求导与参数更新】阶段:梯度下降的核心是通过反向求导,计算成本函数J(w,b)分别对w和b的偏导数;计算这两个偏导时,必然依赖单个样本损失的链式求导。

例如对w的偏导​,需先求出每个样本损失对w的局部导数,再平均得到全局梯度)。

3.【参数迭代优化】阶段:得到​和后,按 “梯度反方向” 更新参数

α为学习率),让成本函数J(w,b)向最小值靠近。

通过 “正向算成本→反向求梯度→迭代更参数” 的循环,模型会逐步找到使成本函数最小化的
w和b,此时模型在整个训练集上的全局误差最小,完成从 “初始参数” 到 “最优参数” 的优化过程。

#############################################################################

1、神经网络

特点:可以自行学习隐藏层的特征。

上图为面部识别的例子,输入层为:1000x1000像素网络(像素强度矩阵),将其转为10000000的特征向量为列向量作为输入层

上图为神经网络的工作过程,每个隐藏层中包含多个神经元,第一个隐藏层识别边缘短小的线条;第二个隐藏层识别眼鼻等面部细节;第三层识别整个面部并进行对照;最后输出层进行识别结果输出。整个过程自动进行学习。

激活函数引言

上图为相对复杂的神经网络,其中每个神经元都要对上一层输出的激活值(向量)进行处理,即通过激活函数进行,本次使用的激活函数为sigmoid函数(g(z)=wa+b)

【正向传播】:激活函数只是用于输出这些激活值的函数,各层的每个神经元都经过激活函数的处理输出一个激活值,每层的全部激活值集合起来作为下一层的输入值。

在数字识别代码中举例说明此过程:(输入值为像素值的列向量x)

x = np.array([[0.0,...245,...240,...0]])这行代码中用到了两个方括号,表示这是一个一行 很多列的矩阵,里面的方括号[]表示一行,外面的方括号[]表示所有行合起来的矩阵(为多维矩阵)。

x = np.array([[0.0,...245,...240,...0]])

# Dense表示全连接,第一个隐藏层有25个神经元(单元),每个神经元的激活函数为sigmoid

layer_1 = Dense(units = 25,activation = 'sigmoid') 
a1 = layer_1(x)

# Dense表示全连接,第二个隐藏层有15个神经元(单元),每个神经元的激活函数为sigmoid

layer_2 = Dense(units = 15,activation = 'sigmoid')
a2 = layer_2(a1)

# Dense表示全连接,第三个隐藏层有1个神经元(单元),每个神经元的激活函数为sigmoid

layer_3 = Dense(units = 1,activation = 'sigmoid')
a3 = layer_3(a2)

# 判断最后输出的值
if a3 >= 0.5
    yhat = 1
else:
    yhat = 0

2、TensorFlow

TensorFlow 和 NumPy 都是 Python 中用于数值计算的重要工具。

两者都以多维数组(张量) 作为核心数据结构。

两者常结合使用:用 NumPy 进行数据加载和预处理,再将数据传入 TensorFlow 构建的模型中训练和推理。

3、在TensorFlow中构建神经网络

下面我们将第一节的例子用TensorFlow进行细化:

# 构建由三个隐藏层构成的神经网络
layer_1 = Dense(units = 25,activation = "sigmoid")
layer_2 = Dense(units = 15,activation = "sigmoid")
layer_3 = Dense(units = 1,activation = "sigmoid")

model = Sequential([layer_1, layer_2, layer_3])
model.compile(...) # 配置模型的训练参数,必须指定的关键参数包括:
                   # optimizer:优化器(如 adam、sgd),用于更新模型参数。
                   # loss:损失函数(如 binary_crossentropy 用于二分类,mse 用于回归),衡量预测值与真实值的差距。
                   # metrics:评估指标(如 accuracy 准确率),用于监控训练过程。

# #####################################################################
# 也可以简化为
import tensorflow as tf
from tensorflow.keras import Sequential   #用于按顺序堆叠神经网络层
from tensorflow.keras.layers import Dense  #全连接层类

model = Sequential([
    Dense(units = 25,activation = "sigmoid"), 
    Dense(units = 15,activation = "sigmoid"),
    Dense(units = 1,activation = "sigmoid")
                  ])
model.compile(...)


# 将训练的数据集导入
x = np.array([[0...,245,...,17]
              [0...,200,...,184]])
y = np.array([1,0]) # y表示训练数据x的标签数据是一个一维数组,因此只有一组方括号[],即对应x的第一行数据为1,x的第二行数据为0

# 进行模型训练
model.fit(x,y)
# 对新值进行模型预测
model.predict(x_new)

前向传播的具体代码过程:

其中w1_1的第一个数字代表第几个隐藏层,第二个参数代表该隐藏层中的第几个参数

将前向传播的过程封装为函数可得到:

import numpy as np

# 定义sigmoid激活函数
def g(z):
    return 1 / (1 + np.exp(-z))


# 定义全连接函数
def dense(a_in,W,b): # a_in为上一层输出的激活值,作为本次的输入值,b为本隐藏层的偏置,W大写的为权重矩阵(为本隐藏层中所有权重w构成的矩阵,每列对应一个权重w向量值)
    units = W.shape[1] # 大写的W.shape表示矩阵的形状(本例为2行3列=2x3),W.shap[1]表示为列数3,及单元数/神经元数3个,W.shap[0]表示为行数2,W 的维度是 (输入特征数, 神经元数)
    
    a_out = np.zeros(units)  # 设置输出值,初始化为3个单元均为0的向量
    for j in range(units): # 0 1 2
        w = W[:,j] # 按列遍历 , 取第j个神经元的权重向量
        z = np.dot(w,a_in) + b[j] # 列向量w与输入向量值点乘+b,计算加权和+偏置
        a_out[j] = g(z) # g()为sigmoid函数
    return a_out


 # 假设已有预定义的权重和偏置参数(W1,b1,W2,b2,W3,b3,W4,b4)
def sequential(x):
    a1 = dense(x,W1,b1) # W为大写的w列向量组成的矩阵,a1为第一层输出向量值
    a2 = dense(a1,W2,b2)# a2为第二层输出向量值
    a3 = dense(a2,W3,b3)# a3为第三层输出向量值
    a4 = dense(a3,W4,b4)# a4为第四层输出向量值
    f_x = a4
    return f_x

对上述代码进行优化:用矩阵乘法实现全连接代码

AT = np.array([[200, 17]]) # 双方括号表明为二维矩阵,AT表明是A矩阵的转置
W = np.array([[1, -3, 5]    # W为权重矩阵
              [-2, 4, -6]]) 
b = np.array([[1, 1, 2]])    # b为偏置矩阵

def dense(AT, W, b):
    z = np.matmul(AT,W) + b  # matmul为numpy的矩阵乘法
    a_out = g(z) #g()为sigmoid激活函数
    return z_out
 

4、模型训练代码流程

逻辑回归和神经网络下的TensorFlow的对比,如下图:

【逻辑回归训练模型】

1.前向传播得到预测值fw,b(x)

2.计算损失loss函数和成本cost函数

损失函数:单个训练样本的函数

成本函数:整个训练集上的损失函数的平均值

3.使用梯度下降来最小化成本函数

更新参数w和b来实现最小化成本函数

【神经网络训练模型】

1.前向传播得到输出值

2.计算损失loss函数和成本cost函数

编译模型并指定使用的损失函数(本例为二分类模型——二元交叉熵损失函数)

这里的损失函数仍与逻辑回归的损失函数相同

不过要在开头加入

# 交叉熵损失函数
from tensorflow.keras.losses import BinaryCrossentropy

# 均方误差损失函数
from tensorflow.keras.losses import MeanSquaredError

指定损失函数后,模型会直接计算出神经网络的成本函数

当指定为loss:二元交叉熵损失函数时(逻辑回归问题)

                        ——成本函数为cost:

当指定为loss:均方误差损失函数(线性回归问题)

                        ——成本函数为cost:

这里的成本函数为权重W矩阵和偏置B矩阵

3.反向传播来最小化成本函数

这步的操作封装在TensorFlow中,直接调用model.fit()函数可直接使用:(迭代100次)

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐