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

我的创作纪念日——创作者2年

机缘

我最初使用CSDN估计是在2014年左右,当时还在读研,除了在当时比较有名的BBS例如小木虫上进行学术交流外,我发现很多问题百度后,都会转到CSDN,而且文章内容颇为专业,很多问题也都有专业的回答,于是我知道了CSDN(从事多年)网。

2016年毕业后从事汽车研发工作,之后对CSDN的访问频率不降反升,因为工作中遇到的很多实际技术问题,在CSDN上仍能找到很有意义的指导,直到2020年由于CSDN对我来说已经从一个“一次性”的搜索引擎,逐渐变为了需要持续关注的充电站,我注册了CSDN账号。

在2021年左右(或许更早),汽车行业中自动驾驶领域一下出圈走红。神经元网络、机器学习对我来说并不是陌生的概念,早在2010年左右读本科的时候就听说过了,我对此领域也很好奇(用计算机写神经元?这也太酷辣!),但是受限于当时资料太少(以及受到当时硬件性能的限制,深度学习领域也没什么实质性的发展),我仅能了解到一些初级概念,例如BP网络。真是没想到深度学习、人工智能以如此快的速度进入到我的专业领域。以及后来的AIGC,已经改变了我的工作模式!

出于对知识的好奇、对技术的追求(实际上是为了保持职业上的竞争力)我决定潜心研究自动驾驶技术,就从底层的深度学习算法开始。由于我本硕都是机械专业,想进入到深度学习领域还是有许多技术门槛需要征服,于是进行了大量的学习。而我在选择如何记录学习过程时,想到了CSDN的博客功能,机缘巧合在两年前发了第一篇博客(学习笔记)。


收获

最初CSDN博客对我来说仅是一个学习笔记,记录我的学习理解和学习感悟。后来我发现:嘿!CSDN上爱学习的人可真多,我这学习笔记都有人看,这极大地鼓舞了我的学习信心,也坚定了我持续创作的决心。

随着学习的深入,我开始从借鉴别人的代码,逐渐可以自己进行coding。而bug!是真的多次使我血压飙升!我感觉debug就像在大海中游泳,我不知道离岸边还要游多远,最糟糕的是我甚至根本不知道游的方向对不对。而从CSDN上获得的大量灵感,帮助我解决了很多很多bug,这是孤军奋战不可能达到的效果。

教是最好的学。我在解决这些bug,把我的学习过程写成博客帮助别人学习后,我又发现了一些理解不到位,或者有更好方法的地方,这又促进了我的技术能力提升。


日常

我觉得现在已经迈过了门槛期,学习和写博客已经成为了日常生活的一部分,基于PyTorch一些常见的bug已经基本淌过一遍,现在来到了比较稳定的创作期,后续不会像以前创作东一榔头西一棒槌,对于学习路线的规划现在已逐渐清晰。

虽然我希望能尽早完成百篇博客的目标,但我更注重发文的质而不是量,我的要求是每篇文章不讲废话、不讲套话;技术问题直击灵魂,直奔主题;基于实操,不纸上谈兵;要有自己的理解,文章有亮点,不人云亦云,知其然也要知其所以然!


成就

我觉得写的最好的代码是基于NumPy构建LSTM网络模型的代码:

import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plttrain_x = np.linspace(0.01,1,600).reshape(100,6,1)
train_y = train_x * train_x + np.random.randn(100,6,1)/200def sigmoid(x):return 1/(1+np.exp(-x))class HiddenLayer():def __init__(self,input_size, hidden_size):self.w_f = np.random.randn(hidden_size, input_size) #定义各个门的权重, 忘记门self.w_i = np.random.randn(hidden_size, input_size)  #输入门self.w_g = np.random.randn(hidden_size, input_size)    #新记忆门self.w_o = np.random.randn(hidden_size, input_size)   #输出门self.v_f = np.random.randn(hidden_size,hidden_size)self.v_i = np.random.randn(hidden_size,hidden_size)self.v_g = np.random.randn(hidden_size,hidden_size)self.v_o = np.random.randn(hidden_size,hidden_size)self.b_f = np.zeros([hidden_size, 1])    #输入限定为一维向量self.b_i = np.zeros([hidden_size, 1])self.b_g = np.zeros([hidden_size, 1])self.b_o = np.zeros([hidden_size, 1])def forward(self, x, h_pre, c_pre):  #h_pre为h_t-1, c_pre为c_t-1self.Fgate = sigmoid(np.dot(self.w_f, x) + np.dot(self.v_f, h_pre) + self.b_f)self.Igate = sigmoid(np.dot(self.w_i, x) + np.dot(self.v_i, h_pre) + self.b_i)self.Ggate = np.tanh(np.dot(self.w_g, x) + np.dot(self.v_g, h_pre) + self.b_g)self.Ogate = sigmoid(np.dot(self.w_o, x) + np.dot(self.v_o, h_pre) + self.b_o)c_cur = self.Fgate * c_pre + self.Igate * self.Ggate  #c_cur为c_th_cur = self.Ogate * np.tanh(c_cur)return h_cur, c_curdef backward(self, Fgate, Igate, Ggate, Ogate, x, grad_cnext, Fgate_next, grad_hcur, c_cur,c_pre, h_pre):self.grad_ccur = grad_cnext * Fgate_next + grad_hcur * Ogate * (1 - np.tanh(c_cur) * np.tanh(c_cur))self.grad_hpre = self.grad_ccur*(np.dot(self.v_f.T, c_pre*Fgate*(1-Fgate)) + np.dot(self.v_g.T,Igate*(1-Ggate*Ggate)) + np.dot(self.v_i.T,Ggate*Igate*(1-Igate)))self.grad_wf = np.dot(self.grad_ccur * c_pre * Fgate * (1 - Fgate), x.T)  #这里要注意矩阵的转置!!!self.grad_wi = np.dot(self.grad_ccur * Ggate * Igate * (1 - Igate), x.T)self.grad_wg = np.dot(self.grad_ccur * Igate * (1 - Ggate * Ggate), x.T)self.grad_wo = np.dot(grad_hcur*np.tanh(c_cur)*Ogate*(1-Ogate),x.T)self.grad_vf = np.dot(self.grad_ccur * c_pre * Fgate * (1 - Fgate), h_pre.T)self.grad_vi = np.dot(self.grad_ccur * Ggate * Igate * (1 - Igate), h_pre.T)self.grad_vg = np.dot(self.grad_ccur * Igate * (1 - Ggate * Ggate), h_pre.T)self.grad_vo = np.dot(grad_hcur * np.tanh(c_cur) * Ogate * (1 - Ogate), h_pre.T)self.grad_bf = self.grad_ccur * c_pre * Fgate * (1 - Fgate)self.grad_bi = self.grad_ccur * Ggate * Igate * (1 - Igate)self.grad_bg = self.grad_ccur * Igate * (1 - Ggate * Ggate)self.grad_bo = grad_hcur * np.tanh(c_cur) * Ogate * (1 - Ogate)def step(self, lr=0.01):self.w_f = self.w_f - lr * self.grad_wfself.w_i = self.w_i - lr * self.grad_wiself.w_g = self.w_g - lr * self.grad_wgself.w_o = self.w_o - lr * self.grad_woself.v_f = self.v_f - lr*self.grad_vfself.v_i = self.v_i - lr * self.grad_viself.v_g = self.v_g - lr * self.grad_vgself.v_o = self.v_o - lr * self.grad_voself.b_f = self.b_f - lr*self.grad_bfself.b_i = self.b_i - lr * self.grad_biself.b_g = self.b_g - lr * self.grad_bgself.b_o = self.b_o - lr * self.grad_boclass OutputLayer():def __init__(self, hidden_size, output_size):self.w_h = np.ones([output_size, hidden_size])self.b_h = np.zeros([output_size, 1])def forward(self, h_cur):return np.dot(self.w_h, h_cur) + self.b_hdef backward(self,y,h_cur, train_data):delta = y - train_dataself.grad_wh = np.dot(delta, h_cur.T)self.grad_hcur = np.dot(self.w_h.T, delta)self.grad_bh = deltadef step(self, lr=0.001):self.w_h = self.w_h - lr * self.grad_whself.b_h = self.b_h - lr * self.grad_bh
————————————————
版权声明:本文为CSDN博主「使者大牙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_49963403/article/details/130428280

这段代码从Python语法上来说十分简单,没有任何高级的技巧,可能仅学习Python不到一周的新手都能看得懂。但是其让我引以为傲的地方是对LSTM网络反向传播的数学推导,这即使在CSDN上应该也算得上是首创。

这也提醒着我:不是为了会coding而学习coding,是为了要实现算法而学习coding。代码的灵魂在于其背后的算法!

憧憬

目标就是百篇博客吧,成为优质作者,博客专家(多么现实的目标)

相关文章:

我的创作纪念日——创作者2年

机缘 我最初使用CSDN估计是在2014年左右,当时还在读研,除了在当时比较有名的BBS例如小木虫上进行学术交流外,我发现很多问题百度后,都会转到CSDN,而且文章内容颇为专业,很多问题也都有专业的回答&#xff…...

大数据之LibrA数据库系统告警处理(ALM-12032 ommdba用户或密码即将过期)

告警解释 系统每天零点开始,每8小时检测当前系统中ommdba用户和密码是否过期,如果用户或密码即将在15天内过期,则发送告警。 当系统中ommdba用户过期的期限修改或密码重置,告警恢复。 告警属性 告警ID 告警级别 可自动清除 …...

C_3练习题

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1.下列叙述中正确的是()。 A.用C程序实现的算法必须要有输入和输出操作 B.用C程序实现的…...

CentOS7 安装Jenkins 2.414.3 详细教程

目录 1、前提条件硬件软件-java11安装 2、安装jenkins3、启动jenkins配置用户和用户组配置JAVA_HOME 4、配置Jenkins一直处于启动状态5、测试Jenkins是否可以访问以及配置6、访问Jenkins系统 1、前提条件 硬件 内存 4G ; 硬盘 20G 软件-java11安装 上传文件jdk-11.0.21_lin…...

chatglm3-6b记录问答对

# 打开文件,第二个参数是打开文件的模式,a代表追加,也就是说,打开这个文件之后直接定位到文件的末尾 file open(chatlog.txt, "a") # 写入数据 file.write(ask:prompt_text\n) file.write(response:response\n) # 关闭文件 fil…...

k8s ingress 代理 mysql 3306端口

helm 安装 ingress-nginx helm upgrade --install ingress-nginx ingress-nginx \--repo https://kubernetes.github.io/ingress-nginx \--namespace ingress-nginx --create-namespace执行命令 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-ngin…...

Informix管理共享内存

1、查看共享内存使用情况 [informixREHL4 ~]$ onstat -g seg IBM Informix Dynamic Server Version 11.50.UC4 -- On-Line -- Up 00:38:21 -- 144144 Kbytes Segment Summary: id key addr size ovhd class blkused blkfree 393226 …...

Webpack 中 Plugin 的作用是什么?常用 plugin 有哪些?

说说webpack中常见的Plugin?解决了什么问题?- 题目详情 - 前端面试题宝典 1、plugin 的作用 Plugin 是一种计算机应用程序,它和主应用程序互相交互,以提供特定的功能。 是一种遵循一定规范的应用程序接口编写出来的程序&#…...

CSRF(跨站请求伪造)攻击演示

目录 CSRF(跨站请求伪造)攻击演示CSRF 是什么CSRF 演示项目代码CSRF 演示过程服务启动演示 CSRF(跨站请求伪造)攻击演示 CSRF 是什么 CSRF(Cross-Site Request Forgery)跨站请求伪造,是一种网络安全攻击,其目标是利用被攻击者在…...

图解三傻排序 选择排序、冒泡排序、插入排序

&#xff08;1&#xff09;选择排序 // 交换 void swap(int arr[], int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp; }// 选择排序 void selectionSort(int arr[],int len) {if (len < 2) return;for (int minIndex, i 0; i < len - 1; i) {minIndex i;f…...

【数据结构】树与二叉树(六):二叉树的链式存储

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…...

后端Java日常实习生面试(2023年11月10日)

面试岗位为&#xff1a;Java 后端开发实习生 面试时长&#xff1a;30分钟 面试时间&#xff1a;2023年11月10日 首先介绍一下项目吧 这里介绍时有一个失误&#xff0c;没有主动把屏幕共享给打开&#xff0c;因为我在面试之前已经在 processon 上画好了项目的流程图&#xf…...

使用iperf3在macOS上进行网络性能测试

iperf3是一个用于测量网络性能的工具&#xff0c;它可以帮助你了解两台服务器之间的带宽和延迟。本博客将指导你在macOS上安装iperf3&#xff0c;并展示如何连接服务器进行网络性能测试。 步骤1&#xff1a;安装Homebrew 如果你尚未安装Homebrew&#xff0c;可以通过以下步骤…...

09-MySQL主从复制

01-主从复制原理 MySQL主从复制是一种用于实现数据备份、读写分离和扩展性的技术。它基于二进制日志&#xff08;Binary Log&#xff09;来将主数据库上的更改操作同步到一个或多个从数据库。 MySQL主从复制的基本原理如下&#xff1a; 主服务器&#xff08;Master&#xff0…...

virtualBox虚拟机局域网访问配置

在VirtualBox中&#xff0c;桥接网络是一种网络连接类型&#xff0c;它允许虚拟机连接到物理网络上的路由器或交换机&#xff0c;在物理网络上获得独立的网络地址和访问权限。 一、设置VirtualBox桥接网络的步骤&#xff1a; 打开VirtualBox软件&#xff0c;并选择你想要配置…...

IDEA高效编程快捷键

IDEA高效编程快捷键 for循环快捷键 快速生成for循环 foriTABfor (int i 0; i < ; i) {}在for循环中使用索引 iterTABfor (String s : list) {}在for循环中进行if条件判断 ifnTABif (list null) {} soutTAB快捷键 System.out.println();psfEnter快捷键 p…...

nginx实现vue和后端的双机负载

nginx配置文件&#xff0c;项目是前后端分离的&#xff0c;前端vue&#xff0c;后端springboot 前端使用nginx实现双机负载&#xff0c;前端的访问端口是95280&#xff0c;后端2个服务实例的端口分部为9098,9099 nginx.conf的配置文件 #user root; worker_processes 1;#err…...

ARMday03(寄存器读写、栈、程序状态寄存器、软中断和异常、混合编程)

单寄存器内存读写指令 将一个寄存器中的数值写入到内存&#xff0c;或者从内存中读取数据放在某一个指定寄存器中 指令码和功能 1.向内存中写&#xff1a; str{条件码} 目标寄存器,[目标地址]&#xff1a;将目标寄存器的4字节数值写入到目标地址为首地址的空间中 strh{条件码…...

Excel中功能区的存放位置很灵活,可以根据需要隐藏或显示

在这个简短的教程中,你将找到5种快速简单的方法来恢复Excel功能区,以防丢失,并学习如何隐藏功能区,为工作表腾出更多空间。 功能区是Excel中所有操作的中心点,也是大多数可用功能和命令所在的区域。你觉得功能区占用了你太多的屏幕空间吗?没问题,只需单击鼠标,它就被隐…...

HelloGitHub 社区动态,开启新的篇章!

今天这篇文章是 HelloGitHub 社区动态的第一篇文章&#xff0c;所以我想多说两句&#xff0c;聊聊为啥开启这个系列。 我是 2016 年创建的 HelloGitHub&#xff0c;它从最初的一份分享开源项目的月刊&#xff0c;现如今已经成长为 7w Star 的开源项目、1w 用户的开源社区、全网…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...