吴恩达机器学习-可选实验室:简单神经网络(Simple Neural Network)

在这个实验室中,我们将使用Tensorflow构建一个小型神经网络
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('./deeplearning.mplstyle')
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from lab_utils_common import dlc
from lab_coffee_utils import load_coffee_data, plt_roast, plt_prob, plt_layer, plt_network, plt_output_unit
import logging
logging.getLogger("tensorflow").setLevel(logging.ERROR)
tf.autograph.set_verbosity(0)

数据集

X,Y = load_coffee_data();
print(X.shape, Y.shape)

让我们在下面绘制咖啡烘焙数据。这两个功能是以摄氏度为单位的温度和以分钟为单位的持续时间。在家烤咖啡建议时间最好保持在12到15分钟之间,而温度应该在175到260摄氏度之间。当然,随着温度的升高,持续时间应该会缩短。

plt_roast(X,Y)

在这里插入图片描述

标准化数据

如果数据被标准化,将权重与数据拟合(反向传播,将在下周的讲座中介绍)将更快地进行。这与您在课程1中使用的过程相同,其中数据中的每个特征都被标准化为具有相似的范围。下面的过程使用Keras规范化层。它有以下步骤:

  • 创建一个“规范化层”。请注意,正如这里所应用的,这不是模型中的层。
  • “调整”数据。这将学习数据集的均值和方差,并在内部保存这些值。
  • 规范化数据。
    将规范化应用于利用所学习模型的任何未来数据是很重要的。
print(f"Temperature Max, Min pre normalization: {np.max(X[:,0]):0.2f}, {np.min(X[:,0]):0.2f}")
print(f"Duration    Max, Min pre normalization: {np.max(X[:,1]):0.2f}, {np.min(X[:,1]):0.2f}")
norm_l = tf.keras.layers.Normalization(axis=-1)
norm_l.adapt(X)  # learns mean, variance
Xn = norm_l(X)
print(f"Temperature Max, Min post normalization: {np.max(Xn[:,0]):0.2f}, {np.min(Xn[:,0]):0.2f}")
print(f"Duration    Max, Min post normalization: {np.max(Xn[:,1]):0.2f}, {np.min(Xn[:,1]):0.2f}")

在这里插入图片描述
平铺/复制我们的数据以增加训练集大小并减少训练时期的数量。

Xt = np.tile(Xn,(1000,1))
Yt= np.tile(Y,(1000,1))   
print(Xt.shape, Yt.shape)   

在这里插入图片描述 Tensorflow模型

Model
在这里插入图片描述
让我们构建讲座中描述的“咖啡烘焙网络”。有两层Sigmoid激活,如下所示:

tf.random.set_seed(1234)  # applied to achieve consistent results
model = Sequential([tf.keras.Input(shape=(2,)),Dense(3, activation='sigmoid', name = 'layer1'),Dense(1, activation='sigmoid', name = 'layer2')]
)

注1:tf.keras.input(shape=(2,)),指定输入的预期形状。这允许Tensorflow在这一点上调整权重和偏置参数的大小。这在探索Tensorflow模型时非常有用。在实践中可以省略此语句,当在model.fit语句中指定输入数据时,Tensorflow将调整网络参数的大小。
注2:在最后一层中包括S形激活不被视为最佳实践。相反,它会被计入损失中,从而提高数值稳定性。这将在稍后的实验室中进行更详细的描述。

model.summary()

在这里插入图片描述
👆摘要中显示的参数计数对应于如下所示的权重和偏置阵列中的元素数量。

L1_num_params = 2 * 3 + 3   # W1 parameters  + b1 parameters
L2_num_params = 3 * 1 + 1   # W2 parameters  + b2 parameters
print("L1 params = ", L1_num_params, ", L2 params = ", L2_num_params  )

在这里插入图片描述
让我们检查一下Tensorflow实例化的权重和偏差。重量𝑊应具有一定的大小(输入中的特征数量、层中的单元数量),而偏差𝑏大小应与图层中的单位数相匹配:

  • 在具有3个单元的第一层中,我们期望W的大小为(2,3),并且𝑏 应该具有3个元素。
  • 在具有1个单元的第二层中,我们预计W的大小为(3,1),并且𝑏 应该有1个元素。
W1, b1 = model.get_layer("layer1").get_weights()
W2, b2 = model.get_layer("layer2").get_weights()
print(f"W1{W1.shape}:\n", W1, f"\nb1{b1.shape}:", b1)
print(f"W2{W2.shape}:\n", W2, f"\nb2{b2.shape}:", b2)

在这里插入图片描述
以下陈述将在第2周进行详细描述。目前:
model.compile语句定义了一个损失函数并指定了一个编译优化。
model.fit语句运行梯度下降,并将权重与数据相匹配。

model.compile(loss = tf.keras.losses.BinaryCrossentropy(),optimizer = tf.keras.optimizers.Adam(learning_rate=0.01),
)model.fit(Xt,Yt,            epochs=10,
)

在这里插入图片描述
更新的权重
拟合后,权重已更新:

W1, b1 = model.get_layer("layer1").get_weights()
W2, b2 = model.get_layer("layer2").get_weights()
print("W1:\n", W1, "\nb1:", b1)
print("W2:\n", W2, "\nb2:", b2)

在这里插入图片描述
接下来,我们将加载一些从之前的训练中保存下来的权重。这是为了让这款笔记本在Tensorflow随时间变化时保持稳健。不同的训练跑可能会产生一些不同的结果,下面的讨论适用于特定的解决方案。请随时重新运行已注释掉此单元格的笔记本,以查看差异。

W1 = np.array([[-8.94,  0.29, 12.89],[-0.17, -7.34, 10.79]] )
b1 = np.array([-9.87, -9.28,  1.01])
W2 = np.array([[-31.38],[-27.86],[-32.79]])
b2 = np.array([15.54])
model.get_layer("layer1").set_weights([W1,b1])
model.get_layer("layer2").set_weights([W2,b2])

👆解释:

在机器学习中,模型的训练过程是一个迭代优化的过程,通过不断调整模型参数使得模型在训练数据上表现更好。在每次训练迭代中,通过计算损失函数关于参数的梯度,我们可以知道当前参数的变化方向,然后根据梯度下降算法来更新参数。
现在来解释一下如何理解这个过程:

  1. 随机初始化参数:在开始训练之前,我们通常会随机初始化模型参数。这样做是因为初始参数对模型性能有很大影响,随机初始化可以避免模型陷入局部最优解。
  2. 计算梯度:在每次训练迭代中,通过前向传播计算损失函数,然后反向传播计算损失函数关于参数的梯度。梯度告诉我们当前参数的变化方向,即损失函数下降最快的方向。
  3. 参数更新:根据梯度下降算法,我们将当前参数沿着负梯度方向进行一定步长的更新。学习率控制了参数更新的速度,较大的学习率可能导致参数更新过大而错过最优值,而较小的学习率可能导致收敛速度过慢。
  4. 循环迭代:重复以上步骤,直到达到停止条件(如达到最大迭代次数、损失函数收敛等)为止。

由于训练数据的随机性、模型的复杂性以及训练过程中可能存在的噪声等因素,即使使用相同的初始参数和相同的训练数据,每次训练得到的最终参数可能会有所不同。这种差异是正常的,而且可以通过一些技术手段来提高模型的稳定性和收敛性。

预测
在这里插入图片描述
一旦你有了一个经过训练的模型,你就可以用它来进行预测。回想一下,我们模型的输出是一个概率。在这种情况下,烤得好的概率。要做出决定,必须将概率应用于阈值。在这种情况下,我们将使用0.5

👇 让我们从创建输入数据开始。模型期望一个或多个例子,其中例子在矩阵的行中。在这种情况下,我们有两个特征,所以矩阵将是(m,2),其中m是例子的数量。回想一下,我们已经标准化了输入特征,所以我们也必须标准化我们的测试数据。
要进行预测,请应用预测方法。

X_test = np.array([[200,13.9],  # postive example[200,17]])   # negative example
X_testn = norm_l(X_test)
predictions = model.predict(X_testn)
print("predictions = \n", predictions)

在这里插入图片描述
Epochs and batches
在上面的编译语句中,epochs的数量设置为10。这规定了整个数据集应在训练期间应用10次。在培训过程中,您可以看到描述培训进度的输出,如下所示:

Epoch 1/10 6250/6250【=========================】-6s

910us/step-loss:0.1782
第一行Epoch 1/10描述了模型当前运行的历元。为了提高效率,训练数据集被分解为“批”。Tensorflow中批次的默认大小为32。在我们的扩展数据集中有200000个示例或6250个批次。第二行6250/6250[====上的注释描述了已执行的批次。

👇为了将概率转换为决策,我们应用了一个阈值:

yhat = np.zeros_like(predictions)
for i in range(len(predictions)):if predictions[i] >= 0.5:yhat[i] = 1else:yhat[i] = 0
print(f"decisions = \n{yhat}")

在这里插入图片描述
这可以更简洁地完成:

yhat = (predictions >= 0.5).astype(int)
print(f"decisions = \n{yhat}")

在这里插入图片描述
图层功能
让我们检查一下这些单元的功能,以确定它们在咖啡烘焙决策中的作用。我们将为所有输入值(持续时间、温度)绘制每个节点的输出。每个单元都是一个逻辑函数,其输出范围可以从零到一。图形中的着色表示输出值。

注:在实验室中,我们通常从零开始计数,而讲座可能从1开始。

plt_layer(X,Y.reshape(-1,),W1,b1,norm_l)

在这里插入图片描述
阴影显示每个单元负责不同的“坏烤”区域。当温度过低时,单位0具有较大的值。当持续时间太短时,第一单元的值较大,而对于时间/温度的不良组合,第二单元的值较大。值得注意的是,网络通过梯度下降过程自行学习这些函数。它们与一个人做出相同决定时可能选择的功能非常相似。

最后一层的函数图有点难以可视化。它的输入是第一层的输出。我们知道第一层使用Sigmoid,所以它们的输出范围在0到1之间。我们可以创建一个三维图来计算三个输入的所有可能组合的输出。如下所示。上面,高输出值对应于“坏烤”区域。下面,最大输出在区域中,其中三个输入是对应于“好烤”区域的小值。
plt_output_u

plt_output_unit(W2,b2)

在这里插入图片描述
最后一张图显示了整个网络的运行情况。
左边的图形是由蓝色着色表示的最终层的原始输出。这覆盖在由X和O表示的训练数据上。
右图是在决策阈值之后网络的输出。这里的X和O对应于网络做出的决策。
以下内容需要运行一段时间

netf= lambda x : model.predict(norm_l(x))
plt_network(X,Y,netf)

在这里插入图片描述
在这里插入图片描述

祝贺

您已经在Tensorflow中构建了一个小型神经网络。该网络展示了神经网络通过在多个单元之间划分决策来处理复杂决策的能力。

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

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

相关文章

win10 配置 oh-my-posh

win10 配置 oh-my-posh 0. 前置1. 安装1.1. 软件1.2. 字体1.3. 激活1.3.1. Git Bash1.3.2. PowerShell 2. 配置2.1. 效果2.2. 说明2.3. 其他2.3.1. 新版PowerShell2.3.2 conda问题 0. 前置 这个东西毕竟是个,命令行美化工具,所以需要先有一个命令行&…

eth uniswap 套利交易案例四

交易hash: 0x085843b47c0d1b0f820b80c166ea8dd2e3928876fb353d107e49dcf879cf8426 交易时间: 2024.02.29 获利: 196,284刀 balancer 借了 338个 weth, 然后和 0x3BA6A019eD5541b5F5555d8593080042Cf3ae5f4 交易用 282个weth 换了293个wste…

【矩阵】54. 螺旋矩阵【中等】

螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 解题思路 1、模拟顺时针螺旋顺序遍历矩阵…

名词【语法笔记】

1.名词分为几大类 2.每一类,又有几个小类,以及所需要注意什么

【每日力扣】131.分割回文串与450.删除二叉搜索树中的节点

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害。 131.分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的…

ROS多机通信

在充分的单机学习测试之后,往往要进行真实机器人的测试,那么就要接触到多机通信的问题。ROS采用的分布式网络通信,只要正确的设置ROS_MASTER_URI和ROS_IP两个环境变量,就可以成功实现ROS的多机通信,有时我们也称之为主…

Linux系统——Mysql数据库操作

目录 一、数据库基本操作 1.查看数据库结构 1.1查看数据库信息——Show databases 1.2查看数据库中的表信息——Show tables Show tables in 数据库名 use 数据库名 show tables 1.3显示数据表的结构(字段)——Describe(Desc&#x…

HarmonyOS(鸿蒙)ArkUI组件

方舟开发框架(简称ArkUI)为HarmonyOS应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界面…

8.【Linux】线程

进程与线程比较 具体参考 小林coding 线程的上下文切换 当两个线程是属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的栈、寄存器等不共享的数据。 当两个线程不属于同一个进程&…

iOS常见崩溃简介

1. 崩溃 多指在移动设备(如iOS、Android设备)中或不可移动设备(如:Windows、Linux等设备), 在打开或使用应用程序时出现的突然退出中断的情况(类似于Windows的应用程序崩溃)。 多表现为&#…

网络原理(3)——TCP协议

目录 一、连接管理 二、三次握手 1、何为三次握手? 2、三次握手有何意义? 三、四次挥手 三次握手和四次挥手的相似之处和不同之处 (1)相似之处 (2)不同之处 四、TCP的状态 建立连接: 断开…

【链表】算法例题

目录 八、 链表 57. 环形链表 ① 58. 两数相加 ② √ 59. 合并两个有序链表 ① √- 60. 随机链表的复制 ② 61. 反转链表II ② 62. K个一组翻转链表 ③ 63. 删除链表的倒数第N个结点 ② √- 64. 删除排序链表中的重复元素II ② √- 65. 旋转链表 ② √- 66. 分隔链…

安科瑞精密配电柜助力数据中心节能降耗

彭姝麟 Acrelpsl 1.趋势分析 能源支出作为数据中心运营的主要成本之一。清华大学能源互联网创新研究院常务副院长高文胜曾在公开场合指出,随着我国数据中心能源消耗的逐年攀升,电费支出约占数据中心年运营成本的95%。加之“双碳”战略的出台&#xff0c…

SkyWalking上报Java应用数据

重要 本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。 通过SkyWalking为应用埋点并上报链路数据至可观测链路 OpenTelemetry 版后,可观测链路 OpenTelemetry 版即可开始监控应用,您可以…

cyclictest 交叉编译报错---rt_numa.h:18:10: fatal error: numa.h: 没有那个文件或目录

cyclictest 主要是用于测试系统延时,进而判断系统的实时性 使用版本 rt-tests-2.6.tar.gz numactl v2.0.16 问题 编译时,需要先编译 numactl ,不然会有以下报错: arm-linux-gnueabihf-gcc -D VERSION2.6 -c src/cyclictest/c…

软考 网工 每日学习打卡 2024/3/19

学习内容 第8章 网络安全 本章主要讲解网络安全方面的基础知识和应用技术。针对考试应该掌握诸如数据加密、报文认 证、数字签名等基本理论,在此基础上深入理解网络安全协议的工作原理,并能够针对具体的 网络系统设计和实现简单的安全解决方案。 本章共有…

Day22初识集合

Day22初识集合 一、集合 1、概念: 集合是指将多个元素组合在一起的数据结构。在编程中,集合用于存储和操作一组相关的数据对象。与数组相比,集合具有更灵活、动态和高级的功能。 2、常见的集合类: List(列表&#x…

sentry-cli - error: Failed to load .sentryclirc file from project path

Xcode 15.2 warning sentry-cli - error: Failed to load .sentryclirc file from project path (/Users/zhuhongwei/Desktop/pandabill/.sentryclirc)推荐一下刚上线的 App 熊猫小账本,里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App,用于…

1、鸿蒙学习-为应用/服务进行签名

针对应用/服务的签名,DevEco Studio为开发者提供了自动签名方案,帮助开发者高效进行调试。也可选择手动方式对应用/服务进行签名,如果使用了需要ACL的权限,需采用手动方式进行签名。 自动签名 说明 使用自动签名前,请…