如何将深度学习框架训练出的宇宙大爆炸模型的框架基于部署到嵌入式硬件中

本文主要介绍深度学习框架caffe的介绍和入门级使用,以及caffe的python的一些使用说明和注意点,主要参考。
1、caffe简介
Caffe,全称Convolutional Architecture for Fast Feature Embedding,是一个计算CNN相关算法的框架。caffe是一个清晰,可读性高,快速的深度学习框架。作者是贾扬清,加州大学伯克利的ph.D。
2、模型训练
这里主要介绍caffe训练CNN的模型。官网给了一些入门的例子,以人脸识别数据为例,
2.1、数据准备
首先准备原始的训练数据和验证数据集,采用分类的方式训练CNN。我们的原始数据是按照类别放在一起,即facenet文件下是很多人,每个人一个文件夹,用于存放所以照片。之后处理成如下文件结构如下:
- train/ #存放训练数据
-n/ #每个人一个文件夹
#测试数据,放一起即可
det_synset_words.txt # 存放了原始文件夹名与编码后文件夹名对应关系
synset.txt
# 存放了所有的编码后文件夹名字
synset_words.txt
# 存放了所有的编码后文件夹名及其对应的原文件夹名
# 存放训练数据路径以及对应的类别
# 存放测试数据路径以及对应的类别
# 存放验证数据路径以及对应的类别
这里编码的好处是防止caffe无法识别原始文件名,而且需要把类别处理成整数型的数据。把原始图片处理成caffe待使用的数据。
更新于 增加数据预处理的脚本,数据预处理的主要思路就是把数据整理成你模型需要输入的格式和样式。
# -*- coding:utf-8 -*-
import shutil
import numpy as np
base_dir = 'facedata/'
# 原始数据路径
target_dir = 'facenet/'
# 目标数据路径
# 把原始的文件名,更改为新的编码,这里可以随机设定
# 我们从n开始计数,共计60000人(至少要大于类别数)
synset = ['n0'+str(1440764 + i) for i in xrange(6000)]
if os.path.exists(target_dir):
os.makedirs(target_dir)
metanames = []
label = -1
for sub_dir in os.listdir(base_dir):
# 如果样本数不足10,那么不记录该类
if len(os.listdir(base_dir + sub_dir)) & 10:
label += 1
for name in os.listdir(base_dir + sub_dir):
metanames.append(str(label)+','+ sub_dir+','+name)
# 输出总的人数(类别数)
print 'number of metanames:', len(metanames), label+1
# 把数据乱序,选80%用于训练,20%用于测试(注意,为了尽可能的多训练数据,我们的val数据和test数据是相同的,其实是不需要一致)
np.random.seed(234)
np.random.shuffle(metanames)
# for train
totle_num = len(metanames)
train_num = int(totle_num*0.8)
test_num = totle_num - train_num
print 'number of metanames:', len(metanames)
print 'number of train:', train_num
f0 = open(target_dir+'train.txt', 'w')
labels = []
det_synset_words = set()
print 'prepare the trainning data...'
for meta in metanames[0:train_num]:
label,sub_dir0,name = meta.strip().split(',')
filename = base_dir + sub_dir0 + '/' + name
sub_dir = synset[int(label)]
det_synset_words.add((sub_dir, sub_dir0))
name = sub_dir + '_' + name.split('_')[1]
targetname = target_dir + 'train/' + sub_dir + '/' + name
if os.path.exists(target_dir + 'train/' + sub_dir):
os.makedirs(target_dir + 'train/' + sub_dir)
f0.write(sub_dir + '/' + name + ' ' + label)
f0.write('\n')
labels.append(label)
shutil.copy(filename, targetname)
f0.close()
# 记录 det_synset_words
f3 = open(target_dir+'det_synset_words.txt', 'w')
f3_2 = open(target_dir+'synset_words.txt', 'w')
det_synset_words = sorted(list(det_synset_words), key=lambda x:x[0])
for i in det_synset_words:
f3.write(' '.join(i) + '\n')
f3_2.write(' '.join(i) + '\n')
f3.close()
f3_2.close()
synset_word = []
for i in set(labels):
synset_word.append(synset[int(i)])
synset_word = sorted(synset_word)
f4 = open(target_dir+'synset.txt', 'w')
f4.write('\n'.join(synset_word))
f4.close()
# 输出实际训练的类别数
print 'num of classes for train: ', len(set(labels))
# 生成测试数据
f1 = open(target_dir+'val.txt','w')
f2 = open(target_dir+'test.txt','w')
if os.path.exists(target_dir + 'val/'):
os.makedirs(target_dir + 'val/')
labels = []
print 'prepare the testing data...'
for meta in metanames[train_num:train_num+test_num]:
label,sub_dir0,name = meta.strip().split(',')
filename = base_dir + sub_dir0 + '/' + name
sub_dir = synset[int(label)]
name = sub_dir + '_' + name.split('_')[1]
# targetname = target_dir + 'val/' + sub_dir + '/' + name
targetname = target_dir + 'val/' + name
f1.write(name + ' ' + label)
f1.write('\n')
f2.write(name + ' ' + '0')
f2.write('\n')
labels.append(label)
shutil.copy(filename, targetname)
f1.close()
f2.close()
print 'num of classes for test: ', len(set(labels))
这个脚本主要是配合imagenet做的脚本,实际中有很多文件是不需要写入的。而Imagenet这么做的主要理由是在可视化的时候,可以直接看到name等信息。实际,在某些分类中,可能并不关心label的实际name。
在数据预处理完成之后,我们使用caffe提高的imagenet的数据生成脚creat_imgnet.sh本来生成训练数据,注意在caffe路径下使用sh命令,否则里面的一些引用路径会有报错,需要再配置路径。对于creat_imgnet.sh文件,需要注意路径的配置,这里列出一部分,其他的可以参照这些进行修改。主要如下:
EXAMPLE=facenet/face_256_256_31w_alax
# 生成模型训练数据文化夹
TOOLS=build/tools
# caffe的工具库,不用变
DATA=/home/face/facenet/
# python脚步处理后数据路径
TRAIN_DATA_ROOT=/home/face/facenet/train/
#待处理的训练数据
VAL_DATA_ROOT=/home/face/facenet/val/
# 带处理的验证数据
RESIZE_HEIGHT=256
# 把数据resize到模型输入需要的大小
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
# 训练数据文件名
$EXAMPLE/face_train_lmdb
# 生成训练数据,使用lmdb存储
之后使用imagenet下的make_imagenet_mean.sh生成均值数据,同样需要注意修改路径,以及在caffe路径下使用sh命令。
这里我们也可以自己写脚本生成caffe需要的格式类型。
更新与:增加levelDB的格式,这里的输入是三张照片,对应的是一个label的。类似于Triplet Loss的输入。注意:这里的三张照片是随机选取的,并没有完整的遍历所有的,而且生成的数量比较少。这个只是例子,需要自己改动来实现自己需要的脚本,比如多label的或者等等。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division
from __future__ import print_function
import numpy as np
import caffe
import leveldb
def deal_img(fpath):
image = caffe.io.load_image(fpath)
# Reshape image
image = image[:, :, (2, 1, 0)]
image = image.transpose((2, 0, 1))
image = image.astype(np.uint8, copy=False)
return image
def write_levelDB(dbname, images_lists):
db = leveldb.LevelDB(dbname, create_if_missing=True,
error_if_exists=True, write_buffer_size=)
wb = leveldb.WriteBatch()
for count, pic in enumerate(images_lists):
f1, label1 = pic[0], pic[1]
# data_pos
f2, label2 = pic[2], pic[3]
# data_anc
f3, label3 = pic[4], pic[5]
# data_neg
img1 = deal_img(f1)
img2 = deal_img(f2)
img3 = deal_img(f3)
image = np.vstack((img1, img2, img3))
label = label1
# Load image into datum object
db.Put('%08d_%s' % (count, file), datum.SerializeToString())
if count % 1000 == 0:
# Write batch of images to database
db.Write(wb)
wb = leveldb.WriteBatch()
print('Processed %i images.' % count)
if count % 1000 != 0:
# Write last batch of images
db.Write(wb)
print('Processed a total of %i images.' % count)
print('Processed a total of %i images.' % count)
fpath = "/home/facenet/"
images_dic = {}
for n, name in enumerate(os.listdir(fpath)):
np.random.seed(1337)
pics = [os.path.join(fpath, name, i)
for i in os.listdir(os.path.join(fpath, name))]
np.random.shuffle(pics)
images_dic[n] = pics
images_list = []
num = len(images_dic.keys())
print(n, num)
for name, pics in images_dic.iteritems():
for i in xrange(len(pics)):
k = np.random.randint(0, num)
if k == name:
if k != 0:
others = images_dic[k]
other = others[np.random.randint(0, len(others))]
images_list.append([pics[i], name,
pics[i - 1], name,
other, k])
print("len of images_list", len(images_list))
np.random.seed(1337)
np.random.shuffle(images_list)
write_levelDB("data_train_leveldb/", images_list[2000:])
write_levelDB("data_test_leveldb/", images_list[0:2000])
2.2、模型配置
在模型配置里,我们可以直接使用alex模型或者googlenet模型,他们提供了train_val.prototxt文件,这个文件主要用于配置训练模型,可以自定义层数以及每层的参数。尤其是对于卷积层的里参数,需要对CNN有一定的理解。这里不细说CNN模型,只考虑应用。在应用层面,需要注意的是数据层。在数据定义层,Caffe生成的数据分为2种格式:Lmdb和Leveldb。它们都是键/值对(Key/Value Pair)嵌入式数据库管理系统编程库。虽然lmdb的内存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允许多种训练模型同时读取同一组数据集。需要注意的一些参数如下:
name: "data"
type: DATA
top: "data"
top: "label"
data_param {
source: "facenet/face_train_lmdb"
# 训练数据路径
backend: LMDB
# 值得数据格式
batch_size: 128
# batch数一般设置为8的倍数,训练比较快
# 数据变换层
transform_param {
crop_size: 227
# 数据cropsize是模型的真正输入大小
mean_file: "facenet/face_mean.binaryproto"
# 均值数据路径
mirror: true
include: { phase: TRAIN }
这里需要注意的另一个事情是,在分类层那里(在alex模型里,是fc8层的INNER_PRODUCT里的num_output),需要把默认的类别数改为你自己数据的训练类别数。
2.3、模型训练
如果对都没有啥问题,就可以训练模型了,使用梯度下降法。训练模型之前,我们需要定义solver文件,即solver.prototxt,在该文件里,指定迭代次数,是否使用GPU,以及保存中间模型的间隔次数、测试间隔等等。
net: "facenet/train_val.prototxt"
#指定训练模型配置文件
test_iter: 1000
test_interval: 1000
# 每迭代1000次,进行一次测试(测试不要太频繁)
base_lr: 0.01
# 初始学习速率
lr_policy: "step"
# 学习速率更新方式,每隔多少步更新,也可以使用poly或者constant等等方式
gamma: 0.1
# 学习速度衰减系数
stepsize: 100000
# 每迭代这个么次,新学习速率=学习速度乘以衰减系数gamma
display: 2000
# 每隔两千次打印一次结果
max_iter: 350000
# 训练一共迭代次数
momentum: 0.9
# momentum系数
snapshot_prefix: "facenet/"
# 保持中间模型路径
之后在caffe目录下,使用imagenet模型提供的train.sh。这里建议把各个sh文件和训练数据以及均值文件放一起,配置文件和中间模型放在同一路径,置于sh文件下的子文件,这里可以很容易的知道一个模型是结果是采用了什么配置,避免混乱。train里的命令如下:
./build/tools/caffe train
--solver=facenet/solver.prototxt -gpu 0
这里需要注意,我们可以指定gpu的id(如果存在多个GPU,可以指定具体的GPU)。另外一点,如果我们增加了数据,需要重新训练模型的话,我们可以在训练的时候,指定已训练好的模型来初始化新训练的模型,这样能够加快我们的训练速度。比如
./build/tools/caffe train
--solver=facenet/solver.prototxt -gpu 0
-weights facenet/caffe_450000.caffemodel
那么新训练的模型,不会随机初始化权重,而是更具已训练的caffe_450000.caffemodel来初始化参数。这个初始化参数需要注意,这两个模型是相同的,只是输入数据量增多了。
如果我们finetuning的模型与已经训练不同怎么办呢?比如最开始我训练的模型是150像素大小的,而现在想训练一个250像素的模型,那么我们需要修改新模型的训练配置文件,把数据层的名字更新一下,使得新模型和旧模型的名字不一样,之后指定weight就可以,它会默认根据caffe层相同的名字来使用旧模型来初始化新模型,但是必须保证参数是对应的。如果相同名字的层的参数个数不对应,会报错!
此外,我们训练的方式也有很多种。比如一开始用一个模型训练之后,新增的数据,我们可以合并已有的数据,重新训练新模型,也可以使用旧的模型进行finetuning。在caffe目录下,有一个example和model文件夹,里面有很多例子可以使用,在对应的例子下有readme文件,可以在细节上深入理解。比如我们要输入一对数据,这样的模型如何训练呢?只需要更新一下训练配置文件,可以参考examples/siamese下的例子。
3、模型使用
模型的使用方式,这里根据caffe提供的python接口来简单介绍一下,这些例子在python文件下,已经提供了一些包装好的接口。而且在example下提供了一些ipython notebook详细的介绍了各个模块的使用。这里需要注意,我们的deploy.prototxt文件里,开始有四个input_dim,第一个input_dim是指图片数。由于这个接口是参考了AlexNet模型,所以在python的classify类里有一个系数oversample,默认是True的,意味着在预测的时候会对原始图像crop,默认是crop10张图片。注意在官方给的例子里,是使用了crop,所以他的input_dim是10,正好对应一张照片,他的第四个通道是对应第四个crop图片的特征。一般我们会选择False。此外,需要注意input_dim也对应了net.blobs[‘blob_name’]的照片数量维度。在net.predict([input_image])的时候,input_image可以是多张。如果输入张数和input_dim不一致,那么得到的net.blob里的特征数是与input_dim一致的,使得得到的特征与输入的特征无法一一对应。所以建议设置input_dim=2,一次输入两张照片,得到对应的两张照片的特征,用于比对。
此外,除了python的接口,caffe也提供命令行用于特征提取,这些都可以参考官方文档。
因为caffe的社区非常的强大,多数情况下,你遇到的问题,别人都遇到过了。所以,要善用google。也可以在github或者google邮件列表里,寻找一些答案。
Copyright (C)2017
& 转载文章请注明作者和出处! Powered by with技术小站:
地点:深圳
时间:11月2日 14:00 - 17:00
地点:深圳
时间:11月8日 13:00 - 17:30
地点:东莞
时间:11月9日 14:00 - 17:00
地点:西安
时间:11月16日 14:00 - 17:00
零基础快速成为Android项目开发工程师
ARM裸机开发实战(第1期加强版)
张飞硬件设计与开发视频教程
从0到1自己动手写嵌入式操作系统
张飞电子视频全套共十部
讲师:灵训教育
讲师:林超文
讲师:李述铜
讲师:张飞
移入鼠标可放大二维码
深度学习开源框架,AI从业者的选择之路
来源:雷锋网
作者:日 10:00
[导读] 深度学习是一个非常热门的领域,现在市面上也有很多非常优秀的平台,相信大家在入行之初都在想,这么多平台应该怎么选择?我先提两点,可能是一般测评没有考虑到的东西:一个是图像计算和符号求导,这是深度学习一个非常有意思且非常重要的副产物。另一个是深度学习框架的可触碰深度,这点直接关系到深度学习系统的发展未来和用户的自由度。
  本文内容来自微软美国总部机器学习科学家彭河森博士的分享,并由彭河森博士亲自整理成文。
  正如程序语言一样,深度学习开源框架同样各有优劣和适用的场景,那么 AI 从业者该如何有针对性地选择这些平台来玩转深度学习?
  本期特邀了先后在谷歌、亚马逊、微软供职的机器学习科学家彭河森博士为大家讲述《MXNet火了,AI从业者该如何选择深度学习开源框架》。彭河森博士亲眼见证并深入参与了这三家巨头布局深度学习的过程。
  嘉宾介绍
  彭河森,埃默里大学统计学博士。现担任微软美国总部的机器学习科学家、微软必应广告部应用资深研究员,当前主要研究方向是自然语言处理和机器学习在广告和推荐系统中的应用。此外,彭河森博士曾是亚马逊最年轻的机器学习研究员,之前还供职于谷歌计量经济学部和中科院。
  深度学习是一个非常热门的领域,现在市面上也有很多非常优秀的平台,相信大家在入行之初都在想,这么多平台应该怎么选择?
  我先提两点,可能是一般测评没有考虑到的东西:
  一个是图像计算和符号求导,这是深度学习一个非常有意思且非常重要的副产物。
  另一个是深度学习框架的可触碰深度,这点直接关系到深度学习系统的发展未来和用户的自由度。
  这两点对于初学者和从业人员都非常重要,我在后面详细讲述。
  首先要恭喜 MXNet 近日获得了亚马逊的背书,MXNet 平台本身非常优秀,具有很多优良的性质:例如多节点模型训练,目前是我知道最全面的多语言支持。此外,也有评测说 MXNet 性能方面可以高出同行平台很多,我们将会在后面的讨论中提到。现在进入正题,我们该如何选择深度学习开源平台,参考标准应该是什么样的?
  一、深度学习开源平台的 5 大参考标准
  今天主要探讨的平台(或者软件)包括:Caffe, Torch, MXNet, CNTK, Theano, TensorFlow, Keras。
  如何选择一个深度学习平台?我总结出了下面的这些考量标准。因人而异,因项目而异。可能你是做图像处理,也可能是自然语言处理,或是数量金融,根据你不同的需求,对平台做出的选择可能会不同。
  标准1:与现有编程平台、技能整合的难易程度
  无论是学术研究还是工程开发,在上马深度学习课题之前一般都已积累不少开发经验和资源。可能你最喜欢的编程语言已经确立,或者你的数据已经以一定的形式储存完毕,或者对模型的要求(如延迟等)也不一样。标准1 考量的是深度学习平台与现有资源整合的难易程度。这里我们将回答下面的问题:
  是否需要专门为此学习一种新语言?
  是否能与当前已有的编程语言结合?
  标准 2: 和相关机器学习、数据处理生态整合的紧密程度
  我们做深度学习研究最后总离不开各种数据处理、可视化、统计推断等软件包。这里我们要回答问题:
  建模之前,是否具有方便的数据预处理工具?当然大多平台都自身带了图像、文本等预处理工具。
  建模之后,是否具有方便的工具进行结果分析,例如可视化、统计推断、数据分析?
  标准 3:通过此平台做深度学习之外,还能做什么?
  上面我们提到的不少平台是专门为深度学习研究和应用进行开发的,不少平台对分布式计算、GPU 等构架都有强大的优化,能否用这些平台/软件做其他事情?
  比如有些深度学习软件是可以用来求解二次型优化;有些深度学习平台很容易被扩展,被运用在强化学习的应用中。哪些平台具备这样的特点?
  这个问题可以涉及到现今深度学习平台的一个方面,就是图像计算和自动化求导。
  标准 4:对数据量、硬件的要求和支持
  当然,深度学习在不同应用场景的数据量是不一样的,这也就导致我们可能需要考虑分布式计算、多 GPU 计算的问题。例如,对计算机图像处理研究的人员往往需要将图像文件和计算任务分部到多台计算机节点上进行执行。
  当下每个深度学习平台都在快速发展,每个平台对分布式计算等场景的支持也在不断演进。今天提到的部分内容可能在几个月后就不再适用。
  标准 5:深度学习平台的成熟程度
  成熟程度的考量是一个比较主观的考量因素,我个人考量的因素包括:社区的活跃程度;是否容易和开发人员进行交流;当前应用的势头。
  讲了 5 个参考标准后,接下来我们用上面的这些标准对各个深度学习平台进行评价:
  二、深度学习平台评价
  评判1:与现有编程平台、技能整合的难易程度
  标准1 考量的是深度学习平台与现有资源整合的难易程度。这里我们将回答下面的问题:是否需要专门为此学习一种新语言?是否能与当前已有的编程语言结合?
  这一个问题的干货在下面这个表格。这里我们按照每个深度学习平台的底层语言和用户语言进行总结,可以得到下表。
  其中 Keras 通过 Theano, TensorFlow 作为底层进行建模。
  我们可以看到这样的趋势:
  深度学习底层语言多是 C++ / C 这样可以达到高运行效率的语言。
  操作语言往往会切近实际,我们大致可以断定 Python 是未来深度学习的操作平台语言,微软在 CNTK 2.0 加入了对 Python 的支持。
  当然,还有不少平台可以通过脚本的方式配置网络并且训练模型。
  从格局上来说,Python 作为深度学习建模的基本语言是可以确定的。如果你最喜欢编程语言是 Python,恭喜您,大多数平台都可以和你的技术无缝衔接。如果是 Java 也不用担心,不少平台也具有 Java 支持,Deeplearning4J 还是一个原生的 Java 深度学习平台。
  标准 2: 和相关机器学习、数据处理生态整合的紧密程度
  这里我们要提一下现在主要的数据处理工具,比较全面的数据分析工具包括 R 及其相关生态,Python 及其相关生态,小众一点的还包括 Julia 及其相关生态。
  完成深度学习建模等任务之后,和生态的整合也尤为重要。
  我们可以发现,上面和 Python, R, 整合较为紧密,这里 Keras 生态(TensorFlow, Theano), CNTK, MXNet, Caffe 等占有大量优势。
  同时 Caffe 具有大量图像处理包,对数据观察也具有非常大的优势。
  标准 3:通过此平台做深度学习之外,还能做什么?
  下图是本次公开课的核心:
  其实深度学习平台在创造和设计时的侧重点有所不同,我们按照功能可以将深度学习平台分为上面六个方面:
  CPU+GPU控制,通信:这一个最低的层次是深度学习计算的基本层面。
  内存、变量管理层:这一层包含对于具体单个中间变量的定义,如定义向量、矩阵,进行内存空间分配。
  基本运算层:这一层主要包含加减乘除、正弦、余弦函数,最大最小值等基本算数运算操作。
  基本简单函数:
  ○ 包含各种激发函数(acvaon funcon),例如 sigmoid, ReLU 等。
  ○ 同时也包含求导模块
  神经网络基本模块,包括 Dense Layer, Convoluon Layer (卷积层), LSTM 等常用模块。
  最后一层是对所有神经网络模块的整合以及优化求解。
  众多机器学习平台在功能侧重上是不一样的,我将他们分成了四大类:
  1. 第一类是以 Caffe, Torch, MXNet, CNTK 为主的深度学习功能性平台。这类平台提供了非常完备的基本模块,可以让开发人员快速创建深度神经网络模型并且开始训练,可以解决现今深度学习中的大多数问题。但是这些模块很少将底层运算功能直接暴露给用户。
  2. 第二类是以 Keras 为主的深度学习抽象化平台。Keras 本身并不具有底层运算协调的能力,Keras 依托于 TensorFlow 或者 Theano 进行底层运算,而 Keras 自身提供神经网络模块抽象化和训练中的流程优化。可以让用户享受快速建模的同时,具有很方便的二次开发能力,加入自身喜欢的模块。
  3. 第三类是 TensorFlow。TensorFlow 吸取了已有平台的长处,既能让用户触碰底层数据,又具有现成的神经网络模块,可以让用户非常快速的实现建模。TensorFlow 是非常优秀的跨界平台。
  4. 第四类是 Theano, Theano 是深度学习界最早的平台软件,专注底层基本的运算。
  所以对平台选择可以对照上图按照自己的需求选用:
  如果任务目标非常确定,只需要短平快出结果,那么第 1 类平台会适合你。
  如果您需要进行一些底层开发,又不想失去现有模块的方便,那么第 2、3 类平台会适合你。
  如果你有统计、计算数学等背景,想利用已有工具进行一些计算性开发,那么第 3, 4 类会适合你。
  这里我介绍下深度学习的一些副产品,其中一个比较重要的功能就是符号求导。
  图计算和符号求导:深度学习对开源社区的巨大贡献
  大家可能会有疑问:我能训练出来深度学习模型就蛮好的了,为什么需要接触底层呢?
  这里我先介绍下深度学习的一些副产品,其中一个比较重要的功能就是符号求导。符号求导英文是 Symbolic Differentiation,现在有很多有关的文献和教程可以使用。
  符号求导是什么意思?
  以前我们做机器学习等研究,如果要求导往往需要手动把目标函数的导数求出来。最近一些深度学习工具,如 Theano, 推出了自动化符号求导功能,这大大减少了开发人员的工作量。
  当然,商业软件如 MatLab, Mathematica 在多年前就已具有符号计算的功能,但鉴于其商业软件的限制,符号计算并没有在机器学习应用中被大量采用。
  深度学习由于其网络的复杂性,必须采用符号求导的方法才能解决目标函数过于复杂的问题。另外一些非深度学习问题,例如:二次型优化等问题,也都可以用这些深度学习工具来求解了。
  更为优秀的是,Theano 符号求导结果可以直接通过 C程序编译,成为底层语言,高效运行。
  这里我们给一个 Theano 的例子:
  》》》 import numpy
  》》》 import theano
  》》》 import theano.tensor as T
  》》》 from theano import pp
  》》》 x = T.dscalar(&x&)
  》》》 y = x ** 2
  》》》 gy = T.grad(y, x)
  》》》 f = theano.function([x], gy)
  》》》 f(4)
  上面我们通过符号求导的方法,很容易的求出 y 关于 x 的导数在 4 这个点的数值。
  标准 4:对数据量、硬件的要求和支持
  对于多 GPU 支持和多服务器支持,我们上面提到的所有平台都声称自己能够完成任务。同时也有大量文献说某个平台的效果更为优秀。我们这里把具体平台的选择留给在座各位,提供下面这些信息:
  首先想想你想要干什么。现在深度学习应用中,需要运用到多服务器训练模型的场景往往只有图像处理一个,如果是自然语言处理,其工作往往可以在一台配置优秀的服务器上面完成。如果数据量大,往往可以通过 hadoop 等工具进行数据预处理,将其缩小到单机可以处理的范围内。
  本人是比较传统的人,从小就开始自己折腾各种科学计算软件的编译。现在主流的文献看到的结果是,单机使用 GPU 能比 CPU 效率提高数十倍左右。
  但是其实有些问题,在 Linux 环境下,编译 Numpy 的时候将线性函数包换为 Intel MLK 往往也可以得到类似的提高。
  当然现在很多评测,往往在不同硬件环境、网络配置情况下,都会得到不一样的结果。
  就算在亚马逊云平台上面进行测试,也可能因为网络环境、配置等原因,造成完全不同的结果。所以对于各种测评,基于我的经验,给的建议是:take it with a grain of salt,自己要留个心眼。前面我们提到的主要工具平台,现在都对多 GPU、多节点模型训练有不同程度的支持,而且现在也都在快速的发展中,我们建议听众自己按照需求进行鉴别。
  标准 5:深度学习平台的成熟程度
  对于成熟程度的评判往往会比较主观,结论大多具有争议。我在这里也只列出数据,具体如何选择,大家自己判断。
  这里我们通过 Github 上面几个比较受欢迎的数量来判断平台的活跃程度。这些数据获取于今天下午()。我们用黑体标出了每个因子排名前三的平台:
  第一个因子是贡献者数量,贡献者这里定义非常宽泛,在 Github issues 里面提过问题的都被算作是 Contributor,但是还是能作为一个平台受欢迎程度的度量。我们可以看到 Keras, Theano, TensorFlow 三个以 Python 为原生平台的深度学习平台是贡献者最多的平台。
  第二个因子是 Pull Request 的数量,Pull Request 衡量的是一个平台的开发活跃程度。我们可以看到 Caffe 的 Pull Request 最高,这可能得益于它在图像领域得天独厚的优势,另外 Keras 和 Theano 也再次登榜。
  另外,这些平台在应用场景上有侧重:
  自然语言处理,当然要首推 CNTK,微软MSR(A) 多年对自然语言处理的贡献非常巨大,CNTK 的不少开发者也是分布式计算牛人,其中所运用的方法非常独到。
  当然,对于非常广义的应用、学习,Keras/TensorFlow/Theano 生态可能是您最好的选择。
  对于计算机图像处理,Caffe 可能是你的不二选择。
  关于深度学习平台的未来:
  微软在对 CNTK 很有决心,Python API 加的好,大家可以多多关注。
  有观点认为深度学习模型是战略资产,应该用国产软件,防止垄断。我认为这样的问题不用担心,首先 TensorFlow 等软件是开源的,可以通过代码审查的方法进行质量把关。另外训练的模型可以保存成为 HDF5 格式,跨平台分享,所以成为谷歌垄断的概率非常小。
  很有可能在未来的某一天,大家训练出来一些非常厉害的卷积层(convolution layer),基本上能非常优秀地解决所有计算机图像相关问题,这个时候我们只需要调用这些卷积层即可,不需要大规模卷积层训练。另外这些卷积层可能会硬件化,成为我们手机芯片的一个小模块,这样我们的照片拍好的时候,就已经完成了卷积操作。
开源框架相关文章
开源框架相关下载
AI相关文章
AI相关下载
技术交流、积极发言! 发表评请遵守相关规定。
创新实用技术专题
Android和iOS两个平台在技术和应用程序商店战略上存在明显的不同,开发人员也...
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-

我要回帖

更多关于 前端mvc框架有哪些 的文章

 

随机推荐