当前位置: 首页 > wzjs >正文

百货商城网站建设百度官网网页版

百货商城网站建设,百度官网网页版,腾讯云服务器购买后怎么使用,php大型综合网站源码源代码和图解来自鱼书 目录 2层神经网络的类 源代码: 详解: 1. 类的初始化 (__init__) 2. 前向传播 (predict) 3. 损失函数 (loss) 4. 准确率计算 (accuracy) 5. 数值梯度计算 (numerical_gradient) 6. 反向传播计算梯度 (gradient) 总结&#…

源代码和图解来自鱼书

目录

2层神经网络的类

源代码:

详解:

1. 类的初始化 (__init__)

2. 前向传播 (predict)

3. 损失函数 (loss)

4. 准确率计算 (accuracy)

5. 数值梯度计算 (numerical_gradient)

6. 反向传播计算梯度 (gradient)

总结:


2层神经网络的类

源代码:

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
from common.functions import *
from common.gradient import numerical_gradientclass TwoLayerNet:def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):# 初始化权重self.params = {}self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)self.params['b1'] = np.zeros(hidden_size)self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)self.params['b2'] = np.zeros(output_size)def predict(self, x):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)return y# x:输入数据, t:监督数据def loss(self, x, t):y = self.predict(x)return cross_entropy_error(y, t)def accuracy(self, x, t):y = self.predict(x)y = np.argmax(y, axis=1)t = np.argmax(t, axis=1)accuracy = np.sum(y == t) / float(x.shape[0])return accuracy# x:输入数据, t:监督数据def numerical_gradient(self, x, t):loss_W = lambda W: self.loss(x, t)grads = {}grads['W1'] = numerical_gradient(loss_W, self.params['W1'])grads['b1'] = numerical_gradient(loss_W, self.params['b1'])grads['W2'] = numerical_gradient(loss_W, self.params['W2'])grads['b2'] = numerical_gradient(loss_W, self.params['b2'])return gradsdef gradient(self, x, t):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']grads = {}batch_num = x.shape[0]# forwarda1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)# backwarddy = (y - t) / batch_numgrads['W2'] = np.dot(z1.T, dy)grads['b2'] = np.sum(dy, axis=0)da1 = np.dot(dy, W2.T)dz1 = sigmoid_grad(a1) * da1grads['W1'] = np.dot(x.T, dz1)grads['b1'] = np.sum(dz1, axis=0)return grads

详解:

这段代码实现了一个两层神经网络 TwoLayerNet,并包含了前向传播、损失计算、准确率计算、梯度计算等功能。我们逐步解释每个部分:

1. 类的初始化 (__init__)

class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):self.params = {}self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)self.params['b1'] = np.zeros(hidden_size)self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)self.params['b2'] = np.zeros(output_size)
  • input_sizehidden_sizeoutput_size 分别是输入层、隐藏层和输出层的神经元数目。
  • 权重 W1W2 是从正态分布中随机初始化的(通过 np.random.randn),偏置 b1b2 被初始化为零。
  • weight_init_std 是一个可选的参数,用于控制权重的初始化标准差。

2. 前向传播 (predict)

def predict(self, x):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)return y
  • 通过 x(输入数据),计算网络的输出:
    1. a1 = np.dot(x, W1) + b1:将输入数据与第一个权重矩阵相乘并加上偏置。
    2. z1 = sigmoid(a1):对 a1 进行 Sigmoid 激活。
    3. a2 = np.dot(z1, W2) + b2:将隐藏层的输出 z1 乘以第二层的权重矩阵并加上偏置。
    4. y = softmax(a2):对第二层的结果应用 Softmax 激活,得到最终的输出概率分布。

3. 损失函数 (loss)

def loss(self, x, t):y = self.predict(x)return cross_entropy_error(y, t)
  • 使用 predict 方法计算网络的输出 y,然后计算输出与真实标签 t 之间的交叉熵损失。交叉熵损失用于评估模型预测的概率分布与实际标签之间的差异。

4. 准确率计算 (accuracy)

def accuracy(self, x, t):y = self.predict(x)y = np.argmax(y, axis=1)t = np.argmax(t, axis=1)accuracy = np.sum(y == t) / float(x.shape[0])return accuracy
  • y = np.argmax(y, axis=1):将每个样本的输出概率向量转化为类别标签(选择概率最大的位置作为预测类别)。
  • t = np.argmax(t, axis=1):将真实标签 t 也转化为类别标签。
  • 计算预测正确的样本比例,即准确率。

5. 数值梯度计算 (numerical_gradient)

def numerical_gradient(self, x, t):loss_W = lambda W: self.loss(x, t)grads = {}grads['W1'] = numerical_gradient(loss_W, self.params['W1'])grads['b1'] = numerical_gradient(loss_W, self.params['b1'])grads['W2'] = numerical_gradient(loss_W, self.params['W2'])grads['b2'] = numerical_gradient(loss_W, self.params['b2'])return grads
  • 通过数值梯度法(numerical_gradient)计算各个参数(权重和偏置)的梯度。
  • loss_W 是由lambda定义的一个匿名函数,计算在给定输入 x 和标签 t 下,损失函数的值。
  • numerical_gradient 用于计算每个参数的梯度,返回一个字典 grads,包含了所有权重和偏置的梯度。在反向传播过程中,numerical_gradient(loss_W, self.params['W1']) 会通过数值方法(有限差分法)计算出 loss(W)W1 的梯度。

6. 反向传播计算梯度 (gradient)

def gradient(self, x, t):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']grads = {}batch_num = x.shape[0]# forwarda1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)# backwarddy = (y - t) / batch_numgrads['W2'] = np.dot(z1.T, dy)grads['b2'] = np.sum(dy, axis=0)da1 = np.dot(dy, W2.T)dz1 = sigmoid_grad(a1) * da1grads['W1'] = np.dot(x.T, dz1)grads['b1'] = np.sum(dz1, axis=0)return grads
  • 前向传播: predict 函数中计算出神经网络的输出 y的步骤
  • 反向传播
    • 计算损失对输出层的梯度:dy = (y - t) / batch_num,这是 Softmax 层和交叉熵损失的导数。
    • 更新 W2b2:通过矩阵乘法 np.dot(z1.T, dy) 计算梯度。
    • 计算隐藏层的梯度:da1 = np.dot(dy, W2.T),然后通过 sigmoid_grada1 的梯度进行修正。
    • 更新 W1b1:使用反向传播的链式法则进行计算。

总结:

  • 前向传播 计算神经网络的输出。
  • 损失函数 计算网络预测与实际标签之间的误差。
  • 准确率 计算模型的预测准确性。
  • 数值梯度 通过数值方法估算参数的梯度。
  • 反向传播 计算每一层的梯度,利用链式法则更新权重和偏置。

http://www.dtcms.com/wzjs/392228.html

相关文章:

  • 公司推广做哪个网站广州网站建设系统
  • 做幼儿手工网站seo快速优化排名
  • 成都网站建设公司官网免费seo推广公司
  • 南宁有本地租房做网站吗指数基金怎么选
  • 自己如何建立一个网站接单平台app
  • 帮人做网站如何免费自己创建网站
  • 网站建设威客平台免费网页设计制作网站
  • 用服务器做网站新媒体营销案例ppt
  • 凡科互动修改器湖南正规关键词优化
  • 交互效果很好的网站推广网站
  • 徐汇科技网站建设新的营销方式有哪些
  • 建立购物网站 app百度在线使用网页版
  • 赤峰网站制作公司b2b免费网站推广平台
  • 天津网站建设要多少钱优秀企业网站欣赏
  • 用源代码做网站网推广公司
  • 汕头论坛建站模板美国搜索引擎排名
  • 织梦网站模板免费企业做个网站多少钱
  • phpcms做网站建栏目百度识图搜索图片来源
  • 安徽方圆建设有限公司网站企业网站怎么推广
  • 北京朝阳双桥网站建设最火的网络销售平台
  • 网站插入银行支付怎么做站外推广渠道有哪些
  • 网页设计作业文件夹压缩包运城seo
  • 蓝海国际版网站建设seo实战密码电子版
  • 深圳企业网站设计互联网营销师培训学校
  • 建设政府网站的社会背景竞价推广
  • 自建免费网站哪个好站长工具日本
  • 西安烽盈网站建设做网站多少钱
  • 您与此网站之间建立的连接不安全东莞网站定制开发
  • wordpress 数据库 媒体库seo培训优化
  • 全国政务网站哪家做的好全球热门网站排名