5.吴恩达机器学习—神经网络的基础使用

news/2025/11/4 12:40:20/文章来源:https://www.cnblogs.com/gccbuaa/p/19189835

目录

一、神经网络基本概念

1.什么是神经网络

2.激活向量计算与前向传播算法

二、TensorFlow

1.TensorFlow和Numpy中数据表示对比

2.向前传播和学习实现

1.原始写法

2.在TensorFlow中简化写法

3.从头实现向前传播

三、使用TensorFlow实现线性回归和逻辑回归

1.实现不带激活函数的线性回归

2.实现带激活函数的逻辑回归

四、初步实现一个神经网络模型

1.数据归一化

2.增加数据

3.实现神经网络层

4.使用Numpy实现隐藏层函数

五、矩阵-矩阵运算实现隐藏层函数


一、神经网络基本概念

1.什么是神经网络

  • 神经网络由三大部分组成,输入层,中间层(隐藏层),输出层,我们将输入层简化为向量X,它是一个特征向量;隐藏层产生的结果简化为向量a,它叫做激活向量,隐藏层不止一层;输出层就是最后神经网络预结果的概率,也叫最终激活值最终预测;
  • 神经网络最显著的特点是,当你进行训练时候,不必知道隐藏层的特征有哪些,在训练神经网络时,它会自己寻找并进行训练

2.激活向量计算与前向传播算法

  • sigmoid函数就是激活函数之一,我们把输入层向量X规定为

  • 前向传播算法就是指当你计算隐藏层时候,你会从输入层开始向右一层一层进行计算。同时还有反向传播算法,这将在后文提及

二、TensorFlow

1.TensorFlow和Numpy中数据表示对比

  • x = np.array([[200,17]]) 这会得到一个 1x2的二维矩阵 [200 17]
  • x = np.array([[200],[17]]) 这会得到一个 1x2的二维矩阵

  • 而在之前的线性回归和逻辑回归中,我们经常使用x = np.array([200,17]),这只会的到一个一维向量
  • 在TensorFlow中,我们是通过矩阵而不是一维数组来表示数据,这会使得TensorFlow在内部计算上更高效

2.向前传播和学习实现

1.原始写法

这是一种显示的书写方式,直接展现了每一层的相关信息,逐层的前向传播计算

x = np.array([[200.0,17.0]])
layer_1 = Dense(units = 3,activation="sigmoid")
a1 = layer_1(x)
layer_2 = Dense(units = 1,activation="sigmoid")
a2 = layer_2(a1)

2.在TensorFlow中简化写法

# 隐藏层定义
layer_1 = Dense(units = 3,activation="sigmoid")
layer_2 = Dense(units = 1,activation="sigmoid")
model = Sequential([layer_1,layer_2])
# 数据定义
x = np.array([[200.0,17.0],[120.0,5.0],[425.0,20.0],[212.0,18.0]])
y = np.array([1,0,0,1])
# 模型训练
model.compile(...) # 在后文中会解释如何使用
model.fit(x,y)
# 模型预测
model.predict(x_new)

更简化的写法是

# 将以下代码
layer_1 = Dense(units = 3,activation="sigmoid")
layer_2 = Dense(units = 1,activation="sigmoid")
model = Sequential([layer_1,layer_2])
# 修改为
model = Sequential([Dense(units = 3,activation="sigmoid"),Dense(units = 1,activation="sigmoid")
])

3.从头实现向前传播

  1. 这是我们要使用的w参数,在定义时候,使用以下定义,将其定义为2x3的矩阵

  1. 然后是b参数的定义和实现

  1. 然后定义初始的输入层,也就是a0

  1. 实现密集层函数Dense(),在前文有所提及

  • units表示的是该层中的单元数
  • a_out初始化定义为一个与units相同数量的0数组,表示我们需要使用到的激活函数的个数
  • 接下来通过循环实现
    • w = W[:,j] 表示是取得w的第一列数据,也就是我们的w1
    • z = np.dot(w,a_in)+ b[j] 和 a_out[j] = g(z) 计算的是最后通过激活函数计算要输出给下一层的激活值,激活函数在外部定义,不一定是sigmoid函数
  1. 密集函数顺序连接实现

  • 直接按照顺序实现每一层的激活值的计算,并进行向前传播,最后得到输出层的最后结果

三、使用TensorFlow实现线性回归和逻辑回归

Tips:Sequential model 官方源码

1.实现不带激活函数的线性回归

# 构建的数据集是二维矩阵
X_train = np.array([[1.0], [2.0]], dtype=np.float32)           #(size in 1000 square feet)
Y_train = np.array([[300.0], [500.0]], dtype=np.float32)       #(price in 1000s of dollars)
# 实现隐藏层,设置单元数为1,激活函数就是普通的线性函数
linear_layer = tf.keras.layers.Dense(units=1, activation = 'linear', )
# 索引操作会降维,所以当我们单独取出X_train[0]需要进行重塑为1x1的矩阵
# 如果直接使用X_train,便不需要进行重塑
a1 = linear_layer(X_train[0].reshape(1,1))
# 设置权重和偏置,注意w参数也是矩阵
set_w = np.array([[200]])
set_b = np.array([100])
linear_layer.set_weights([set_w, set_b])
# 比较使用TensorFlow和初始实现模型,利用X的某个数据
# 来和之前实现的模型进行比较
a1 = linear_layer(X_train[0].reshape(1,1))
print(a1)
alin = np.dot(set_w,X_train[0].reshape(1,1)) + set_b
print(alin)

2.实现带激活函数的逻辑回归

# 构建的数据集是二维矩阵
X_train = np.array([0., 1, 2, 3, 4, 5], dtype=np.float32).reshape(-1,1)  # 2-D Matrix
Y_train = np.array([0,  0, 0, 1, 1, 1], dtype=np.float32).reshape(-1,1)  # 2-D Matrix
# 获取Y_train为1的数据,或者为0的数据
pos = Y_train == 1
neg = Y_train == 0
X_train[pos]
# 使用Sequential创建一个线性堆叠的神经网络模型
model = Sequential([tf.keras.layers.Dense(1, input_dim=1,  activation = 'sigmoid', name='L1')]# 该层只有一个神经单元,输入数据的特征维度为 1,使用 sigmoid 激活函数,该层的名称是L1
)
# 定义隐藏层
logistic_layer = model.get_layer('L1')
# 设置权重和偏置
set_w = np.array([[2]])
set_b = np.array([-4.5])
logistic_layer.set_weights([set_w, set_b])
# 进行对比
a1 = model.predict(X_train[0].reshape(1,1))
print(a1)
alog = sigmoidnp(np.dot(set_w,X_train[0].reshape(1,1)) + set_b)
print(alog)

四、初步实现一个神经网络模型

# 加载数据
X,Y = load_coffee_data();

1.数据归一化

在前文中我们已经知道了数据归一化的相关内容,进行归一化之后,将权重拟合到数据的过程会进行得更快,数据中的每个特征都被归一化到相似的范围。下面的程序使用了Keras归一化层,他有以下步骤:

  • 创建一个“归一化层”,注意,此处应用的并非你模型中的一个层。
  • “适配”数据,这会学习数据集的均值和方差并在内部保存这些值。
  • 归一化数据,对任何利用所学模型的未来数据应用归一化非常重要。
norm_l = tf.keras.layers.Normalization(axis=-1)
norm_l.adapt(X)  # learns mean, variance
Xn = norm_l(X)

2.增加数据

# 将Xn数组在第一个维度复制1000次,第二个维度复制1次(保持不变)
# 一行为一个数据,一列是数据中的特征数
# 增加数据规模,并没有增加数据的特征,所以对第一个维度复制1000次
# 第一个维度就是数据量
Xt = np.tile(Xn,(1000,1))
Yt= np.tile(Y,(1000,1))
print(Xt.shape, Yt.shape)

3.实现神经网络层

网络是由两层具有sigmoid激活函数层构成

tf.random.set_seed(1234)
model = Sequential([# 指定了输入的预期形状# 这使得TensorFlow能够在此处确定权重和偏差参数的大小# 在实际应用中可以省略,model.fit中输入指定数据时候# 会确定参数大小tf.keras.Input(shape=(2,)),# 设计两层网络,第一个参数表示层中单元数# 第二个表示层中的激活函数Dense(3, activation='sigmoid', name = 'layer1'),Dense(1, activation='sigmoid', name = 'layer2')]
)
model.summary()
# 使用model.summary()可以得到网络的一些基本情况
# 使用compile和fit运行梯度下降函数,进行数据拟合
# 之后的内容中会进行详细介绍
model.compile(loss=tf.keras.losses.BinaryCrossentropy(),optimizer=tf.keras.optimizers.Adam(0.001),
)
model.fit(X,y,epochs=20
)

4.使用Numpy实现隐藏层函数

def my_dense(a_in, W, b, g):"""Computes dense layerArgs:a_in (ndarray (n, )) : Data, 1 example 输入数据W    (ndarray (n,j)) : Weight matrix, n features per unit, j unitsb    (ndarray (j, )) : bias vector, j units  偏置g    activation function (e.g. sigmoid, relu..)激活函数Returnsa_out (ndarray (j,))  : j units"""units = W.shape[1] # 获取该层的单元数a_out = np.zeros(units) # 创建基于单元数的维度的输出矩阵# 循环计算每一个单元for j in range(units):# W[:,j]表示获取W的列向量# 根据之前的计算公式,进行计算z = np.dot(a_in,W[:,j]) + b[j]# 最后使用激活函数a_out[j] = g(z)return(a_out)
# 使用以下函数一次创建三层神经网络
def my_sequential(x, W1, b1, W2, b2, W3, b3):a1 = my_dense(x,  W1, b1, sigmoid)a2 = my_dense(a1, W2, b2, sigmoid)a3 = my_dense(a2, W3, b3, sigmoid)return(a3)

五、矩阵-矩阵运算实现隐藏层函数

关键函数:np.matmul(),这个函数可以实现矩阵的运算,一行和一列相乘,但是最后得到的是一个矩阵

如果只有一个输入元素

x = X[0].reshape(-1,1)         # column vector (400,1)
z1 = np.matmul(x.T,W1) + b1    # (1,400)(400,25) = (1,25)
a1 = sigmoid(z1)
print(a1.shape)

拓展到一般情况,X和W矩阵运算

def my_dense_v(A_in, W, b, g):"""Computes dense layerArgs:A_in (ndarray (m,n)) : Data, m examples, n features eachW    (ndarray (n,j)) : Weight matrix, n features per unit, j unitsb    (ndarray (j,1)) : bias vector, j unitsg    activation function (e.g. sigmoid, relu..)ReturnsA_out (ndarray (m,j)) : m examples, j units"""Z = np.matmul(A_in,w) + bA_out = g(z)return(A_out)
# 测试代码
X_tst = 0.1*np.arange(1,9,1).reshape(4,2) # (4 examples, 2 features)
# X_tst =
# [[0.1 0.2]
#  [0.3 0.4]
#  [0.5 0.6]
#  [0.7 0.8]]表示有 4 个样本,每个样本 2 个特征。
# 一行为一个样本
W_tst = 0.1*np.arange(1,7,1).reshape(2,3) # (2 input features, 3 output features)
# W_tst =
# [[0.1 0.2 0.3]
#  [0.4 0.5 0.6]]表示 权重矩阵,从 2 输入特征 → 3 输出单元。
# 一列为一个w
b_tst = 0.1*np.arange(1,4,1).reshape(1,3) # (3 features, 1)
# b_tst =
# [[0.1 0.2 0.3]]表示 偏置向量,长度为 3,对应输出层的 3 个单元。
A_tst = my_dense_v(X_tst, W_tst, b_tst, sigmoid)
print(A_tst)
# 同4.4代码
def my_sequential_v(X, W1, b1, W2, b2, W3, b3):A1 = my_dense_v(X,  W1, b1, sigmoid)A2 = my_dense_v(A1, W2, b2, sigmoid)A3 = my_dense_v(A2, W3, b3, sigmoid)return(A3)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/955567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端三剑客——javascript内置对象与其方法

大纲:1.对象创建的常用3种方法 引用/新增属性方法2.内置对象及其常见方法NumberMathDateStringArray对象与数组的解包操作以及在函数中的运用JSONconsole对象创建的方法对象创建的常用三种方法//方法一 直接创建有…

2025 年 11 月 PCD 铣刀厂家推荐排行榜,金刚石铣刀,聚晶金刚石铣刀,超硬刀具,高精度 PCD 铣刀公司推荐

2025 年 11 月 PCD 铣刀厂家推荐排行榜:金刚石铣刀与超硬刀具的技术演进与选购指南 随着制造业向高精度、高效率方向不断发展,聚晶金刚石(PCD)铣刀作为超硬刀具的重要类别,在航空航天、精密模具、电子零部件等领域…

2025 年 11 月平面铣刀厂家推荐排行榜,钨钢平面铣刀,合金平面铣刀,数控平面铣刀,高精度平面铣刀公司推荐

2025 年 11 月平面铣刀厂家推荐排行榜 在精密制造领域,平面铣刀作为数控加工的核心工具,其性能直接影响加工效率和产品质量。随着制造业向高精度、高效率方向发展,钨钢平面铣刀、合金平面铣刀、数控平面铣刀等产品的…

2025 年 11 月侧铣刀厂家推荐排行榜,钨钢侧铣刀,不锈钢侧铣刀,铝合金侧铣刀,高硬度侧铣刀公司推荐

2025 年 11 月侧铣刀厂家推荐排行榜:钨钢、不锈钢、铝合金及高硬度侧铣刀权威指南 在精密加工领域,侧铣刀作为关键切削工具,其性能直接影响加工效率与成品质量。随着制造业向高精度、高效率方向发展,对侧铣刀的技术…

2025年11月适合初中生的学习机品牌排行:市场热销榜全维度评价

进入初中,学科陡增、题型翻新、时间被作业和补习班切割得七零八落,家长最怕“盲目刷题”和“哑巴英语”同时出现。一台能把“精准练”和“听说读写”一次打包的学习机,成为不少家庭双减后的新刚需。工信部《2024在线…

《算法闯关指南:优选算法--滑动窗口》--15.串联所有单词的子串,16.最小覆盖子串 - 实践

《算法闯关指南:优选算法--滑动窗口》--15.串联所有单词的子串,16.最小覆盖子串 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

2025年11月适合初中生的学习机品牌评测:五款主流机型横向对比

孩子升入初中,学科陡增、难度陡升,家长最焦虑的莫过于“课上听懂了,回家不会写”“题海战术耗时低效”。一台能把校内教材、校外拓展、错题管理、AI精准练一次打包的学习机,成为不少家庭双十一清单里的刚需。教育部…

2025年11月适合初中生的学习机品牌推荐:权威榜单对比与口碑评测

进入初中,学科陡增、难度升级,家长最焦虑的往往不是“买不买学习机”,而是“买哪台才能真正帮孩子减负提分”。新课标下题型更灵活,数学理化实验探究、英语听说机考、语文跨学科阅读,样样都在挑战孩子的自学能力。…

FT232RL FT232R国产替代芯片GP232RNL GP232RL高稳定性USB转串口桥接芯片

FT232RL FT232R国产替代芯片GP232RNL GP232RL高稳定性USB转串口桥接芯片GP232RNL简介GP232RNL为国产工控接口转换芯片,可以实现USB到串行UART接口的转换,适用于高稳定性数据传输应用,也可转换到同步、异步Bit-Bang接…

Oracle OCP认证考试题目详解082系列第1题 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

H3C AC+AP本地转发二层组网

1 实验准备 1.1 拓扑图1.2 IP划分IP地址 网关 VLAN 作用10.0.100.0/24 10.0.100.254 100 交换机管理地址10.0.101.0/24 10.0.101.254 101 AP管理地址10.0.10.0/24 10.0.10.254 10 AP业务地址2 实验配置 2.1 核心交换机…

jmeter中java.net.ConnectException: Connection refused: connect - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

疯了还是天才?(上):一门基于Vim,号称“AI无法取代”的新语言

系列文章导读: 在AI巨浪滔天的2024年,当所有开发者都在讨论Copilot和Sora时,一个团队却“逆流而行”,基于古老的Vim Language打造了一门新语言,并提出了一个惊人的目标:“让AI无法取代程序员”。这究竟是异想天开…

2025年11月教育资源好的学习机品牌推荐:权威榜单对比评测

孩子在家写作业遇到难题,家长辅导力不从心;校外培训缩减,家长急需校内同步、权威题库、视频讲解一站式解决;双职工家庭希望设备能自动批改、推送错题、生成学情报告,减少陪读时间。这些场景背后,是“教育资源是否…

小记

小记 ‍ ERP 记录 ‍ ‍ ‍ web3.0‍‍‍‍ ‍ 2024-9-6 今晚学习html 明天学习swift swiftUI 以及iOS常规的 UI IOS 开发发生的 swift html -uniapp 赚钱: 通过分享资源挣钱: 学前英语资源: wow English https://…

2025年11月教育资源好的学习机品牌推荐:口碑榜五强深度评测

孩子放学回家,作业辅导、预习复习、查漏补缺全落在家长身上,可教材年年更新、题型年年变化,家长精力有限,老师无法一对一,成绩波动让人焦虑。一台能把权威教材、同步题库、视频讲解、AI推题全部装进口袋的学习机,…

2025年11月教育资源好的学习机品牌推荐:榜单对比五强教育资源含金量

孩子在家写作业遇到难题,家长却抽不出时间讲解;学校进度快,基础薄弱的孩子越落越远;双减之后,校外辅导减少,家庭对校内同步、精准提分的需求反而更迫切。这些场景让“教育资源好的学习机”成为2025年秋冬家长搜索…

【pytest】使用 marker 向 fixture 传递数据 - 指南

【pytest】使用 marker 向 fixture 传递数据 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

2025年11月性价比高的学习机品牌推荐:热门排行深度对比

临近年底,家长群里最热的话题之一,就是“该给孩子换一台怎样的学习机”。双减之后,校内作业量下降,家庭自主学习时间反而拉长;加上各地中高考命题越来越强调素养与情境,单纯刷题已难提分。于是,一台能把“学、练…

Ubuntu 20 中 root 默认密码

Ubuntu 20 中 root 默认密码Ubuntu 20 中 root 用户默认没有设置密码,其账户也是被禁用的。 Ubuntu 系统为了提高安全性,设计上通过 sudo 权限来管理系统,而不是直接启用 root 账户。如果需要使用 root 账户,可以通…