自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 自己动手实现深度学习框架-8 RNN文本分类和文本生成模型

代码仓库: https://github.com/brandonlyg/cute-dl目标        上阶段cute-dl已经可以构建基础的RNN模型。但对文本相模型的支持不够友好, 这个阶段的目标是, 让框架能够友好地支持文本分类和本文生成任务。具体包括:添加嵌入层, 为文本寻找高效的向量表示。添加类别抽样函数, 根据模型输出的类别分布抽样得到生成的文本。使用imdb-review数据集验证文本分类模型。使用一个古诗数据集验证文本生成模型。&n

2020-06-15 11:03:04 735

原创 自己动手实现深度学习框架-7 RNN层--GRU, LSTM

代码仓库: https://github.com/brandonlyg/cute-dl目标        这个阶段会给cute-dl添加循环层,使之能够支持RNN–循环神经网络. 具体目标包括:添加激活函数sigmoid, tanh.添加GRU(Gate Recurrent Unit)实现.添加LSTM(Long Short-term Memory)实现.使用基于GRU和LSTM的RNN模型拟合一个正余弦叠加函数.RNN原理原始的RNN&nbsp

2020-06-08 15:30:14 891

原创 自己动手实现深度学习框架-6 卷积层和池化层

代码仓库: https://github.com/brandonlyg/cute-dl(转载请注明出处!)目标        上个阶段使用MLP模型在在MNIST数据集上实现了92%左右的准确率,达到了tensorflow同等模型的水平。这个阶段要让cute-dl框架支持最简单的卷积神经网络, 并在MNIST和CIFA10数据上验证,具体来说要达到如下目标:添加2D卷积层。添加2D最大池化层。CNN模型在MNIST数据集上达到99%以上的准确率。CNN

2020-05-18 18:04:47 728

原创 自己动手实现深度学习框架-5 使用学习率优化器加快模型训练速度

代码仓库: https://github.com/brandonlyg/cute-dl目标增加学习率优化器, 加快模型在小学习率下模型的训练速度。使用MNIST数据集比较同一个模型使用不同学习率优化器的表现。常见的学习率优化算法        在上个阶段,我们使用固定学习率优化器训练识别MNIST手写数字模型。在后面的示例中将会看到: 如果学习...

2020-04-27 17:20:47 553

原创 自己动手实现深度学习框架-4 使用交叉熵损失函数支持分类任务

目录目标实现交叉熵损失函数数学原理分解交叉熵损失函数梯度推导交叉熵损失函数的特殊情况: 只有两个类别实现代码在MNIST数据集上验证总结代码仓库: https://github.com/brandonlyg/cute-dl目标增加交叉熵损失函数,使框架能够支持分类任务的模型。构建一个MLP模型, 在mnist数据集上执行分类任务准确率达到91%。实现交叉熵损失函数数学原理分解交...

2020-04-21 17:08:19 316

原创 自己动手实现深度学习框架-3 自动分批训练, 缓解过拟合

目录目标实现自动分批训练设计方案fit方法fit方法触发的事件训练历史记录(history)代码fit方法实现实现L2正则化参数优化器设计方案数学原理代码增强Optimizer功能实现L2正则化优化器在Session中支持广义参数优化器实现随机丢弃层: Dropout数学原理代码验证对比基准使用L2优化器缓解过拟合使用Dropout层缓解过拟合总结代码仓库: https://github.com...

2020-04-16 12:25:48 873

原创 自己动手实现深度学习框架-2 核心实现

目录目标框架代码简介层(Layer)和层参数(LayerParam)激活函数(Activation)模型(Model)训练上下文会话(Session)损失函数(Loss)学习率优化器(Optimizer)MLPS示例验证1: 使用线性模型拟合目标函数验证2:使用同样多参数的非线性模型拟合目标函数验证3: 增加模型复杂度减少训练数据验证3: 仍然使用较少的训练数据但降低模型的复杂度总结目标&n...

2020-04-13 11:59:51 786

原创 自己动手实现深度学习框架-1 架构设计

前言   随着tensorflow2的发布, 构建一个复杂的深度学习模型变得容易很多,与此同时更多的原理及细节被隐藏起来了,很容易让人知其然而不知其所以然。如果要了解那些隐藏在简单表象下的原理和细节,首先想到的是阅读它的代码。然而这并不是一件容易的事,核心原理相关代码淹没在大量工程优化代码中,让人很难抓出要点。例如tensorflow使用了GPU技术用来加速模型的训...

2020-04-10 17:20:13 1146

原创 scrapy Selector用法及xpath语法

准备工作html示例:<?xml version="1.0" encoding="UTF-8"?><html<head> <title>text</title></head><body><div class="cdiv"> <p class="cp1 section"&...

2020-04-07 16:56:27 3085

原创 使用scrapy-selenium, chrome-headless抓取动态网页

    在使用scrapy抓取网页时, 如果遇到使用js动态渲染的页面, 将无法提取到在浏览器中看到的内容. 针对这个问题scrapy官方给出的方案是scrapy-selenium, 这是一个把selenium集成到scrapy的开源项目, 它使用selenium抓取已经渲染好(js代码已经执行完成)的动态网页.   &nbs...

2020-03-31 22:22:32 317

原创 pyplot概述

        matplotlib.pyplot 是命令行风格的函数集,让matplotlib看起来像MATLAB.Each一样工作。pyplot函数能够对画布(figure)进行一些改变,例如:创建一个画布(figure), 在画布中创建一个绘图区域,在绘图区域中画图,使用文字标签修饰图形。        mat...

2019-12-17 15:33:15 294

原创 Logistic回归算法梯度公式的推导

最近学习Logistic回归算法,在网上看了许多博文,笔者觉得这篇文章http://blog.kamidox.com/logistic-regression.html写得最好。但其中有个关键问题没有讲清楚:为什么选择-log(h(x))作为成本函数(也叫损失函数)。和线性回归算法相比,逻辑回归的预测函数是非线性的,不能使用均方差函数作为成本函数。因此如何选择逻辑回归算法的成本函数,就要多费一些事...

2019-12-04 15:23:04 529

原创 Matplotlib入门简介

Matplotlib是一个用Python实现的绘图库。现在很多机器学习,深度学习教学资料中都用它来绘制函数图形。在学习算法过程中,Matplotlib是一个非常趁手的工具。一般概念图形(figure)类似于画布,它包含一个或多个子坐标系(axes)。至少有一个坐标系才能有用。下面是一段简单的示例代码,只是创建了一个子坐标系import matplotlib.pyplot a...

2019-11-27 14:33:56 131

原创 netty源码解析(4.0)-29 Future模式的实现

  Future模式是一个重要的异步并发模式,在JDK有实现。但JDK实现的Future模式功能比较简单,使用起来比较复杂。Netty在JDK Future基础上,加强了Future的能力,具体体现在:更加简单的结果返回方式。在JDK中,需要用户自己实现Future对象的执行及返回结果。而在Netty中可以使用Promise简单地调用方法返回结果。 更加灵活的结果处理方式。JDK中只提供了主...

2019-11-20 15:13:18 425

原创 netty源码解析(4.0)-28 ByteBuf内存池:PooledByteBufAllocator-把一切组装起来

  PooledByteBufAllocator负责初始化PoolArena(PA)和PoolThreadCache(PTC)。它提供了一系列的接口,用来创建使用堆内存或直接内存的PooledByteBuf对象,这些接口只是一张皮,内部完全使用了PA和PTC的能力。初始化过程分两个步骤,首先初始化一系列的默认参数,然后初始化PTC对象和PA数组。默认参数和它们的值  DEFAULT_...

2019-11-05 16:13:09 430

原创 netty源码解析(4.0)-27 ByteBuf内存池:PoolArena-PoolThreadCache

  前面两章分析的PoolChunk和PoolSubpage,从功能上来说已经可以直接拿来用了。但直接使用这个两个类管理内存在高频分配/释放内存场景下会有性能问题,PoolChunk分配内存时算法复杂度最高的是allocateNode方法,释放内存时算法复杂度最高的是free方法。 PoolChunk中二叉树的高度是maxOrder, 那么算法负责度是O(maxOrder),netty默认的ma...

2019-10-29 15:27:05 207

原创 后台开发技术(2)--接入层设计

通常把跟客户端直连的服务器称为接入服务器,一个或多个接入服务器构成的接入层。接入层有以下功能:维护与客户端之间的网络连接,管理客户端的网络状态。 接收客户端请求,将请求转发到业务层,转发业务层发给客户端的数据。 就近接入,负载均衡,优化网络体验。这里可以发现,如果把接入层跟业务层合并也可以实现以上的功能,而且节省了实现功能2需要的工作量,根据简单性原则,接入层不应该被独立出来。对于一个功...

2019-10-24 15:13:53 550

原创 netty源码解析(4.0)-26 ByteBuf内存池:PoolArena-PoolSubpage

  PoolChunk用来分配大于或等于一个page的内存,如果需要小于一个page的内存,需要先从PoolChunk中分配一个page,然后再把一个page切割成多个子页-subpage,最后把内存以subpage为单位分配出去。PoolSubpage就是用来管理subpage的。  一个page会被分割成若干个大小相同的subpage,subpage的的大小是elemSize。elemSi...

2019-10-22 16:04:39 158

原创 后台开发技术(1)--概述

说到后台开发,首选就有一个问题:什么是后台开发。就我理解,就是做服务器端开发。在服务器端运行着不同功能的服务,有直接与客户端连接的,有实现某一特定业务的比如用户注册登录,有数据存储的如基于mysql,memcached,redis等做的存储系统,除此之外还有一些满足运维监控系统,运营统计系统等。那么后台开发需要哪些技术呢?回答这个问题之前先来看看一般的后台系统架构,如下图所示:后台系...

2019-10-17 09:51:54 628 1

原创 netty源码解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk

  PoolArena实现了用于高效分配和释放内存,并尽可能减少内存碎片的内存池,这个内存管理实现使用PageRun/PoolSubpage算法。分析代码之前,先熟悉一些重要的概念:page: 页,一个页是可分配的最小的内存块单元,页的大小:pageSize = 1 << n (n <= 12)。 chunk: 块,块是多个页的集合。chunkSize是块中所有page的p...

2019-10-16 10:07:04 190

原创 netty源码解析(4.0)-24 ByteBuf基于内存池的内存管理

 io.netty.buffer.PooledByteBuf<T>使用内存池中的一块内存作为自己的数据内存,这个块内存是PoolChunk<T>的一部分。PooledByteBuf<T>是一个抽象类型,它有4个派生类:PooledHeapByteBuf,PooledUnsafeHeapByteBuf 使用堆内存的PooledByteBuffer<by...

2019-10-09 15:54:44 271

原创 bootstrap 通过js代码创建和关闭插件

插件的创建机制默认情况下,boostrap.js文件被页面加载执行完成后,boostrap会自动根据html元素的data-toggle属性和相关class创建插件对象。有时候,我们不希望boostrap插件的行为影响到整个页面,希望可以精准地在一个 指定的html元素上创建插件。要想达到这个目的,需要两个步骤:1. 关闭插件的默认行为。2. 在指定的html元素重新创插件。...

2019-10-09 15:41:43 188

原创 jquery事件

jquery Event对象的属性和方法currentTarget当前的dom对象data绑定事件处理器时设置的数据:target.on("click", {value:“this is data”}, function(e){console.log(e.data.value);});输出: this is datadelegateTarget...

2019-10-09 15:40:00 140 1

原创 使用gitlab, jenkins搭建CI(持续集成)系统(4) 灰度发布publish

publish环境是正式环境,和dev, test, prepublish环境不同的是,正式环境一般要更加谨慎一些,发布的时候需要有一个灰度过程,即:分多次部署,每次部署几个服务器节点,验证没有问题以后,再部署几台,直到所有的节点多部署完成。jenkins提供的一种choice parameter的构建参数类型,可以使用这种参数类型实现灰度发布的功能。添加一个名为DEPLOY的choi...

2019-10-09 15:36:30 863

原创 使用gitlab, jenkins搭建CI(持续集成)系统(3) -- 根据不同触发条件执行不同的构建任务

前面在jenkins中安装的gitlab hook支持不同的参数,具体可以参考gitlab hook文档https://github.com/jenkinsci/gitlab-hook-plugin#parameterized-projects。其中BRANCH表示触发构建的分支名,我们可以在构建脚本中使用这个参数,进行不同的构建。要使用这个参数,需要在jenkins中进行配置接下来...

2019-10-09 15:34:22 333

原创 使用gitlab, jenkins搭建CI(持续集成)系统(2) -- 配置webhook触发构建

1. 在gitlab上配置192.168.1.30的ssh秘钥,使jenkins可以操作gitlab上的project  进入gitlab,点击右上角    点击 Settings -> SSH keys 点击Add key, 添加 ssh key2. 在jenkins中配置example-springbootmvc json进入jenkins ...

2019-10-09 15:32:14 172

原创 使用gitlab, jenkins搭建CI(持续集成)系统(1) -- 准备环境

1. 环境设计    搭建一个从开发到测试知道发布上线可以自动换完成的CI系统。这个系统中包含4个环境。  开发(dev)环境: 码农使用。  测试(test)环境: 测试人员使用。  预发布(prepublish)环境: 预发布环境,用于上线前的最后验证。 正式(realpublish)环境: 正式上线运行环境    我期望的效果是这样的:  代码推送到...

2019-10-09 15:29:39 202

原创 netty源码解析(4.0)-23 ByteBuf内存管理:分配和释放

ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机。  内存分配分两个阶段: 第一阶段,初始化时分配内存。第二阶段: 内存不够用时分配新的内存。ByteBuf抽象层没有定义第一阶段的行为,但定义了第二阶段的方法:  public abstract ByteBuf capacity(int newCapacity)  这个方法负责分配一个长度为...

2019-10-05 15:14:50 341

原创 netty源码解析(4.0)-22 ByteBuf的I/O

    整个ByteBuf框架的抽象实现分为两部分:ByteBuf接口的抽象实现:AbstractByteBuf, AbstractReferenceCountedByteBuf。分配器ByteBufAllocator接口的抽象实现: AbstractByteBufAllocator。ByteBuf接口的抽象实现AbstractByteBuf&...

2019-10-04 10:13:11 183

原创 netty源码解析(4.0)-21 ByteBuf的设计原理

ByteBufAbstractByteBufEmptyByteBufSwappedByteBufWrappedByteBufAbstractByteBufAbstractReferenceCountedByteBufCompositeByteBufFixedCompositeByteBufPooledByteBufReadOnlyByteBufferBufCompositeByteBufWra...

2019-10-02 15:38:00 194

原创 netty源码解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端

  本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端。通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决的一些关键问题。  本周章涉及到的代码可以从github上下载:https://github.com/brandonlyg/tinytransport.git。设计协议  本章...

2019-09-30 13:49:34 388

原创 netty源码解析(4.0)-19 ChannelHandler: codec--常用编解码实现

  数据包编解码过程中主要的工作就是:在编码过程中进行序列化,在解码过程中从Byte流中分离出数据包然后反序列化。在MessageToByteEncoder中,已经解决了序列化之后的问题,ByteToMessageDecoder中已经部分第解决了从Byte流中分离出数据包的问题。实现具体的数据包编解码,只需要实现MessageToByteEncoder的encode和ByteToMessageDe...

2019-09-26 20:43:34 214

原创 netty源码解析(4.0)-18 ChannelHandler: codec--编解码框架

编解码框架和一些常用的实现位于io.netty.handler.codec包中。  编解码框架包含两部分:Byte流和特定类型数据之间的编解码,也叫序列化和反序列化。不类型数据之间的转换。  下图是编解码框架的类继承体系:  其中MessageToByteEncoder和ByteToMessageDecoder是实现了序列化和反序列化框架。 MessageToMessage是不同类...

2019-09-24 14:56:24 206

原创 netty源码解析(4.0)-17 ChannelHandler: IdleStateHandler实现

  io.netty.handler.timeout.IdleStateHandler功能是监测Channel上read, write或者这两者的空闲状态。当Channel超过了指定的空闲时间时,这个Handler会触发一个IdleStateEvent事件。  在第一次检测到Channel变成active状态时向EventExecutor中提交三个延迟任务:    ReaderIdleT...

2019-09-17 16:03:23 252

原创 netty源码解析(4.0)-16 ChannelHandler概览

本章开始分析ChannelHandler实现代码。ChannelHandler是netty为开发者提供的实现定制业务的主要接口,开发者在使用netty时,最主要的工作就是实现自己的ChannelHandler。ChannelHandler在设计上需要和ChannelPipeline配合共同实现pipeline的事件传递能力,这要求ChannelHandler需要实现一些固定的基本功能。由于...

2019-09-03 16:56:26 160

原创 netty源码解析(4.0)-15 Channel NIO实现:写数据

写数据是NIO Channel实现的另一个比较复杂的功能。每一个channel都有一个outboundBuffer,这是一个输出缓冲区。当调用channel的write方法写数据时,这个数据被一系列ChannelOutboundHandler处理之后,它被放进这个缓冲区中,并没有真正把数据写到socket channel中。然后再调用channel的flush方法,flush会把outboundB...

2019-08-29 16:01:55 518

原创 netty源码解析(4.0)-14 Channel NIO实现:读取数据

本章分析Nio Channel的数据读取功能的实现。  Channel读取数据需要Channel和ChannelHandler配合使用,netty设计数据读取功能包括三个要素:Channel, EventLoop和ChannelHandler。Channel有个read方法,这个方法不会直接读取数据,它的作用是通知持有当前channel的eventLoop可以从这个这个channel读取数据了...

2019-08-22 16:31:09 559

原创 netty源码解析(4.0)-13 Channel NIO实现: 关闭和清理

Channel提供了3个方法用来实现关闭清理功能:disconnect,close,deregister。本章重点分析这个3个方法的功能的NIO实现。  disconnect实现: 断开连接  disconnect方法的调用栈如下:1 io.netty.channel.AbstractChannel#disconnect()2 io.netty.channel.Defau...

2019-08-20 14:57:41 831

原创 netty源码解析(4.0)-12 Channel NIO实现:channel初始化

创建一个channel实例,并把它register到eventLoopGroup中之后,这个channel然后处于inactive状态,仍然是不可用的。只有在bind或connect方法调用成功之后才能正常。因此bind或connect算是channel初始化的最后一步,本章这就重点分析这两个功能的实现。  接下来的代码分析如果没有特别说明,都是以NioSocketChannel为例。...

2019-08-14 16:32:09 169

原创 netty源码解析(4.0)-11 Channel NIO实现-概览

结构设计  Channel的NIO实现位于io.netty.channel.nio包和io.netty.channel.socket.nio包中,其中io.netty.channel.nio是抽象实现,io.netty.channel.socket.nio最终实现。下面是Channel NIO相关类的派生图:  NIO实现最终派生出3个类型NioServerSocketChannel实...

2019-07-29 16:06:12 186

空空如也

空空如也

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

TA关注的人

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