进阶第1章代码解读

目录

  • forward_net.py
    • 代码
    • 代码解读
    • debug 代码

forward_net.py

代码

# coding: utf-8
import numpy as npclass Sigmoid:def __init__(self):self.params = []def forward(self, x):return 1 / (1 + np.exp(-x))class Affine:def __init__(self, W, b):self.params = [W, b]def forward(self, x):W, b = self.paramsout = np.dot(x, W) + breturn outclass TwoLayerNet:def __init__(self, input_size, hidden_size, output_size):I, H, O = input_size, hidden_size, output_size# 初始化权重和偏置W1 = np.random.randn(I, H)b1 = np.random.randn(H)W2 = np.random.randn(H, O)b2 = np.random.randn(O)# 生成层self.layers = [Affine(W1, b1),Sigmoid(),Affine(W2, b2)]# 将所有的权重整理到列表中self.params = []for layer in self.layers:self.params += layer.paramsdef predict(self, x):for layer in self.layers:x = layer.forward(x)return xx = np.random.randn(10, 2)
model = TwoLayerNet(2, 4, 3)
s = model.predict(x)
print(s)

代码解读

这段代码定义了一个简单的两层神经网络。我们来逐步解释其内容:

  1. 导入 numpy 库并为其设置别名为 np
import numpy as np
  1. 定义一个名为 Sigmoid 的类,表示 Sigmoid 激活函数。这个类有一个方法 forward 用于计算 Sigmoid 函数的输出。
class Sigmoid:def __init__(self):self.params = []def forward(self, x):return 1 / (1 + np.exp(-x))
  1. 定义一个名为 Affine 的类,表示神经网络中的仿射层(或称为全连接层)。这个层在前向传播时执行一个矩阵乘法和加偏置的操作。
class Affine:def __init__(self, W, b):self.params = [W, b]def forward(self, x):W, b = self.paramsout = np.dot(x, W) + breturn out
  1. 定义一个名为 TwoLayerNet 的类,表示一个两层的神经网络。这个类在初始化时会设置网络的结构并随机初始化权重和偏置。它还有一个 predict 方法用于执行前向传播。
class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size):...# 生成层self.layers = [Affine(W1, b1),Sigmoid(),Affine(W2, b2)]...def predict(self, x):for layer in self.layers:x = layer.forward(x)return x
  1. 最后,这段代码生成了一个随机输入 x,并使用 TwoLayerNet 类创建了一个神经网络模型。它然后对输入 x 进行预测,并打印出预测结果。
x = np.random.randn(10, 2)
model = TwoLayerNet(2, 4, 3)
s = model.predict(x)
print(s)
print('ok')

简而言之,这段代码展示了如何使用 numpy 实现一个简单的两层神经网络,并对随机输入进行预测。

debug 代码

下面模拟代码执行并提供变量的值。模拟执行代码的关键部分并解释每一步。

首先,导入必要的库:

import numpy as np

这行代码导入了 NumPy 库,并为它设置了别名 np

接下来,定义 Sigmoid 类:

class Sigmoid:def __init__(self):self.params = []def forward(self, x):return 1 / (1 + np.exp(-x))

这个类定义了 Sigmoid 激活函数。初始化方法仅设置一个空的 params 列表,而 forward 方法则计算 Sigmoid 函数的输出。

紧接着,我们定义 Affine 类:

class Affine:def __init__(self, W, b):self.params = [W, b]def forward(self, x):W, b = self.paramsout = np.dot(x, W) + breturn out

这个类表示一个仿射层。初始化方法接收权重 W 和偏置 b,并将它们存储在 params 列表中。forward 方法执行矩阵乘法并加上偏置。

接下来,我们定义 TwoLayerNet 类:

class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size):I, H, O = input_size, hidden_size, output_size# 初始化权重和偏置W1 = np.random.randn(I, H)b1 = np.random.randn(H)W2 = np.random.randn(H, O)b2 = np.random.randn(O)

这段代码定义了类的初始化方法,它接收输入层、隐藏层和输出层的大小,并随机初始化权重和偏置。例如,如果输入大小为2,隐藏层大小为4,输出大小为3,我们得到以下值(注意,由于随机初始化,值可能会有所不同):

I = 2, H = 4, O = 3
W1 = [[random_value1, random_value2, random_value3, random_value4],[random_value5, random_value6, random_value7, random_value8]]
b1 = [random_value9, random_value10, random_value11, random_value12]
W2 = [[random_value13, random_value14, random_value15],[random_value16, random_value17, random_value18],[random_value19, random_value20, random_value21],[random_value22, random_value23, random_value24]]
b2 = [random_value25, random_value26, random_value27]

然后,代码创建了神经网络的各个层并将它们添加到 self.layers 列表中:

self.layers = [Affine(W1, b1),Sigmoid(),Affine(W2, b2)
]

接着,代码将所有层的 params 列表整合到一个列表中:

self.params = []
for layer in self.layers:self.params += layer.params

这会生成一个列表,其中包含所有权重和偏置。

最后,TwoLayerNet 类定义了一个 predict 方法,该方法用于执行前向传播:

def predict(self, x):for layer in self.layers:x = layer.forward(x)return x

接下来,模拟代码生成了一个随机输入 x 并创建了神经网络模型:

x = np.random.randn(10, 2)
model = TwoLayerNet(2, 4, 3)

这将创建一个具有10个样本和2个特征的随机输入矩阵 x,并使用 TwoLayerNet 类创建了一个神经网络模型。

最后,模型对输入 x 进行预测,并打印出结果:

s = model.predict(x)
print(s)

这将输出预测结果。

最后一行:

print('ok')

简单地打印出 ‘ok’,表示代码已成功执行。

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

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

相关文章

39.B树,B+树(王道第7章查找补充知识)

目录 一. B树 (1)B树的定义 (2)B树的高度 (3)B树的插入 (4)B树的删除 二. B树 (1)B树的定义 (2)B树与B树的区别 一. B树 &am…

Java架构师内功计算机网络

目录 1 导学2 网络功能和分类3 OSI七层模型3.1 局域网和广域网协议4 TCP/IP协议5 通信技术和交换技术5.1 通信技术5.2 交换技术5.2.1 路由技术5.2.2 传输介质6 通信方式和交换方式7 IP地址7.1 IP地址表示7.2 子网划分8 IPv69 网络规划与设计10 网络存储技术10.1 廉价磁盘几余阵…

软件测试进阶篇----自动化测试脚本开发

自动化测试脚本开发 一、自动化测试用例开发 1、用例设计需要注意的点 2、设计一条测试用例 二、脚本开发过程中的技术 1、线性脚本开发 2、模块化脚本开发(封装线性代码到方法或者类中。在需要的地方进行调用) 3、关键字驱动开发:selen…

【云原生之kubernetes实战】在k8s环境下部署moredoc文库系统

【云原生之kubernetes实战】在k8s环境下部署moredoc文库系统 一、moredoc介绍1.1 moredoc简介1.2 moredoc技术栈二、本次实践介绍2.1 本次实践简介2.2 本次环境规划三、检查k8s环境3.1 检查工作节点状态3.2 检查系统pod状态四、创建mysql的secret资源4.1 创建部署目录4.2 创建密…

rust学习——智能指针

智能指针 在各个编程语言中,指针的概念几乎都是相同的:指针是一个包含了内存地址的变量,该内存地址引用或者指向了另外的数据。 在 Rust 中,最常见的指针类型是引用,引用通过 & 符号表示。不同于其它语言&#xf…

【可视化Java GUI程序设计教程】第4章 布局设计

4.1 布局管理器概述 右击窗体,单击快捷菜单中的Set Layout 4.1.2 绝对布局(Absolute Layout) 缩小窗口发现超出窗口范围的按钮看不见 Absolute Layout 4.1.2 空值布局(Null Layout) 4.1.3 布局管理器的属性和组件布…

python获取安卓Hierarchy并解析

python获取安卓Hierarchy并解析 借助 uiautomator 命令 dump 当前页面的 ui hierarchy 信息 完整的 uiautomator 命令类似: adb shell uiautomator dump [--compressed] [file]解析需要使用:import xml.etree.ElementTree as ET 完整代码如下&#xff…

STM32-通用定时器

通用定时器 通用定时器由一个可编程预分频器驱动的16位自动重新加载计数器组成。应用:测量输入的脉冲长度信号(输入捕获)、产生输出波形(输出比较和PWM)。 脉冲长度和波形周期可以从几微秒调制到几毫秒,使用…

SQL 运算符

SQL 运算符 运算符是保留字或主要用于 SQL 语句的 WHERE 子句中的字符,用于执行操作,例如:比较和算术运算。 这些运算符用于指定 SQL 语句中的条件,并用作语句中多个条件的连词。 常见运算符有以下几种: 算术运算符比…

STM32:TIM通道输入捕获

本文主要讲解如何使用TIMER通道的输入脉冲捕获功能。基于STM32F7的Timer2 Channel3来进行讲解。 配置时钟 Timer2的时钟频率,对应APB1 Timer。 分频设置为96-1,这样设置定时器每次counter加1,对应的时间为1us(计时精度是1us&…

【windows】自动开机 + 免登陆 + 自动运行bat脚本 + 远程免登陆

一、场景 二、解决方案 三、实战 1. 键盘 Win R 键,在弹出的对话框中输入netplwiz,回车 2. 去掉必须输入用户名和密码的勾选,点击应用 3. 在弹出的对话框中输入用户名和密码 一、场景 主机服务器:windows 10 桌面docker &a…

程序包com.sun.xml.internal.bind.marshaller不存在

程序包com.sun.xml.internal.bind.marshaller不存在 需要引入的依赖 <dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId><version>1.3.50</version></dependency><dependency&g…

【蓝桥每日一题]-贪心(保姆级教程 篇1)#拼数 #合并果子 #凌乱yyy

目录 题目&#xff1a; 拼数 思路&#xff1a; 题目&#xff1a; 合并果子 思路&#xff1a; 题目&#xff1a;凌乱yyy 思路&#xff1a; 题目&#xff1a;拼数 思路&#xff1a; 思路很简单。举个例子&#xff1a;对于a321,b32。我们发现ab32132,ba32321&#xff0c;那么…

MySQL数据库脱敏方案

MySQL数据库脱敏是指对数据库中的敏感数据进行脱敏处理&#xff0c;以保护数据隐私和安全。常见的脱敏方法包括替换、扰动、加密、去标识化等。 在MySQL数据库中&#xff0c;可以使用以下方法进行脱敏&#xff1a; 替换&#xff1a;将敏感数据的部分或全部替换为其他字符或字…

架构、框架、模式,极简文字介绍

1、架构、框架、模式是一种从大到小的关系&#xff0c;也是一种组合关系 2、架构一般针对一个行业或一类应用&#xff0c;是技术和应用的完美组合 3、框架比较小&#xff0c;很多表现为中间件&#xff0c;框架一般是从技术角度解决同类问题&#xff0c;从技术的横切面来解决实…

LVS负载均衡集群 (NAT模式)

LVS集群 集群的概念&#xff1a; 为解决某个特定的问题&#xff0c;将多个计算机组合起来形成一个单个系统 集群的水平扩展&#xff1a; 增加设备&#xff0c;并行运行多个服务&#xff0c;通过网路连接和算法来调度服务分配的问题 集群的类型&#xff1a; 负载均衡集群&#…

postgresql14-表的管理(四)

表table 创建表 CREATE TABLE table_name --表名 (column_name data_type column_constraint, --字段名、字段类型、约束字段&#xff08;可选&#xff09;column_name data_type, --表级别约束字段...,table_constraint );CREATE TABLE emp1 --创建表 AS SELECT * FROM empl…

Spring Cloud之服务注册与发现(Eureka)

目录 Eureka 介绍 角色 实现流程 单机构建 注册中心 服务提供者 服务消费者 集群搭建 注册中心 服务提供者 自我保护机制 原理分析 Eureka 介绍 Eureka是spring cloud中的一个负责服务注册与发现的组件&#xff0c;本身是基于REST的服务&#xff0c;同时还提供了…

Redis数据库管理工具Redis Desktop Manager最新中文

Redis Desktop Manager是一款直观且易用的Redis数据库管理工具&#xff0c;支持Windows、macOS和Linux等多平台。它提供了丰富的功能和工具&#xff0c;使用户可以轻松地创建、编辑、删除和浏览Redis键值对&#xff0c;并执行各种Redis命令。通过SSH Tunnel连接&#xff0c;RDM…

pip 指定源

pip定源 # 指定豆瓣 python -m pip install transformers -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com参考 出现错误&#xff1a;Looking in indexes:https://pypi.tuna.tsinghua.edu.cn/simple