博客主页 所有文章 标签 关于我
img

poi~

深度学习 / 机器学习

Star

个人站

欢迎来到我的个人站~


  • 博客主页
  • 所有文章
  • 标签
  • 关于我
  1. 实现一个简单的深度学习框架

    导入之前博客介绍过,利用C++ cuda和Cython编写python扩展,实现了手动写矩阵乘法的kernel进而cuBLAS库中矩阵相乘函数cublasSgemm的调用,并且对比了执行速度。现在就再进一步,使用cudnn和cuBLAS一起实现一个简单的深度学习库,包含卷积层,池化层,softmax+损失层,reLu激活层,全连接层的GPU端的前向和反向过程,其中全连接层就是一个矩阵乘法,直接利用cuBLAS的cublasSgemm通用矩阵乘法函数即可,其他层就利用cudnn提供的函数进行...…

    2018-03-15
    阅读全文 »

  2. python的cuda C++扩展

    导入用C++编写简单的CUDA程序,比如矩阵乘法,并且编译成python的扩展供python调用,对比python矩阵乘法计算在CPU端和GPU端的速度差异,以及手写简单的cuda kernel计算和使用cuBLAS库的速度差异。关于cuda的安装和基本的使用语法不是本文内容,主要是直接代码形式给出,不过都是简单的代码,没有什么门槛。cuda kernel简单说一下流程: C++编写cuda kernel,然后nvcc编译成动态库(windows端dll,linux端so) ...…

    2018-03-03
    阅读全文 »

  3. emojify系列(二)

    模型构建预训练词向量导入上一篇博文里,我们已经完成了数据集的制作,接下来的一个问题就是,模型的构建,第一个问题就是词向量的问题,我们已经有了一个训练好的词向量,那么在keras中很好处理,可以看我的gitghub keras 实现,那么pytorch是怎么实现与训练向量的导入的呢,如果看官方文档,查看完整参数列表,发现似乎没有参数可以实现预训练向量的导入,只有定义好就是随机的初始化向量。查看了源码,发现了存储embeding权重的变量就是weights,然后我尝试直接修改weights的值...…

    2018-02-16
    阅读全文 »

  4. emojify系列(一)

    起因前段时间完成了吴恩达的深度学习第五专题序列模型,里面一些作业都很有意思,包括这个Emojify,根据你输入的话语判断你话语的含义,并且用一个表情来表示,并且把表情放在语句后,这样就可以实现说话时自动添加最贴切的表情。具体参考我的github,那是一个keras版本的实现,也是Coursera作业使用的框架,我稍稍改编了一下,里面有些实现的效果以及模型的结构,这里就不多说了,代码也很简单,容易理解。本来这么简单感觉没必要写个博客,但是正好用pytorch复现一遍,此间遇到不少坑,所以我打...…

    2018-02-16
    阅读全文 »

  5. CycleGAN

    CycleGAN介绍优势具体介绍之前,首先说说CycleGAN的一些优势,CycleGAN实现的是一类图片到另一类图片的转化,也就是图片域的转变,对于这类问题pix2pix是一种不错的方法,但是pix2pix训练时需要成对的训练样本,也就是比如你要训练图片风景从白天到黑夜的转变,那么你的训练集就是各种风景图片的白天照片以及其对应的黑夜照片,必须一一对应。那么CycleGAN则不需要,所以如果用CycleGAN来做这个问题,只需要收集一些白天的风景图片和一些黑夜的风景图片即可,不需要是同一种...…

    2018-02-12
    阅读全文 »

  6. 风格迁移

    风格转换风格转换就是将现实的图片转换成带有艺术风格的照片,比如把你自己的照片转换成梵高的星空风格等等这样人人都可以变成梵高了,可以进行你想要的艺术创作。Gatys于2015年提出了一篇论文,A Neural Algorithm of Artistic Style,实现了基于深度学习的艺术风格转换,这是真正意义上的第一篇深度学习实现艺术风格转换的论文,后来又出现了很多更优秀的论文,转换速度更快,效率和质量更好。但是很多都是基于这篇论文的。因此下面我将详细的解读这篇论文,以及在pytorch上...…

    2018-01-23
    阅读全文 »

  7. 实时人脸识别

    MTCNNMTCNN是中国科学院深圳先进技术研究院发表的一篇论文,入选ECCV2016,是一篇非常优秀的人脸检测和人脸对齐的论文。提出了一种Multi-task的人脸检测框架,将人脸检测和人脸特征点检测同时进行。论文使用3个CNN级联的方式,和Viola-Jones类似,实现了coarse-to-fine的算法结构。算法大概的流程如下:当给定一张照片的时候,将其缩放到不同尺度形成图像金字塔,以达到尺度不变。 Stage 1:使用P-Net是一个全卷积网络,用来生成候选窗和边框回归...…

    2018-01-23
    阅读全文 »

  8. 实现一个用户级线程库

    导入用户级线程库指的是创建的线程是内核无法感知的线程,线程的建立和切换都由线程库自己完成,类似协程的概念。本篇博客将实现一个简单的用户级线程库uthread,一个抢占式的线程库,通过定时器中断定时强制切换线程,也就是轮询或者叫Round-Robin算法。这个简单的算法其实效果不差,因为用户级线程库线程切换开销极小,所以这样频繁的切换也可以承受,且这样还可以隐式解决IO阻塞的问题,因为当你读写IO阻塞时,定时器会强制切换到别的线程,因此无需特意针对IO编写检测代码,更加简单。正文首先定义TC...…

    2017-12-20
    阅读全文 »

  9. 写一个简单的libc库

    导入当我们用 C 语言编写 printf("Hello, World!"); 时,我们很少会去想这行代码背后究竟发生了什么。printf、malloc、fopen 这些我们习以为常的函数,并非 C 语言的“内置”功能,而是由一个名为 C 标准库 (libc) 的底层软件库提供的。在 Linux 系统上,它通常是 glibc。这个库是我们的程序与操作系统内核之间的重要桥梁。但是,如果我们不使用它呢?我们能否直接与内核对话来完成工作?答案是肯定的。本文将完全抛弃 libc,通过直接调用 Lin...…

    2017-12-15
    阅读全文 »

  10. 一个简易调试器的实现

    调试器利用ptrace实现一个简单的debugger调试器,支持断点,单步调试,continue继续运行,print打印变量。同时依赖于libdwarf库,dwarf是Linux下调试结构,当我们使用gcc -g编译程序时,生成的.debug节的结构就是dwarf格式的,包含一定调试符号信息,行号信息,行号和源代吗对应信息等。使用dwarfdump命令可以查看带有.debug节的ELF可执行文件的格式详情。完整代码#include <stdio.h>#include <s...…

    2017-12-01
    阅读全文 »

  11. 实现一个文件传输工具

    导入实现一个简单的双向跨平台文件传输工具,使用自定义的简单文件传输协议,具有如下特性: 双向传输,客户端和服务端集成在一起 跨平台,支持windows和类unix系统 大文件分块传输 支持目录传输 支持断点续传 传输协议:先发送文件名(最大255字节),再发送文件大小(8字节,long long),然后发送文件内容。简单说明部分思路: 目录传输 客户端检测参数是否为目录 ...…

    2017-11-03
    阅读全文 »

  12. doxygen代码文档

    导入上篇博客讲到了项目如何发布,虽然隔了好久,还是想讲一下doxygen。doxygen是一个代码文档生成工具,根据特定的注释语法自动生成。相信读者都看过很多的开源项目的API文档,doxygen就可以生成这种在线文档效果,通过浏览器查看,也可以用是LaTeX格式。这是跟项目发布息息相关的,项目发布,尤其是闭源项目的话,API文档是开发者了解项目的最重要途径,因此必须清晰且完善。而对于开源项目,重要性也是一样得,很多开发者发布的开源项目,就一个简单README.md,其他没有任何的文档,让...…

    2017-10-03
    阅读全文 »

  13. 实现一个简化版vim

    概述使用C++实现一个轻量级的vim编辑器,称为miniVim,适用于 Linux/Unix/macOS 系统,依赖标准 C++11 和 POSIX 终端控制接口,无需第三方库。实现的特性多模式编辑 普通模式(NORMAL):默认模式,用于导航和执行命令 插入模式(INSERT):输入文本内容 命令模式(COMMAND):执行保存、退出等文件级操作文件处理 高效加载大文件(按行存储,避免全文件一次性读入内存瓶颈) 修改状态跟踪([+] 提示未保存更改)光标与导航 基础移动:h(...…

    2017-09-07
    阅读全文 »

  14. 项目如何发布

    导入近来看了不少python的开源项目,大多是个人项目,所以有个问题比较突出,就是可复现性很多都比较差。虽然很多稍微调试下也都能跑通,但是并不是我懒得调试,而是不能直接运行的项目不能算是一个健全的项目。如果是生产环境下,要求就更高了。我敢说就连他们自己过段时间都不能跑通自己的代码,因为他们的电脑环境也在不断变化,python版本,第三方库版本的变化都可能影响项目的跑通。虚拟环境对于个人python项目,除非是一个文件的简单脚本,只要是稍微有点代码量的项目,我都是建议进入代码阶段之前一定要先...…

    2017-08-11
    阅读全文 »

  15. C++内存管理

    导入在C++中,我们申请内存一般使用C语言的malloc方式,或者C++的new方式,这两种都是关键字表达式,是我们开发者正常无法介入修改的。但是new其实是可以拆分的,new操作的内部其实是做了三件事: operator new 类型转换 调用构造 其中第一步operator new是可以重载的,因此我们内存管理,主要就是重载operator new,也就是重载void *operator new(size_t size)和对应的 void ope...…

    2017-06-20
    阅读全文 »

  16. 制作一个简单的桌宠

    导入利用python和QT实现一个简单的桌宠程序。效果如下(先鼠标拖拽,点击,然后自主移动):特性: 点击,拖拽回应,气泡框显示回应文本 自主探索,可以在整个桌面上自行移动 正文项目结构├─config # 对话文本│ └─dialogues.json ├─main.py # 主程序└─pets # 桌宠图片资源 └─girl # 小女孩桌宠 ├─idle.png # 待机 ├─walk.png # 向左移动 ├─walk_down....…

    2017-04-20
    阅读全文 »

  17. 关于python多维列表的切片

    导入这篇博客主要想聊一下python列表切片,python列表切片不就是一个slice对象吗?还有什么好聊的呢?的确,对于一维的list来说,一个简单的slice对象传入就可以进行切片,比如array[1:100:2]这样,但是对于多维度的list来说,我们不能直接使用多个slice来针对不同维度进行切片,因为list并没没有实现这个功能,多维度在list眼中就是简单的list嵌套。而如果你使用过numpy库,应该知道,对于numpy中的多维数组,我们可以直接针对不同维度进行切片,比如二维...…

    2017-03-03
    阅读全文 »

  18. C++函数重载的背后

    导入我们都知道C语言没有函数重载,C++有函数重载,那么有没有想过这背后是怎么实现的呢?主要其实靠一个技术:符号修饰(name mangling)。具体机制符号修饰就是C++会对C++的变量名包括函数名类名等进行符号的修改,比如一个函数声明是这样void func(int a, float b);,那么g++编译器会将函数名修饰成_Z4funcif,其中_Z类似前缀,4是函数名字符数,func一共4个字符,i是int表示第一个参数类型,f是float表示第二个参数类型。再比如一个类成员函数...…

    2016-11-10
    阅读全文 »

  19. C语言和NASM汇编混合编程

    导入今天要谈的不是C语言中用asm关键字嵌入汇编,这种一是少见,尤其在现代编译器智能的优化下,更加少见。二是也只是和少量汇编代码的嵌入,今天要谈的是C编译单元和NASM汇编编译单元之间的混合链接。这看起来很简单,其实还是有一些需要注意的地方的,尤其是汇编调用C编写的函数,很容易出问题,为什么呢?因为调用函数其实涉及到函数参数的压栈以及函数栈的开辟和清理。而高级语言下,编译器会根据调用约定(比如__stdcall,_cdecl)自动处理这些,让上层的开发者无需知道内部发生了什么,但是自己实现...…

    2016-09-03
    阅读全文 »

  20. 自定义x86中断

    思路对于装有操作系统OS的x86系统来说,正常用户模式是没有办法自定义中断的,用户模式提供的软中断只有系统调用,比如int 80h和syscall ,且无法自定义中断号和中断处理函数。但是我们确实可以编写硬中断的处理函数,也就是ISR,中断服务程序,只不过需要内核编程(Linux)或者内核驱动编写(Windows),比如Windows下,利用WDK驱动开发包,绑定IRQ,使用IoConnectIntteruptEx函数可以注册中断服务程序,然后用户态使用DeviceControl函数和驱动...…

    2016-07-08
    阅读全文 »


← 最近 2 / 3 更早 →
  • Github
  • RSS
  • Email

Copyright © Star 2025 Theme by leopardpan |