我的创作纪念日——创作者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,而且文章内容颇为专业,很多问题也都有专业的回答ÿ…...
大数据之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)跨站请求伪造,是一种网络安全攻击,其目标是利用被攻击者在…...
图解三傻排序 选择排序、冒泡排序、插入排序
(1)选择排序 // 交换 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:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉…...
后端Java日常实习生面试(2023年11月10日)
面试岗位为:Java 后端开发实习生 面试时长:30分钟 面试时间:2023年11月10日 首先介绍一下项目吧 这里介绍时有一个失误,没有主动把屏幕共享给打开,因为我在面试之前已经在 processon 上画好了项目的流程图…...
使用iperf3在macOS上进行网络性能测试
iperf3是一个用于测量网络性能的工具,它可以帮助你了解两台服务器之间的带宽和延迟。本博客将指导你在macOS上安装iperf3,并展示如何连接服务器进行网络性能测试。 步骤1:安装Homebrew 如果你尚未安装Homebrew,可以通过以下步骤…...
09-MySQL主从复制
01-主从复制原理 MySQL主从复制是一种用于实现数据备份、读写分离和扩展性的技术。它基于二进制日志(Binary Log)来将主数据库上的更改操作同步到一个或多个从数据库。 MySQL主从复制的基本原理如下: 主服务器(Master࿰…...
virtualBox虚拟机局域网访问配置
在VirtualBox中,桥接网络是一种网络连接类型,它允许虚拟机连接到物理网络上的路由器或交换机,在物理网络上获得独立的网络地址和访问权限。 一、设置VirtualBox桥接网络的步骤: 打开VirtualBox软件,并选择你想要配置…...
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配置文件,项目是前后端分离的,前端vue,后端springboot 前端使用nginx实现双机负载,前端的访问端口是95280,后端2个服务实例的端口分部为9098,9099 nginx.conf的配置文件 #user root; worker_processes 1;#err…...
ARMday03(寄存器读写、栈、程序状态寄存器、软中断和异常、混合编程)
单寄存器内存读写指令 将一个寄存器中的数值写入到内存,或者从内存中读取数据放在某一个指定寄存器中 指令码和功能 1.向内存中写: str{条件码} 目标寄存器,[目标地址]:将目标寄存器的4字节数值写入到目标地址为首地址的空间中 strh{条件码…...
Excel中功能区的存放位置很灵活,可以根据需要隐藏或显示
在这个简短的教程中,你将找到5种快速简单的方法来恢复Excel功能区,以防丢失,并学习如何隐藏功能区,为工作表腾出更多空间。 功能区是Excel中所有操作的中心点,也是大多数可用功能和命令所在的区域。你觉得功能区占用了你太多的屏幕空间吗?没问题,只需单击鼠标,它就被隐…...
HelloGitHub 社区动态,开启新的篇章!
今天这篇文章是 HelloGitHub 社区动态的第一篇文章,所以我想多说两句,聊聊为啥开启这个系列。 我是 2016 年创建的 HelloGitHub,它从最初的一份分享开源项目的月刊,现如今已经成长为 7w Star 的开源项目、1w 用户的开源社区、全网…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
华为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节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
【 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 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 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创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
