深度学习框架:caffe-tensorflow-keras-pytorch

    现有的几种深度学习的框架有:caffe,tensorflow,keras,pytorch以及MXNet,Theano等,可能在工业界比较主流的是tensorflow,而由于pytorch比较灵活所以在科研中用的比较多。本文算是对我这两年来使用各大框架的一个总结,仅供参考。

    大四的时候接触到的深度学习,那时候的毕设题目是基于深度学习的图像处理,我采用CNN处理进行细粒度的图像检索,把CNN改进成了双向的Bi-CNN。那时候正是caffe大火的时候,在图像处理领域尤其是CNN上确实十分吃香。但是caffe设计的时候就是针对图像,对于一些文本,流数据,时间数据的处理效果不好,所以caffe也只用过这一次。

使用caffe的流程
#第一步
把图像处理成caffe支持的格式
#第二步
定义网络结构(这是比较让人头疼的地方,几层每层的作用是什么)
#第三步
定义参数(学习率,迭代次数等)
#第四步
训练
#第五步
测试

    Tensorflow的体系就比较灵活,能够使用单个API将计算部署到服务器或移动设备中的某个或多个CPU或GPU上。然后研一上自然语言处理的时候需要做实体命名识别的作业,提到中文命名实体识别就会想到BiLSTM+CRF,github上的代码是基于tensorflow的,这是第一次使用tensorflow搭建模型。

使用Tensorflow搭建神经网络主要包含以下6个步骤
#定义添加神经层的函数
#准备训练的数据
#定义节点准备接收数据
#定义神经层:隐藏层和预测层
#定义loss表达式
#选择optimizer使loss达到最小
#对所有变量进行初始化,通过sess.run optimizer,迭代多次进行学习

    Keras由纯Python编写而成并基于Tensorflow、Theano以及CNTK后端,相当于Tensorflow、Theano、CNTK的上层接口,号称10行代码搭建神经网络,具有操作简单、上手容易、文档资料丰富、环境配置容易等优点,简化了神经网络构建代码编写的难度。目前封装有全连接网络、卷积神经网络、RNN和LSTM等算法。

#第一步:选择模型
model = Sequential()

#第二步:构建网络层
model.add(Dense(500,input_shape=(784,))) # 输入层,28*28=784 
model.add(Activation('tanh')) # 激活函数是tanh 
model.add(Dropout(0.5)) # 采用50%的dropout
model.add(Dense(500)) # 隐藏层节点500个 
model.add(Activation('tanh')) 
model.add(Dropout(0.5))
model.add(Dense(10)) # 输出结果是10个类别,所以维度是10 
model.add(Activation('softmax')) # 最后一层用softmax作为激活函数

#第三步:编译
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 优化函数,设定学习率(lr)等参数 
model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵作为loss函数

'''
#第四步:训练
.fit的一些参数
batch_size:对总的样本数进行分组,每组包含的样本数量
epochs :训练次数
shuffle:是否把数据随机打乱之后再进行训练
validation_split:拿出百分之多少用来做交叉验证
verbose:屏显模式 0:不输出  1:输出进度  2:输出每次的训练结果
'''
(X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自带的mnist工具读取数据(第一次需要联网)

#由于mist的输入数据维度是(num, 28, 28),这里需要把后面的维度直接拼起来变成784维 
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2])
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2]) 
Y_train = (numpy.arange(10) == y_train[:, None]).astype(int)
Y_test = (numpy.arange(10) == y_test[:, None]).astype(int)
model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3)
model.evaluate(X_test, Y_test, batch_size=200, verbose=0)

#第五步:输出
print("test set")
scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0)
print("")
print("The test loss is %f" % scores)
result = model.predict(X_test,batch_size=200,verbose=0)
result_max = numpy.argmax(result, axis = 1)
test_max = numpy.argmax(Y_test, axis = 1)
result_bool = numpy.equal(result_max, test_max)
true_num = numpy.sum(result_bool)
print("")
print("The accuracy of the model is %f" % (true_num/len(result_bool)))

    然后后来接触到GAN,seq-GAN的模型,他们用的都是pytorch,就去搭建了pytorch。pytorch和TensorFlow的一点区别,那就是pytorch是一个动态的框架,而TensorFlow是一个静态的框架。我们知道TensorFlow构建的计算图是不能够变的了,然后我们再传入不同的数据进去,进行计算。这就带来一个问题,就是固定了计算的流程,势必带来了不灵活性,如果我们要改变计算的逻辑,或者随着时间变化的计算逻辑,这样的动态计算TensorFlow是实现不了的,或者是很麻烦。pytorch就可以很好的解决这个问题。不过其实工业应用还是tensorflow比较多,或许是TensorFlow在GPU的分布式计算上更为出色,在数据量巨大时效率比pytorch要高一些,但好像学术科研的时候pytorch用的比较多,可能是pytorch比较灵活。

你可能感兴趣的:(算法-深度学习,内部威胁检测)