【自学记录】【Pytorch2.0深度学习从零开始学 王晓华】第四章 深度学习的理论基础

这篇具有很好参考价值的文章主要介绍了【自学记录】【Pytorch2.0深度学习从零开始学 王晓华】第四章 深度学习的理论基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

4.3.5 反馈神经网络原理的Python实现

遇到的疑问:

1、对神经网络前向计算中,关于系数矩阵W的讨论。

上一章讲到了层结构是【out,in】,所以我觉得在计算Y=WX+b的时候,W矩阵也应该是【out,in】的形状。但是该代码(或者正规代码实现流程)不是的,他是一个这样的结构:
【自学记录】【Pytorch2.0深度学习从零开始学 王晓华】第四章 深度学习的理论基础,pytorch,深度学习,人工智能
【自学记录】【Pytorch2.0深度学习从零开始学 王晓华】第四章 深度学习的理论基础,pytorch,深度学习,人工智能
所以,W矩阵还是【in,out】结构,a1=X1W11+X2W12+b1,为了计算a1,会以列优先循环W矩阵:

 for j in range(self.hidden_n):
            total = 0.0
            for i in range(self.input_n):
                total += self.input_cells[i] * self.input_weights[i][j] #列优先循环W矩阵          

以上self.input_weights[i][j]代码:
j=1,依次输出(1,1),(2,1),对应W11,W12
j=2,依次输出(1,2),(2,2),对应W21,W22
j=3,依次输出(1,3),(2,3),对应W31,W32

以下是神经网络前向传播函数:

 def predict(self,inputs):
        for i in range(self.input_n - 1):
            self.input_cells[i] = inputs[i]
        for j in range(self.hidden_n):
            total = 0.0
            for i in range(self.input_n):
                total += self.input_cells[i] * self.input_weights[i][j]
            self.hidden_cells[j] = sigmoid(total)
        for k in range(self.output_n):
            total = 0.0
            for j in range(self.hidden_n):
                total += self.hidden_cells[j] * self.output_weights[j][k]
            self.output_cells[k] = sigmoid(total)
        return self.output_cells[:]#浅拷贝

2、有关self.output_cells[:]浅拷贝

神经网络前向传播函数最后使用 return self.output_cells[:] 而不是 return self.output_cells 的主要目的是返回 self.output_cells 的一个浅拷贝(shallow copy),而不是原始对象的引用。这意味着调用者将获得输出值的一个新列表,而不是对原始列表的引用。这可以确保原始 self.output_cells 列表的内部状态在函数返回后不会被意外修改,从而保持对象的封装性和数据的安全性。

源码\第四章\4_3.py

import numpy as np
import math
import random
def rand(a, b):
    return (b - a) * random.random() + a
def make_matrix(m,n,fill=0.0):
    mat = []
    for i in range(m):
        mat.append([fill] * n)
    return mat
def sigmoid(x):
    return 1.0 / (1.0 + math.exp(-x))
def sigmod_derivate(x):
    return x * (1 - x)
class BPNeuralNetwork:
    def __init__(self):
        self.input_n = 0
        self.hidden_n = 0
        self.output_n = 0
        self.input_cells = []
        self.hidden_cells = []
        self.output_cells = []
        self.input_weights = []
        self.output_weights = []
    def setup(self,ni,nh,no):
        self.input_n = ni + 1 #+1是加了一个隐藏层
        self.hidden_n = nh
        self.output_n = no
        self.input_cells = [1.0] * self.input_n
        self.hidden_cells = [1.0] * self.hidden_n
        self.output_cells = [1.0] * self.output_n
        self.input_weights = make_matrix(self.input_n,self.hidden_n)####这里,权重矩阵设定的是【in,out】
        self.output_weights = make_matrix(self.hidden_n,self.output_n)####这里,权重矩阵设定的是【in,out】
        # random activate
        for i in range(self.input_n):
            for h in range(self.hidden_n):
                self.input_weights[i][h] = rand(-0.2, 0.2)
        for h in range(self.hidden_n):
            for o in range(self.output_n):
                self.output_weights[h][o] = rand(-2.0, 2.0)
    def predict(self,inputs):
        for i in range(self.input_n - 1):
            self.input_cells[i] = inputs[i]
        for j in range(self.hidden_n):
            total = 0.0
            for i in range(self.input_n):
                total += self.input_cells[i] * self.input_weights[i][j]
            self.hidden_cells[j] = sigmoid(total)
        for k in range(self.output_n):
            total = 0.0
            for j in range(self.hidden_n):
                total += self.hidden_cells[j] * self.output_weights[j][k]
            self.output_cells[k] = sigmoid(total)
        return self.output_cells[:]#浅拷贝
    def back_propagate(self,case,label,learn):
        self.predict(case)
        #计算输出层的误差
        output_deltas = [0.0] * self.output_n
        for k in range(self.output_n):
            error = label[k] - self.output_cells[k]
            output_deltas[k] = sigmod_derivate(self.output_cells[k]) * error#误差项
        #计算隐藏层的误差
        hidden_deltas = [0.0] * self.hidden_n
        for j in range(self.hidden_n):
            error = 0.0
            for k in range(self.output_n):
                error += output_deltas[k] * self.output_weights[j][k]
            hidden_deltas[j] = sigmod_derivate(self.hidden_cells[j]) * error
        #更新输出层权重
        for j in range(self.hidden_n):
            for k in range(self.output_n):
               self.output_weights[j][k] += learn * output_deltas[k] * self.hidden_cells[j]
        #更新隐藏层权重
        for i in range(self.input_n):
            for j in range(self.hidden_n):
                self.input_weights[i][j] += learn * hidden_deltas[j] * self.input_cells[i]
        error = 0
        for o in range(len(label)):
            error += 0.5 * (label[o] - self.output_cells[o]) ** 2
        return error
    def train(self,cases,labels,limit = 100,learn = 0.05):
        for i in range(limit):
            error = 0
            for i in range(len(cases)):
                label = labels[i]
                case = cases[i]
                error += self.back_propagate(case, label, learn)
        pass
    def test(self):
        cases = [
            [0, 0],
            [0, 1],
            [1, 0],
            [1, 1],
        ]
        labels = [[0], [1], [1], [0]]
        self.setup(2, 5, 1)
        self.train(cases, labels, 1000000, 0.05)
        for case in cases:
            print(self.predict(case))
if __name__ == '__main__':
    nn = BPNeuralNetwork()
    nn.test()

运行结果:原有的训练结果不太理想,直接把训练次数后面加了2个0,效果好多了~
【自学记录】【Pytorch2.0深度学习从零开始学 王晓华】第四章 深度学习的理论基础,pytorch,深度学习,人工智能文章来源地址https://www.toymoban.com/news/detail-845941.html

到了这里,关于【自学记录】【Pytorch2.0深度学习从零开始学 王晓华】第四章 深度学习的理论基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 全网最新最全的基于Tensorflow和PyTorch深度学习环境安装教程: Tensorflow 2.10.1 加 CUDA 11.8 加 CUDNN8.8.1加PyTorch2.0.0

    本文编写日期是:2023年4月. Python开发环境是Anaconda 3.10版本,具体Anaconda的安装这里就不赘述了,基础来的。建议先完整看完本文再试,特别是最后安装过程经验分享,可以抑制安装过程中一些奇怪的念头,减少走弯路。 目录 1. NVidia驱动安装  2. 安装CUDA Toolkit 3. 安装Tensorfl

    2024年02月08日
    浏览(34)
  • 【自学网络安全】从零开始学习网络渗透的核心知识点,助你入门宝典

    前言 上周旁听了一个大学学长组织的线上网络安全交流会,里边不乏充斥着各位行业大牛,讲的内容确实精彩,可能对于网络安全经验5年+的人来说,是受益匪浅,欢迎程度极高,恨不得跳出屏幕来表示赞同,毕竟很多提到的问题,我在工作中也很常见,但是作为资历一般的

    2024年02月03日
    浏览(31)
  • 【深度学习1】ubuntu22.04从零开始搭建深度学习环境

    具体安装步骤可以参考:win11+ubuntu22.04双系统安装(简洁版) 安装之前进入主板BIOS,关闭安全启动!!! 更新软件列表 安装必要的依赖 根据显卡型号下载对应的驱动,官方驱动下载链接:GeForce® 驱动程序 卸载原有驱动(若有) 禁用nouveau驱动,在 /etc/modprobe.d/blacklist.conf

    2024年02月05日
    浏览(79)
  • 机器学习&&深度学习——线性回归的从零开始实现

    虽然现在的深度学习框架几乎可以自动化实现下面的工作,但从零开始实现可以更了解工作原理,方便我们自定义模型、自定义层或自定义损失函数。 根据带有噪声的线性模型构造一个人造数据集。任务是使用这个数据集来恢复模型的参数。我们使用低维数据,可以更容易地

    2024年02月15日
    浏览(25)
  • 动手学深度学习——线性回归从零开始

    生成数据集 synthetic_data() 读取数据集 data_iter() 初始化模型参数 w, b 定义模型:线性回归模型 linreg() 定义损失函数:均方损失 squared_loss() 定义优化算法:梯度下降 sgd() 进行训练:输出损失 loss 和估计误差

    2024年02月15日
    浏览(25)
  • 《动手深度学习》 线性回归从零开始实现实例

    🎈 作者: Linux猿 🎈 简介: CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬 本文是《动手深度学习》线性回归从零开始实现实例的实现和分析。 实现代码

    2024年02月11日
    浏览(31)
  • 机器学习&&深度学习——RNN的从零开始实现与简洁实现

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——循环神经网络RNN 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 我们将在之前所说的《时光机器》数据集上训练,先读取数据集: 回想一下,在train_iter中,每个词

    2024年02月13日
    浏览(30)
  • pytorch 40 分享从0开始构建一个独立的深度学习项目

    都2023年了,估计没有几个人会自己独立从0开始构建深度学习项目的了,全是依赖现有的开源库进行项目研制开发。这里回顾几年的工作经验,对构建深度学习项目进行初步梳理。 通常深度学习任务都被描述为:假设函数、损失函数和迭代函数。假设函数一般是我们的模型,

    2024年02月09日
    浏览(42)
  • 【自学宝典】从零开始自学网络安全,按照这个路线就可以了

    很多零基础朋友开始将网络安全作为发展的大方向,的确,现如今网络安全已经成为了一个新的就业风口,不仅大学里开设相关学科,连市场上也开始大量招人。那么网络安全到底前景如何?大致从市场规模、政策扶持、就业方向、薪资待遇等方面来判断。 在工信部《网络安

    2024年02月13日
    浏览(32)
  • 基于Windows系统的Hadoop伪分布式模式部署-从零开始(我的学习记录)

    目录 前言 一.JDK的下载安装配置 1.JDK 下载 2.JDK 安装 3.JDK 环境变量配置 4.验证JDK安装是否成功 5.重点? 二.Hadoop部署以及工具集winutils 1.下载Hadoop解压/下载winutils以及\\\"安装\\\"         下载Hadoop和winutils         \\\"安装\\\"winutils 2.配置Hadoop环境变量/配置Hadoop文件 Hadoop配置环境变量

    2024年04月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包