Tag Archives: 神经网络

残差网络

见到知乎上有一个解释说,基础形式实际上类似于差分放大,很有道理。 假如: F'(5)=5.1 从5到5.1的变化率是极低的,因为5的基数太大,所以可以进行拆分: H(5)=5.1, H(5)=5+F(5), F(5)=0.1 此时由于在拆分项中0变成0.1,这个变化率就达到了10%,便放大了这种效果。 因为神经网络不能很好辨识出这种拆分,所以需要人工设计结构进行辅助, 一般理论上认为网络层数越多,提取细节与抽象能力越丰富,然而实际层数迭代多了,会出现梯度爆炸或梯度弥散 ,这可以通过通过正则化解决。 但即使解决了这个问题,仍然会有退化问题,即层数多了后,出现准确率反而下降的情况。 这里有一个变化的技巧就是,在 H(x) = F(x) + x 时,当F(x)=0时, 显然H(x) = x,如果f(x)越来越趋近于0,则h(x)越来越趋进x 所以可以构造这样的形式: 所以,x可以直接跳两层作为输入,因为h(x)=x,f(x)这里当然不会等于0,但是可以通过relu使得矩阵中尽量多的地方变成0,从而实现残差放大。 X如何变化是不清楚的,因为它本来就是一个需要求的值,但这里可以直接采用X的原值,因为是如果改变了X值,那么就会破坏掉残差对应的原来的X结构,因为这里的残差实际上不是差分,而只是一个通过训练后才有可能不断向差分靠拢的值。      

斯里兰卡大学的一些有趣的相关神经网络研究

Jay Jayanka, 一种基于计算机的系统,用于识别斯里兰卡的僧伽罗ayurvedic草药植物 , 学士 (特殊)计算机科学学士学位(2016年)。 主管: TGI Fernando 摘要:在这项研究中,我们开发了一种基于深度学习识别樟芝植物叶的计算机系统。 用RGB和灰度图像的卷积神经网络以及具有RGB图像的多层神经网络用于鉴定ayurvedic植物叶。 在这项工作中,我们使用具有RGB图像的卷积神经网络,可以达到97.71%的准确度,用于识别僧伽罗草药植物叶。 HTM Perera, 僧伽罗手写字符识别的深度学习方法 , 学士 (特殊)计算机科学学位(2015)。 主管: TGI Fernando 摘要:手写字符识别可视为计算机视觉和机器智能的主要子领域之一。 随着近来开发基于深度学习的计算机视觉方法,大多数复杂的图像识别变得更加容易和准确。 一些深入学习的方法在用于识别手写字符的其他古典方法中表现更好。 僧伽罗手写字符由于僧伽罗人物的独特形状而有相当大的变化。 到目前为止,仅使用古典图像处理方法和基本机器学习方法,已经进行了一些研究,以识别僧伽罗手写字符识别。 本研究的主要目的是确定并实施基于深度学习的高效僧伽罗手写字符识别方法。 在这项研究中,我们能够使用卷积神经网络分别获得2.74%和0.07%的前1个和前5个错误率,用于僧伽罗手写字符识别。 RMEJ Rathnayaka, 发现一个找到名字的占星术效应的工具 , 学士 (特殊)计算机科学专业(2014)。 主管: TGI Fernando 摘要:斯里兰卡人,特别是僧伽罗佛教徒和印度教徒遵循占星术介绍的习俗和仪式。 这些仪式从一个新生儿的诞生开始,随着他的死亡时间的到来。 这些仪式中的第一个是命名一个婴儿。 目前,许多家长想用他们的孩子命名星座的有益名字。 虽然他们花钱在这件事上,没有可靠的方法来确定占星师的一个给定的名字是否符合占星术的规则。 常见的情况是,他们所提供的名称不符合占星学规则。 命名婴儿不仅与占星术有关,而且与语言有关。 在这项研究中,僧伽罗语言及其概念被考虑在内。 占星术中的许多概念已被僧伽罗语言所吸收。 僧伽罗人已经进行了几个世纪的占星术,佛教祭司是古代斯里兰卡保存占星学和语言的先驱。 这可能是僧伽罗语与占星术之间密切关系的原因。 占星术有一些使用它们的发音模式对词进行分类的概念。 使用这些占星术的概念,当一个单词被发音或放置为一首诗的第一个单词时,可以给出效果。 在这项研究中,研究了占星概念和语言概念,以开发基于网络的应用程序来实现用于预测给定名称的影响的概念。 通过研究引入和研究的算法和概念可能会给出一种思考一个词的发音的新方法,特别是වර්ණ(warn warn)在僧伽罗语言中的概念可能有助于找到更可靠的字形语音转换。 KS Ilmini, … 阅读全文 斯里兰卡大学的一些有趣的相关神经网络研究

研究CNTK(七):Python还是BrainScript速度更快?

def create_reader(map_file, mean_file, train): if not os.path.exists(map_file) or not os.path.exists(mean_file): raise RuntimeError(“File '%s' or '%s' does not exist. Please run install_cifar10.py from DataSets/CIFAR-10 to fetch them” % (map_file, mean_file)) # transformation pipeline for the features has jitter/crop only when training transforms = [] if train: transforms += [ cntk.io.ImageDeserializer.crop(crop_type='Random', ratio=0.8, jitter_type='uniRatio') # train uses jitter … 阅读全文 研究CNTK(七):Python还是BrainScript速度更快?

研究CNTK(六):ResNet

发挥图像识别的威力还是需要ResNet结构,最早是微软亚洲研究院提出的,这是可以达到90%以上识别率的网络结构,比如resnet cifar10,需要使用高达21个卷积层,并且每一步都要进行重新的批量正则化与归一化。 谷歌2016年8月份开源了Inception-ResNet-v2,是基于TensorFlow的,识别效果更为强大,能够将阿拉斯加雪橇犬(左)和西伯利亚雪橇犬给准确分类出来,另外还有V3与V4,网络结构也变得更深,唯一值的一提的是Inception-v4没有residual连接,但是效果与V2一样。 不过这都是些是些个人计算机运行起来很吃力的东西,在CNTK里这个同样有ResNet的各种实现,默认的ResNet20_CIFAR10.cntk将会进行160次迭代,这个运算量非常大也非常缓慢,不过识别精度非常高,但是不是妨尝试运行下的。 在第16次迭代时可以达到准度度已经可以达到是百分之86.1%以上的正确率了,每次迭代花费时间约在25s左右,所以时间也就花费了几分钟而已,它提高识别率的速度甚至比简单的卷积网络还快。在达到28次左右时,实际上就达到了89~90%左右的识别率,真正突破90%大概是到了36次左右,即大概15分钟便可以做到90%的识别,这个完全可以接受。不过按文档说,训练到最后错误率最高也只能达到8.2%左右,而人类的估计是6%左右,这个网络结构还是不足以超过人类,而叠加到了n=18的网络,则可以达到6.2-6.5%的效果。简单测试了一下,网络的一代迭代大概153秒,要迭代160次,约要跑6.8个小时,才可以达到6.2-6.5%的效果。   根据有人做过的研究来看,ResNet也不是层次越多越好。 到了1202层的时候,反而效果比110层更差了。   比较了一下: ResNet20_CIFAR10,numLayers =3,learningRatesPerMB = 1.0*80:0.1*40:0.01 ResNet18_CIFAR10,numLayers = 18,learningRatesPerMB = 0.1*1:1.0*80:0.1*40:0.01 除此之外并无区别了。 所以分析ResNet20_CIFAR10.cntk源文件就好 # ConvNet applied on CIFAR-10 dataset, with data augmentation (translation and flipping). command = TrainConvNet:Eval precision = “float”; traceLevel = 1 ; deviceId = “auto” rootDir = “../..” ; configDir = “./” ; dataDir … 阅读全文 研究CNTK(六):ResNet

研究CNTK(五):ConvNet_CIFAR10.cntk、ConvNet_CIFAR10_DataAug.cntk

从任务上来说,识别物体是最艰难的,因为物体大小开关都会发生灵活变化,传统的神经网络识别这个几乎是不可能的任务,而卷积技术则克服了这一点,不过仍然需要依赖强大的计算量。 ConvNet中的模型是: model = Sequential (             Normalize {featMean, featScale} :             ConvolutionalLayer {64, (3:3), pad = true} : ReLU :             ConvolutionalLayer {64, (3:3), pad = true} : ReLU :             MaxPoolingLayer {(3:3), stride = (2:2)} :             ConvolutionalLayer {64, (3:3), pad = true} : ReLU :             ConvolutionalLayer {64, (3:3), pad = true} … 阅读全文 研究CNTK(五):ConvNet_CIFAR10.cntk、ConvNet_CIFAR10_DataAug.cntk

研究CNTK(四):ConvNet_MNIST.cntk

可以看出结果为: Minibatch[1-10]: errs = 0.470% * 10000; ce = 0.01797164 * 10000 Final Results: Minibatch[1-10]: errs = 0.470% * 10000; ce = 0.01797164 * 10000; perplexity = 1.01813410 错误仅只有0.47,相当于正确率为99.53%,这个非常高了。 这是采用了三层卷积的效果,迭代了40次,算了挺久的,按MNIST的网站上的公布最好成绩为0.23,共计用了35个卷积层,很难想象这个得算多久。 与之前的代码几乎还是相同,不同主要是在model上,它是这样的:  model = Sequential (             Scale {featScale} :             ConvolutionalLayer {32, (5:5), pad = true} : ReLU :             MaxPoolingLayer    {(3:3), stride=(2:2)} :             … 阅读全文 研究CNTK(四):ConvNet_MNIST.cntk

研究CNTK(三):MNIST识别之02、03、04

与一个隐含层的神经网络不同的体现只在MODEL这里,它是这样定义的:      在01中定义是:      model(x) = {             s1 = x * featScale             h1 = DenseLayer {200, activation=ReLU} (s1)             z = LinearLayer {labelDim} (h1)         }     在02中的定义要配合图比较直观:         model = Sequential (             #归一化             Scale {featScale} :             #创建卷积层,函数使用RELU,对图像进行5:5的卷积,这就滤波器,这里使用16个滤波器,因为不补零,所以是16个24×24的sudo-image             ConvolutionalLayer {16, (5:5), pad = true} : ReLU :             #进行最大池化,得到feature … 阅读全文 研究CNTK(三):MNIST识别之02、03、04

研究CNTK(三):MNIST识别之01_OneHidden.cntk

# Parameters can be overwritten on the command line # for example: cntk configFile=myConfigFile RootDir=../.. # For running from Visual Studio add # currentDirectory=$(SolutionDir)/ command = trainNetwork:testNetwork precision = “float”; traceLevel = 1 ; deviceId = “auto” rootDir = “..” ; dataDir = “$rootDir$/DataSets/MNIST” ; outputDir = “./Output” ; modelPath = “$outputDir$/Models/01_OneHidden” #stderr = “$outputDir$/01_OneHidden_bs_out” … 阅读全文 研究CNTK(三):MNIST识别之01_OneHidden.cntk

CNTK研究(二):测试MNIST几种识别效果

01_OneHidden,一个隐藏层,相当于简单的三层神经网络,直接用的RELU,效果不错。 Minibatch[1-10]: errs = 1.560% * 10000; ce = 0.05553107 * 10000 Final Results: Minibatch[1-10]: errs = 1.560% * 10000; ce = 0.05553107 * 10000; perplexity = 1.05710186 02_OneConv,一层的卷积神经网络,测试显然有所提升。 Minibatch[1-10]: errs = 1.190% * 10000; ce = 0.03576933 * 10000 Final Results: Minibatch[1-10]: errs = 1.190% * 10000; ce = 0.03576933 * 10000; perplexity = … 阅读全文 CNTK研究(二):测试MNIST几种识别效果

CNTK研究(一):MNIST的文件转换

CNTK的MNIST例子中,它是一个py文件,首先是将图像文件转换为文本来表达,以方便CNTK中读取。 文件位置:\cntk\Examples\Image\DataSets\MNIST\mnist_utils.py import sys import urllib import gzip import shutil import os import struct import numpy as np //定义一个读数据的函数 def loadData(src, cimg):     print ('Downloading ' + src)     gzfname, h = urllib.urlretrieve(src, './delete.me')  //从URL下载该数据文件     print ('Done.')     try:         with gzip.open(gzfname) as gz:         //使用gzip打开它             n = struct.unpack('I', gz.read(4))    //读4个字节解包成无符号整型             # Read … 阅读全文 CNTK研究(一):MNIST的文件转换