CODE 官方博客

CSDN技术主题月----“深度学习”代码笔记专栏

Hi,各位用户

CSDN技术主题月代码笔记专栏会每月在CODE博客为大家带来主题精品代码笔记,供大家学习。也希望大家踊跃投稿,投稿邮箱:yaoqian@csdn.net(投稿请提供代码笔记链接哦~。~)

-CSDN技术主题月是由CSDN社区主办的线上结合线下技术交流活动,旨在和国内技术领先的企业共同围绕行业趋势和话题进行解决方案的探讨、分享和交流。在技术开放的氛围下,希望开发者们能够通过CSDN社区平台结识更多技术达人,交流&分享技术观点,并碰撞出精彩火花。

10月技术主题----“深度学习”

Batch Normalization 学习笔记 --------------https://code.csdn.net/snippets/1608106

神经网络代码-------------------------------https://code.csdn.net/snippets/1876975

线性代数和Numpy的使用----------------------https://code.csdn.net/snippets/1807414

神经网络常用操作实现-----------------------https://code.csdn.net/snippets/1810015

Theano常用技巧-----------------------------https://code.csdn.net/snippets/1815824

线性回归算法实现---------------------------https://code.csdn.net/snippets/1820662

逻辑回归算法应用---------------------------https://code.csdn.net/snippets/1823250

用Theano实现多层前馈网络-------------------https://code.csdn.net/snippets/1851432

卷积神经网络(CNN)之卷积操作--------------https://code.csdn.net/snippets/1856625

卷积神经网络(CNN)实现--------------------https://code.csdn.net/snippets/1857587

堆叠去噪自动编码机(SdA)原理及实现--------https://code.csdn.net/snippets/1869571

深度学习-LSTM网络-代码---------------------https://code.csdn.net/snippets/1866476

Caffe学习笔记——Matlab接口----------------https://code.csdn.net/snippets/1802842

solver参数说明及利用自己的数据集对权值微调-https://code.csdn.net/snippets/1865649

MNIST的CNN实现——源码和运行结果-----------https://code.csdn.net/snippets/1693313

利用caffe训练深度学习模型------------------https://code.csdn.net/snippets/1610379

vgg人脸识别模型测试------------------------https://code.csdn.net/snippets/1614525

caffe源码解析之blob.hpp或blob.cpp----------https://code.csdn.net/snippets/1620527

caffe模型参数的一些解释--------------------https://code.csdn.net/snippets/1610047

让计算机阅读《天龙八部》-------------------https://code.csdn.net/snippets/1773808

使用LSTM进行大盘回归-----------------------https://code.csdn.net/snippets/1847366

 

快快点击按键创建你自己的代码笔记吧~~~

 

拓展阅读

常用的深度学习开源框架介绍:

1、Caffe

源自加州伯克利分校的Caffe被广泛应用,包括Pinterest这样的web大户。与TensorFlow一样,Caffe也是由C++开发,Caffe也是Google今年早些时候发布的DeepDream项目(可以识别喵星人的人工智能神经网络)的基础。

2、Theano

2008年诞生于蒙特利尔理工学院,Theano派生出了大量深度学习Python软件包,最著名的包括Blocks和Keras

3、Torch

Torch诞生已经有十年之久,但是真正起势得益于去年Facebook开源了大量Torch的深度学习模块和扩展。Torch另外一个特殊之处是采用了不怎么流行的编程语言Lua(该语言曾被用来开发视频游戏)。

4、Brainstorm

来自瑞士人工智能实验室IDSIA的一个非常发展前景很不错的深度学习软件包,Brainstorm能够处理上百层的超级深度神经网络——所谓的公路网络Highway Networks

5、Chainer

来自一个日本的深度学习创业公司Preferred Networks,今年6月发布的一个Python框架。Chainer的设计基于define by run原则,也就是说,该网络在运行中动态定义,而不是在启动时定义,这里有Chainer的详细文档

6、Deeplearning4j

顾名思义,Deeplearning4j是”for Java”的深度学习框架,也是首个商用级别的深度学习开源库。Deeplearning4j由创业公司Skymind于2014年6月发布,使用Deeplearning4j的不乏埃森哲、雪弗兰、博斯咨询和IBM等明星企业。

DeepLearning4j是一个面向生产环境和商业应用的高成熟度深度学习开源库,可与Hadoop和Spark集成,即插即用,方便开发者在APP中快速集成深度学习功能,可应用于以下深度学习领域:人脸/图像识别、语音搜索、语音转文字(Speech to text)、垃圾信息过滤(异常侦测)、电商欺诈侦测

7、Marvin

普林斯顿大学视觉工作组新推出的C++框架。该团队还提供了一个文件用于将Caffe模型转化成语Marvin兼容的模式。

8、ConvNetJS

这是斯坦福大学博士生Andrej Karpathy开发浏览器插件,基于万能的JavaScript可以在你的游览器中训练神经网络。Karpathy还写了一个ConvNetJS的入门教程,以及一个简洁的浏览器演示项目

9、MXNet

出自CXXNet、Minerva、Purine等项目的开发者之手,主要用C++编写。MXNet强调提高内存使用的效率,甚至能在智能手机上运行诸如图像识别等任务。

10、Neon

由创业公司Nervana Systems于今年五月开源,在某些基准测试中,由Python和Sass开发的Neon的测试成绩甚至要优于Caffeine、Torch和谷歌的TensorFlow。

Git Submodule详解

1、Git Submodule介绍

软件开发过程中,经常在一个项目中需要引用另外一个项目。可能是需要引用一个第三方库;或者是独立开发的一个项目被几个项目引用;或者是项目分为几个单独的子模块分别开发;

我们在开发WEB应用中, 前端团队和后端团队分开开发,各负其责,所以把资源文件单独生成一个项目由前端团队负责,主项目中引用此资源项目,后端人员负责,后端团队不能修改资源文件。

Git Submodule可以解决这个问题。

  1.1、Git submodule命令

  • git submodule add :创建子模块,将子模块加入主工程。

  • git submodule status :  查看子模块的状态。

  • git submodule init :初始化子模块, 把记录在模块索引文件(.gitmodules)中的子模块名复制到 .git/config.  模块索引文件被提交到git仓库。

  • git submodule deinit  :  把子模块从 .git/config中删掉, 模块索引文件中还存在。

  • git submodule update :此命令用于更新子模块的更新。

  • git submodule summary:  现实HEAD和工作区的区别。

  • git submodule foreach: 在所有的子模块中执行一个shell命令。

  • git submodule sync : 同步子模块的upstream到模块索引文件(.gitmodules)。

下面简单实战一下主要命令用法,每个命令可以添加options来完成不同的操作,请参考帮助,git submodule --help.

2、实战演练

2.1、准备环境

在CSDN CODE中创建三个项目,每个项目中随便添加几个文本文件,作为测试使用如下图所示:

进入 submodule_master 为主项目添加子项目:

查看了当前的状态发现添加了一个新文件(.gitmodules)和两个文件夹(submodule_a,submodule_b):

查看一下模块索引文件.gitmodules文件内容,记录了每个submodule的引用信息,包括在当前项目的位置以及仓库的url。

把更改提交到仓库,再看code上文件的变化,  可以看到,code里面多了2个目录,目录后面是引用地址。

2.2、Clone带有Submodule的仓库

如果一个项目里面含有submodule, 那么Clone此项目和其他项目有何不同呢?我们操作一下:

看到submodules的状态是hash码和文件目录,但是注意前面有一个减号:-,含义是该子模块还没有检出。git submodule init先初始化所有的子模块,然后git submodule update检出所有注册的模块。

可以看到子项目里的文件已全部clone到了本地:

  除了上述方法,还一个命令可以完成该操作:

  git clone --recursive git@code.csdn.net:zu-test/submodule_master.git

  --recursive参数的含义:可以在clone项目时同时clone关联的submodules。

特别要说的是,如果你有多个子模块,一个一个clone比较慢, git 2.8 提供 了一种方法可以并行clone子模块的方式:

git clone --recursive --jobs=4 git@code.csdn.net:zu-test/submodule_master.git 

--job=4参数允许一次同时读取4个submodules,这个功能CODE暂不支持。

2.3、修改Submodule

一个项目中如果引入了submodule, 如何获取此Submodule中的最新内容呢? 下面我们操作一下。 先看一下Submodule里面的状态:

为什么是HEAD detached at呢?不是应该默认在master分支吗?Git对于Submodule有特殊的处理方式,在一个主项目中引入了Submodule其实Git做了3件事情:

  • 记录引用的仓库
  • 记录主项目中Submodules的目录位置
  • 记录引用Submodule的commit id

在submodule_master中push之后其实就是更新了引用的commit id,然后submodule-a 和submodule-b在clone的时候获取到了submodule的commit id,然后当执行git submodule update的时候git就根据gitlink获取submodule的commit id,最后获取submodule的文件,所以clone之后不在任何分支上;

如果修改submodule的git仓需要修改或者有新的提交,则需要先检出master分支, 更新仓库或者修改并提交新的提交。 然后在主项目中提交引用的commit id,就回更新到master分支的最新提交。操作如下:

检出master分支并,修改并提交:

先看主项目中的变化, 可以看到submodulea有变化,变化的内容是引用的commit id 不一样了。由原来的697a70d01e102aafc5641d9ab00aa21877631c33更改为be8d73b2cf7653d18c7c1c8df47c4ca94cc9ecf2

最后把更新的commit id提交到仓库:

一旦主项目中的引用被提交,别的人只需要更新主项目,在执行 git submodule update命令即可得到submodule的更新。

2.4、移除子模块

要注销一个子模块,可以用git submodule deinit命令。但此命令仅仅是把 .git/config中的子模块信息删掉,把子模块目录里面的内容删掉。子模块索引文件和子模块对应的目录都没有删除。 如果想要彻底删除子模块,需要自己动手:

  1. 删除git rm --cache物理文件夹
  2. 删除.gitmodules的内容(或者整个文件)。如果所有的子模块被删除了, 直接删除文件。如果仅仅删除某一个submodule那么打开.gitmodules文件编辑,删除对应submodule配置即可。
  3. 删除.git/config的submodule配置 源文件:

删除后

2.5、使用第三方工具

对于submodule的重度使用者,有几个工具可作推荐:

1.Repo Google用于管理Android项目的工具。

2.Gitslave

3.Git Subtree

3、总结

submoudle解决了git不能提供目录级别的权限控制问题。 如果在开发过程中,项目被分为几个子模块分团队开发,并且要严格区分各团队的权限,则使用submodule是个很好的选择。 使用submodule时, 当子模块有新的更新后,引用的项目需要先切换到master分支, 更新最新的子模块代码,然后提交引用项目中的子模块引用的commit id。 否则,使用 git submodule update 总是把子模块更新到上次引用项目中纪录的commit id. 

总之,submodule在分模块管理权限的时候,还是非常有用的。

CODE平台的系统架构与安全架构

  这篇文章是开源大会上关于CODE平台介绍的完整版,其实早应该放在官方博客上的。里面详细讲述了我们平台选型过程和系统架构,希望能给对CODE结构有兴趣的朋友一些参考。

CODE系统架构

  CODE平台在初期经过一番调研后,我们锁定了几个Git服务的开源项目:Gitorious,Gitlabhq,Gitblit。其中Gitblit是java实现,具备核心功能,性能上有优势,但整体上不太成熟。Gitorious和Gitlabhq都是比较成熟的实现,并且和Github一样,都是基于RoR实现,可以共享很多开源资源。我们仔细比较了Gitorious和Gitlabhq,整体上来说软件架构很像,都使用Grit访问Git仓库,都是用RoR。虽然Gitorious的功能更加完整,但Gitlabhq很好的使用了各种开源Rails插件,如,用Devise实现登录,用SIX实现权限管理,用Grack实现Git over Smart HTTP,Bootstrap作为前端框架等,代码整洁易懂。代码好维护是软件工程中太重要的一个衡量指标了,虽然当时Gitlabhq4.2还使用Gitolite作为Git仓库管理,是个必须改造的累赘,经过权衡,我们还是选择了Gitlabhq作为我们基础来实现。

  系统架构如下:

 

系统架构

 

  作为Git服务,功能上就是要实现Git仓的Web访问和比较常用的三个协议:SSH, Git, Smart HTTP。Web访问就不用说了,就是Git仓的WEB展现。SSH因为其安全性,基本上是使用Git开发者进行pull/push最常用的协议。 Git协议只支持Clone,因为其效率最高,深受喜爱。Smart HTTP则最方便,而且使用最通用的80端口,不会被公司防火墙屏蔽。功能上来讲,实现起来问题不大。仔细考虑一下,就会发现其中最大的难题,在于解决大规模部署,数据安全,动态扩展等平台维护功能上。

  作为Git公众服务,不可避免的Repos会非常的庞大,并且随着用户量的增加需要动态的扩展。对此,常规的有两种方案:

方案

 

  方案1:使用分布式文件系统:

  系统由多个Server和一个分布式文件系统组成, 由负载均衡器负责随机分发用户的各种请求给每个Server。每个server实现所有的Git服务(WEB, SSH Listener, Git Listener, Smart HTTP Listener),所有的server可以共享一个分布式文件系统。通过Posix挂接到Server的特定路径。DFS可以根据需要动态的扩展,也负责数据容灾和高可靠性。

  方案2:使用分布式后端:

  系统由前端(FE)和后端(BE)组成。后端保存所有Git仓库,负载均衡把用户请求平均分配给前端,前端根据请求类型,分别通过远程调用、透明代理访问后端的Git仓库。

  分布式文件系统实现起来比较简单,但考虑到目前分布式文件系统都只适合于大文件的存储,而Git恰恰都是大量的小文件操作,性能以及存储利用率都非常成问题。所以我们选择了分布式后端的方案。分布式后端充分的使用了所有后端机器的计算能力,需要实现Grit库的远程调用以及SSH, Git的代理,后端路由表,而且为了实现高可靠性,每个后端都必须是一对,提供服务的高可靠性以及保证数据安全。

  到此,我们可以逐个功能分析一下工作原理:

  1. Web访问。用户提交请求, 首先会到达负载均衡。负载均衡会把用户请求发送到任意一个前端,前端运行Web服务器,我们的Rails应用会处理用户的请求,根据用户请求的Git仓库, 查询到仓库所在的后端。通过Grit远程调用访问后端数据,然后变为HTML展现给用户。

  2. SSH访问。 Git over SSH通过publickey鉴权,用户执行git命令后,Git客户端会把相应的Git命令,用户的publickey,以及访问的Git仓库名发送给服务器。请求首先会到达负载均衡。负载均衡会把请求发送到任意一个前端,前端有一个经过我们改造的OpenSSH的服务,首先会根据请求中的publickey,仓库名以及git命令到数据库中查询权限,如果允许,前端则通过路由查询到Git仓所在的后端,并且把SSH连接代理到相应的后端,后端SSH listener完成数据读取,通过前端的SSH代理传给用户。

  3. Git 访问。Git协议用来Clone公开的仓库。同样用户执行git命令后,Git客户端会把相应的Git命令,访问的Git仓库发送给服务器。请求首先会到达负载均衡。负载均衡会把请求发送到任意一个前端,前端有一个我们的Git Daemon服务,该服务首先检查所访问的仓库是否是公开仓库,若是,则把把请求代理到相应的后端执行。

  4. Smart HTTP访问。 HTTP协议的代理和负载均衡都比较成熟,同理可以很容易的实现Smart HTTP的处理。

  不难分析出搭建系统的一些要点:

  • 负载均衡需要支持HTTP, SSH, Git等协议。我们在选择了LVS后,惊喜的发现,阿里云的LBS完全能够满足以上协议,使用之。

  • 需要改造OpenSSH,使它能够支持大量的用户使用Git的功能。主要是存储Publickey采用数据库,和Git系统的结合接口。我们通过改造OpenSSH完成。

  • 需要实现Git Daemon,因为Gitlabhq没有支持Git协议,Git自带的Git Daemon性能不适合于大并发,我们自己用GO语言实现了一个Git Daemon。GO语言作为能够处理高并发的高级语言,其开发效率和Ruby可以媲美。我们已经开源了此项目: https://code.csdn.net/CSDN_Code/code_git_daemon ,欢迎大家一起完善。

  • 需要实现SSH 和Git Proxy,完成前端到后端的透明代理。

  • Grit 远程调用,完成前端WEB应用对后端Git仓库的访问。

  • Grit库的优化以及中文支持。在实现过程中,我们发现Grit库对中文支持不够好,中文文件名,中文Branch以及Tag等都存在问题。如果使用Gollum,会发现wiki页面也不支持中文名。我们都对此专门进行了修改。同时Grit在有些方面性能也有很大的瓶颈。我们也在Github上对我们所做的修改推送给了原项目,如果Grit库的维护者接受了我们的修改,大家就能看到一个全面支持中文的系统了

 

CODE安全架构

  作为代码托管服务,系统的安全性是需要特别着重考虑的因素之一。其中最为重要的,莫过于用户数据的健壮性,我们在此方面上了三道保险:

 

  安全架构

图:CODE平台安全架构

 

  在基础平台安全层面,我们从物理安全,网络安全,系统安全三方面给予CODE平台最牢靠保障。首先,CODE采用阿里云的存储,保证数据同时有三份,定期备份同步用户数据到备份服务器,在某些灾难情况下也可以恢复用户的数据。其次,CODE采用具备负载均衡及双机热备功能的设备持续提供网络服务,其强劲的网络防护设置能有效防护各类网络攻击,并实时网络状态监控。再次,CODE拥有持续的端口入侵扫描,挂马扫描,漏洞扫描防护,保证系统最新补丁持续及时更新,实时的系统状态监控,有效防止过载及溢出错误。

  在中间应用安全层面,CODE提供多种安全传输协议,对各应用均进行特定的安全加固,实行实时应用服务状态监控,以最大限度的保障应用安全。每日的数据都有多份备份副本,并实施安全的数据访问控制,各用户数据相互独立,实时用户数据操作记录以保障数据安全。口令安全方面,CODE采用统一的网站登录方式,存储及登录时均使用加密操作,并提供用户对SSH协议key的自行管理。

  在管理安全层面,CODE使用了堡垒机机制,具备完整的安全管理操作策略及手册、完备的应急恢复策略和详尽的日志审计,保证所有的操作人员的操作权限明确,并且都有纪录可查。全站使用了HTTPS协议,保证各协议接口都安全可靠。

  我们正在奋力打造一个具备完美功能的代码托管平台,现在代码片、组织等功能已经上线,代码搜索、客户端还有一些我们认为适合中国开发者的功能,也会逐步和大家见面。

 

  接下来还希望大家多多鼓励,多多帮助,可以给我们开issue,也可以在论坛发表意见。 当然还可以通过派生我们的项目加入我们的开发。让大家一起努力打造中国良好的生态环境!