当前位置: 首页 > 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 用户的开源社区、全网…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...