自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(671)
  • 问答 (4)
  • 收藏
  • 关注

原创 10、jenkins实现基础的CD操作

jenkins实现基础的CD操作。第四步、jenkins使用build with Parameters了,构建指定的版本

2024-06-08 18:02:47 237

原创 9、 Jenkins实现基础CI操作

第四步、构建好后,让jenkins将jar包推送到我们的目标服务器(docker运行起来)

2024-06-07 02:27:30 1231

原创 6、 Jenkins介绍(持续集成、持续部署(CI、CD))

持续集成、持续部署(CI、CD)说明!!!!CI阶段(持续集成(每次都是开发最新的代码))代码可以持续的集成到我们的主干上,并自动构建和测试名词说明集成到我们的主干: 也就是永远是最新的提交的代码自动构建和测试: 也就是例如镜像可以自动的放置到私库harbor中,并且测试服务器自动拉取镜像启动镜像。完全不需要测试的手动操作。我们的操作只有两步:1、开发push代码,我们的操作只有两步:1、开发push代码,2、jenkins构建操作(拉取代码,构建代码,推动到目标服务器(测试服务器)自动跑起来)

2024-06-02 23:09:01 490

原创 2、Devops管理软件生命周期

PLAN:开发团队根据产品需求指定开发计划CODE:根据plan后开始编写代码,并提交不同的版本。BUILD:编码成功后(Maven或者image),将代码打包并给放置到私库中(jar包/docker镜像都可以,例如harbor)TEST: 成功构建项目后,拉取对心的harbor中的镜像进行测试代码是否存在bug或者错误DEPLOY(部署):代码在经过手动测试,自动化测试后,任务代码已经稳定了,就会交给运维团队OPERATE(运转):运维团队将代码部署到生产环境中MONITOR:项目部署上线后需

2024-06-02 01:02:38 448

原创 4、DDD架构建模(实现面向对象模型(停车场案例))

根据我们的需求输入我们面向对象领域模型uml,(是没有发生系统改变,但是我们若是放置到查询模块就把逻辑泄漏出去了,而且此并不是一个复杂查询所以此处放置到命令模块)进场,出场,付费事件可以得出。由进场出场事件可以得出。进场出场失败事件得出。

2024-03-10 14:29:22 531

原创 3、DDD与CQRS(命令与查询分开)

CQRS(命令和查询职责分离)职责分离(架构上做分解,也就是一个查询模块,一个命令模块(查询模块依赖命令模块))1、查询模块依赖命令模块我们一般都是稳定的去依赖不稳定的了,查询模块是稳定的,命令模块是不稳定的了2、查询和命令模块,不是简单的读写分离,用来构造一些什么需要读取数据结构的也是属于查询模块的(也就是组装也是在查询模块来做的)3、查询模块和命令模块使用的数据库或者表可以相同也可以不相同,甚至与可以是不同的类型数据库

2024-03-09 17:39:11 690

原创 2、DDD六边形架构

代码名称清晰,代码参数清晰我们不能根据参数是如何组装数据的debug才知道这个代码是干什么的,例如代客下单,那么我们需要命名为createOrderForCustomerBySystem(CustomerID),而不能是createOrder(id)这样(RPC调用)就会很不清晰。我们得debug才知道情况

2024-03-09 17:38:00 403

原创 1、DDD架构核心方法论

软件设计应该被领域来驱动(也就是领域驱动模型,模型驱动软件设计)领域: 产品需求的问题域模型:是具体写代码设实体类前的挖掘需求和如何设计的考量思考,其中的产出可能就是我们的uml图,或者就在我们脑海中没有具体的uml产出。软件设计: 具体的写实体类了,写对应方法了如何来解释上面的这句话,软件设计就是我们要写的代码,模型就是我们再写代码前的思考架构建立的模型。例如,我们的整体产品是创建一台全知全能的机器人,其中这个机器的一个领域就是说话,那么我们就对说话这个功能进行建模,其中需要机器人id来定位机器人

2024-03-09 15:04:24 538

原创 11、高性能架构(CAP理论)

在分布式系统中,在其中的读写操作中,我们想要操作的有三种特性(一致性(C)、可用性(A)、分区容错性(P))但是我们只能保证其中三者中的两个,另外一个是肯定会被牺牲的一致性(C)Consistency :就是对应我们客户端来说每次从数据库得到的都是最新的数据,写的什么数据,我就需要读到什么数据。可用性(A)Availablity :一个好的节点(服务器或者说数据库),在合理的时间返回正确的响应(不能是错误的响应的超时的响应,不然这个节点就不是一个好的节点了)分区容错性(P)Parttion Toler

2023-09-16 22:03:10 184

原创 22、7大参数自定义线程池(核心线程数,最大核心线程数。。。拒绝策略(4种))

第二种拒绝策略:(CallerRunsPolicy(哪来的去哪里))这里我们是main线程创建的,所以就是main线程去处理。第一步:5个人进去(2个核心数处理,3个再阻塞队列里面,最大5个个核心线程数(3个在等待阻塞队列满了唤醒))第三个拒绝策略(DisCarPolict(队列满了,丢掉任务(不处理)不会抛出异常))第二步:进去6个人(就会使用2个核心线程和,一个最大线程数里的了,(3个再阻塞队列里))7大参数模型:(这里也说下线程池的运行逻辑)走this方法里(可以看到有7个参数)

2022-11-16 15:54:06 1350

原创 9、8锁现象彻底的理解锁(锁的只有两个东西,一个是对象,一个是Class模板(static修饰))

问题三:(我们在资源类中在给他一个没有锁的方法。问题7:(一个静态同步方法(static syn(休眠4s)),一个普通同步方法(syn),然后只有一个对象,两个线程使用)(先打电话,再等4s输出发短信)问题8:(一个静态同步方法(static syn(休眠4s)),一个普通同步方法(syn),然后两个实例对象)(还是先打电话,再等4s才是发短信)问题4:(我们准备两个对象,一个线程让对象1去调用发短信(还是睡眠4s的),一个线程让对象2去调用打电话)(这里是先打电话再等4s输出发短信了)

2022-11-15 09:28:30 327

原创 48、Nio(Io模型(异步(异步和同步)))

异步是没有阻塞的,只要异步非阻塞。!!!场景:(完成一次数据交流)电话是同步的:什么交数据交流,一来一回才叫交流。这里的要确定接电话就是获取结果(完成交流),这里是一个线程。微信聊天是异步的:一个人发消息过来是一个线程,我们不用确定接不接消息。我们再回消息才是完成数据交流(两个线程)!!!!我们这里是看前面的阻塞/非阻塞/多路复用是同步还是异步的。例如阻塞是同步的就是同步阻塞。第一步:同步阻塞(阻塞io是同步的),是自己线程发起read,数据复制后还是给的前面的线程(自己得结果所以是同步的)

2022-11-14 17:26:56 458

原创 47、Nio(Io模型(多路复用))

多路复用(最开始就是一个单线程加selector)在select阻塞(等待事件)后,返回的是一堆事件(而不是前面阻塞io一个事件一个事件的返回了),然后就让他再下面循环里全部处理完了。所以他就不用前面的等待连接,等待数据了(select前面是已经等待事件完成了,我们select后只需要马上向下运行即可(不需等待了))。我们在等待事件的时候将所有的等待了。(若是单线程其中,虽然返回的也是一批事件,循环处理,但是其中处理的时候还是一个一个事件处理的,阻塞一个后面也会阻塞,所以我们加多线程去分别处理事件)!!

2022-11-14 17:24:20 297

原创 2、Jvm类加载器和双亲委派机制

双亲委派机制(我们创建一个类,类加载器收到这个类加载的请求,他会先向上找类(委托)),找到后再从最上上面检查是否能够加载这个类,能加载就结束,就使用这个类加载器,若无法加载就抛出异常,让子加载器加载)重复步骤。流程是只有当我们的类被委托到最上面再往下查找加载都没有才会是我们自己的AppClassLoader加载我们自己写的类,然后执行main方法。实践2(可以用我们Student类下面的main方法打印类对象的toSting方法)实践1、(无法用我们写的Sting类的main方法)

2022-11-08 08:48:06 238

原创 28、损失函数(多分类交叉熵损失)

本文探讨了损失函数在分类和回归任务中的应用,重点分析了多分类交叉熵损失函数。损失函数通过比较预测值与真实值的差异来衡量模型质量。在多分类问题中,理论公式使用one-hot编码表示真实概率,而实际实现通常采用更高效的类别索引形式。文章通过PyTorch代码示例展示了两种表示方式的等价性,并对比了多分类与二分类在标签表示上的关键区别:二分类标签为0/1或长度2的one-hot向量,多分类则为0到K-1的整数或长度K的one-hot向量。最后通过具体案例演示了CrossEntropyLoss的计算过程,验证了理论

2025-11-26 16:10:11 532

原创 27、神经网络的搭建流程

本文展示了使用PyTorch搭建神经网络的完整流程:1)定义继承nn.Module的类;2)在__init__中构建网络结构(包含2个隐藏层和输出层);3)实现forward方法定义前向传播路径(使用sigmoid和relu激活函数);4)采用Xavier和Kaiming方法初始化权重。测试部分演示了模型训练过程,包括数据准备、模型实例化和参数统计。结果显示网络包含3层结构,共26个可训练参数,验证了模型构建的正确性。整个过程涵盖了深度学习模型开发的核心步骤。

2025-11-25 10:41:09 556

原创 25、激活函数softmax

摘要:本文介绍了softmax激活函数在多分类问题中的应用,它能将输出转换为概率分布(总和为1),并选取概率最大的类别作为结果。文章建议隐藏层使用ReLU激活函数,输出层针对二分类用sigmoid、多分类用softmax。通过PyTorch代码示例展示了softmax的计算过程:当输入值差异较大时(如[0.1,0.3,0.3,0.4,0.8])会得到不均衡的概率分布;当输入值相同时(如全0.1)则输出均匀分布。测试结果验证了softmax的特性。

2025-11-24 17:04:41 132

原创 26、神经网络参数初始化

本文介绍了神经网络参数初始化的目的和方法。初始化主要解决梯度消失/爆炸问题,提高收敛速度,并破除对称性。常见方法包括均匀分布、正态分布、全0/全1、固定值初始化,以及专为特定激活函数设计的Kaiming(适合ReLU)和Xavier(适合Sigmoid/Tanh)初始化。通过PyTorch代码示例演示了7种初始化方式的实际应用,包括uniform_()、normal_()、zeros_()、ones_()、constant_()、kaiming系列和xavier系列,并展示了各方法生成的权重矩阵效果。测试结

2025-11-24 17:02:44 663

原创 24、模拟线性回归

摘要:本文详细介绍了使用PyTorch实现线性回归模型的完整流程。首先通过make_regression生成模拟数据,包含100个样本点并添加噪声。然后创建TensorDataset和DataLoader进行数据分批处理。模型采用nn.Linear(1,1)结构,使用MSELoss作为损失函数和SGD优化器。训练过程包括前向传播、损失计算、反向传播和参数更新等步骤。实验结果显示,经过100轮训练后,模型权重从初始值27.48收敛到27.63,偏置从14.5收敛到13.88。文章还展示了损失函数下降曲线和模型

2025-11-23 21:46:19 816

原创 23、激活函数ReLu

ReLU激活函数通过f(x)=max(0,x)实现非线性变换,其梯度在x>0时为1,训练效率高且能缓解梯度消失问题。虽然存在神经元死亡风险(x≤0时梯度为0),但这也起到一定防过拟合作用。通过He初始化等方法可使大部分神经元保持激活状态(x>0),从而梯度基本为1。ReLU特别适合深层网络的隐藏层,因其计算简单且能保持较大梯度,有效促进深度网络的训练。

2025-11-23 21:44:53 170

原创 22、激活函数tanh

摘要:Tanh激活函数将输入映射到(-1,1)区间,导数范围为(0,1),能有效缓解梯度消失问题,收敛速度比Sigmoid快。但因其输出范围较小,仍可能发生梯度消失,故更适合浅层神经网络。建议在隐藏层使用Tanh,输出层使用Sigmoid。该组合能平衡梯度传播和输出稳定性,提升网络训练效率。(99字)

2025-11-23 21:44:06 136

原创 21、激活函数Sigmoid

摘要:Sigmoid激活函数将输入wx+b映射到(0,1)区间,在[-3,3]区间变化明显。其导数在|x|>6时趋近0,导致权重更新停滞,5层网络就会出现梯度消失(0.25^5≈0.0009)。该函数适用于二分类,当x=0时输出0.5,此时导数最大为0.25。通过二次求导可找到导数函数的极值点。Sigmoid的梯度消失问题限制了其在深层网络中的应用。

2025-11-22 11:06:05 98

原创 20、激活函数介绍

2025-11-22 11:05:09 123

原创 19、如何构建神经网络

人工神经网络(ANN)由多个相互连接的神经元组成,每个神经元包含加权求和(z=wx+b)和激活函数(f(z))两部分。输入层神经元数量等于输入特征数,权重w各不相同以保证训练效果。神经网络采用全连接方式,前层输出作为后层输入。核心特点包括:正向传播时的加权求和与激活函数处理,以及反向传播时的误差调整。这种结构通过线性回归与非线性激活(如sigmoid)相结合,实现从特征到概率的映射。

2025-11-22 11:04:18 185

原创 18、自动微分的完整案例

本文演示了使用PyTorch实现线性回归模型的训练过程。首先定义输入数据x(2×5张量)和目标值y(2×3张量),根据矩阵乘法规则初始化权重w(5×3)和偏置b(3)。通过正向传播计算预测值z=wx+b,使用均方误差损失函数比较预测值与真实值。反向传播自动计算梯度后,按照w_new = w_old - 学习率*梯度的方式更新参数。测试结果显示权重w和偏置b在梯度下降后得到更新,验证了整个训练流程的正确性。关键点包括矩阵维度匹配、自动微分机制和梯度下降参数更新。

2025-11-20 17:37:16 279

原创 17、自动微分的detach方法

摘要:本文介绍了PyTorch中自动微分的detach方法。当张量设置requires_grad=True后,无法直接转为numpy数组,但使用detach()后可实现转换且共享内存。通过测试代码演示了detach的使用效果:1)原始张量w1和detach后的w2共享内存;2)w1保持自动微分属性而w2不保留;3)成功将detach后的张量转为numpy数组。结果表明detach在保持计算图分离的同时,方便了张量与numpy的互操作。

2025-11-20 17:35:55 205

原创 16、自动微分案例(循环更新权重参数)

摘要:该代码演示了使用PyTorch实现循环梯度下降的过程。通过100次迭代优化权重参数w,损失函数为w²+20。关键步骤包括:1)每次迭代前清零梯度;2)计算损失并进行反向传播;3)按学习率0.01更新权重。初始权重为10.0,经过100次训练后降至1.326,损失值从120降至21.83,梯度从20降至2.707,表明算法有效收敛。代码展示了自动微分在优化问题中的应用,以及梯度下降法的基本实现流程。

2025-11-20 17:35:04 126

原创 15、自动微分案例(更新一个w权重参数)

本文探讨了深度学习中Loss函数必须为标量的原因及实现方式。要点包括:1) 标量(单一数值)与向量/矩阵的区别;2) 通过sum求和将多维输出转为标量的必要性,因为梯度下降需要一个明确的优化目标;3) 对比求和与最大值方法的优劣,求和能保留所有样本信息实现均衡优化,而最大值方法会导致梯度稀疏和信息损失;4) 实际PyTorch示例展示了标量Loss的反向传播过程。最终强调,求和作为标准方法能确保模型综合考虑所有数据,实现稳定训练。

2025-11-20 17:34:03 790

原创 14、自动微分模块

本文介绍了机器学习中基本的正向传播和反向传播原理。正向传播通过y=wx+b计算预测值,其中x为特征输入,w为权重,b为偏置。反向传播通过损失函数求导(梯度)更新参数:w和b根据学习率与梯度进行调整。文章重点区分了一元与多元线性回归:一元仅有一个自变量x(如房价仅考虑面积),多元有多个自变量(如同时考虑面积、卧室数和房龄)。最后讨论了学习率的动态调整,从固定值到更高级的调度器(如指数衰减、余弦退火)和自适应优化器(如Adam),这些方法使学习率能够根据训练过程动态变化。

2025-11-20 17:32:41 898

原创 13、张量的拼接

摘要:PyTorch中的张量拼接操作分为cat和stack两种方式。cat操作允许在指定维度拼接不同大小的张量(其他维度必须相同),而stack操作会在新维度上连接形状完全相同的张量,新维度的大小等于输入张量的数量。通过具体示例展示了stack在不同维度(dim=0,1,2)上的拼接结果,并详细解释了stack的内存布局原理:采用行优先顺序遍历,最右侧维度变化最快。结果表明,stack操作会按照输入张量顺序将对应位置的元素组织到新增维度中。

2025-11-20 17:31:25 940

原创 12、张量的形状操作

文章摘要: 本文系统介绍了PyTorch中的张量形状操作方法,包括reshape、unsqueeze、squeeze、transpose和permute等功能。重点分析了view()和reshape()的区别:view()要求张量内存连续且总是返回视图,性能更高但限制严格;reshape()自动处理不连续情况,更安全灵活。通过代码示例演示了各操作的具体用法,并提出最佳实践建议:在确定张量连续时使用view(),不确定时使用reshape()。同时展示了如何通过contiguous()方法处理不连续张量,以及

2025-11-20 17:30:27 414

原创 11.张量的索引操作

本文介绍了张量索引操作的四种方法:1)简单行列索引通过单索引或冒号选择行/列;2)列表索引通过指定行列组合提取特定位置元素;3)布尔索引通过条件掩码筛选满足条件的行;4)多维索引解析了3D张量的结构层次(0维矩阵数量、1维行、2维列)。重点说明了索引对应关系、布尔索引的三步实现过程,以及如何理解2×3×4张量中各维度的含义和访问方法,包括完整张量结构的可视化展示。

2025-11-18 14:06:05 946

原创 10.张量的运算函数

本文介绍了PyTorch中张量运算函数的分类及使用方法。包含dim参数的函数(如sum、max、min、mean)可按行/列操作,其中dim=0表示列操作,dim=1表示行操作。不包含dim参数的函数(如pow、sqrt、exp、log等)则对张量所有元素执行相同运算。通过示例代码展示了各类函数的实际应用效果,包括求和、最大值、平均值等列/行运算,以及幂运算、平方根、指数和对数等逐元素运算。输出结果直观展示了不同运算对张量的影响。

2025-11-17 18:53:22 336

原创 9.张量的点乘和乘法

本文演示了PyTorch中张量的点乘和矩阵乘法操作。点乘要求两个张量形状完全相同(对应位置相乘),使用*或.mul()实现;矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数,使用@或.matmul()实现。示例中展示了二维张量的点乘(demo_1)、矩阵乘法(demo_2)和一维张量的点积计算(demo_3)。特别说明.dot()仅适用于一维张量。输出结果验证了不同运算方式的等价性,如点乘结果t3与t4相同,矩阵乘法结果t3与t4一致,以及一维点积结果为14。

2025-11-17 18:52:23 436

原创 8.张量的基本运算

摘要:本文演示了PyTorch张量的基本运算add/sub/mul/div/neg及其带下划线的版本(add_/sub_等)的区别。普通运算不修改原张量,而带下划线的版本会就地修改原数据。通过多个t1-t7张量的运算结果对比,展示了t1在执行add_操作后被修改,而其他普通运算如sub/mul等则保持t1不变。所有运算结果都通过print语句验证,清晰展示了带下划线操作符的就地修改特性。

2025-11-17 18:51:42 241

原创 7.张量和numpy之间的相互转换

PyTorch张量和NumPy数组转换时存在两种内存共享方式:1)共享内存(零拷贝)使用t1.numpy()和torch.from_numpy(),转换后对象指向同一内存地址,修改其一将同步影响另一个;2)非共享内存(深拷贝)使用t1.numpy().copy()和torch.tensor(),创建独立副本。标量张量可通过item()提取Python值。零拷贝是高效的浅拷贝实现方式,直接内存映射而不复制数据。测试代码展示了这两种方式在修改时的不同表现。

2025-11-17 18:50:29 369

原创 6.内容大纲

PyTorch张量操作与回归建模摘要:本文介绍了PyTorch中张量的核心操作,包括类型转换、算术运算、索引访问和形状变换等基本功能。重点讲解了张量拼接和自动微分机制,这是实现深度学习模型的关键技术。最后通过一个回归模型示例,展示了如何利用PyTorch搭建完整的机器学习流程。这些操作为构建复杂神经网络奠定了基础。

2025-11-17 18:49:33 285

原创 5.创建张量方式总结

PyTorch提供了多种创建张量的方法:1)线性张量(tensor,arange,linspace);2)随机张量(rand,randn,randint),可通过seed控制随机性;3)指定值张量(zeros,ones,full)。张量支持多种数据类型转换(float,double,int等)。其中arange左闭右开,linspace左右闭区间。随机数种子分自动(initial_seed)和手动(manual_seed)设置方式。rand生成[0,1)均匀分布,randn生成标准正态分布。

2025-11-17 09:07:02 247

原创 4.张量元素转换

本文演示了PyTorch张量的数据类型转换方法。首先创建了一个float32类型的张量t1,然后将其转换为int32类型得到t2。接着展示了将t2转换为不同数据类型的方法,包括half()(float16)、float()(float32)、double()(float64)、short()(int16)、int()(int32)和long()(int64)等常用类型转换操作。这些方法可以方便地在不同的数值精度需求之间进行转换,适用于深度学习模型训练和数据处理场景。

2025-11-17 09:05:52 295

原创 3.创建线性和随机张量

摘要:本文介绍了PyTorch中创建线性和随机张量的主要方法。线性张量可通过torch.arange(左闭右开)和torch.linspace(左闭右闭)创建。随机张量则使用torch.rand(均匀分布)、torch.randn(正态分布)等函数生成,并通过torch.manual_seed设置随机种子确保可重复性。文章比较了两种分布的特征差异:均匀分布在[0,1)区间呈平坦矩形,正态分布在(-∞,+∞)区间呈钟形曲线,均值0.5,标准差约0.289。文末展示了使用示例代码。

2025-11-17 09:04:20 275

JUC最详细思维导图,一次了解读写锁,可重入锁,Cas原理,volatile 关键字原理

JUC最详细思维导图,一次了解读写锁,可重入锁,Cas原理,volatile 关键字原理

2023-06-27

扫雷图片资源,需要自取 关注点赞收藏

扫雷图片资源

2023-06-04

扫雷源码,需要自取,关注点赞收藏

扫雷源码

2023-06-04

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除