Tensorflow、Caffe、Pytorch与Keras深度学习库总结

尊敬的读者您好:笔者很高兴自己的文章能被阅读,但原创与编辑均不易,所以转载请必须注明本文出处并附上本文地址超链接以及博主博客地址:https://blog.csdn.net/vensmallzeng。若觉得本文对您有益处还请帮忙点个赞鼓励一下,笔者在此感谢每一位读者,如需联系笔者,请记下邮箱:[email protected],谢谢合作!

在做自然语言处理项目时,大多时间多在使用Tensorflow,很少接触其他流行的深度学习库如 Caffe、Pytorch、Keras、MXNet与Theano等,为了对各大主流深度学习库也要有所了解,下面就对各大深度学习库做一个小结。

一、Tensorflow的使用方法(先定义再执行)

① 定义参与构建计算图的变量(包括接受输入数据的变量);
② 定义网络结构:隐含层与输出层;
③ 定义loss表达式并选择optimizer来优化loss函数;
④ 创建sess来执行计算图(即对所有变量进行初始化,同时采用sess.run optimizer进行多次迭代学习以使loss达到最小)
 

二、Caffe的使用方法( 流水线写网络 )

① Convert data(run a script) 把图像处理成Caffe支持的格式,如 LMDB格式等
② Define net ( edit proto.txt ) 定义网络结构
③ Define solver and parameter (edit proto.txt ) 定义优化器与参数,如学习率,迭代次数等
④ Train  ( run a script.sh ) 训练
⑤ Test ( run a script.sh ) 测试

三、Keras的使用方法( 号称10行代码搭建神经网络 )

① 选择模型 model = Sequential()
② 定义网络结构,通过model.add()函数进行构建网络,如

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函数

④ 训练网络与调参(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)))

四、Pytorch的使用方法( 先定义再执行 )

① 定义参与构建计算图的变量(包括接受输入数据的变量);
② 定义网络结构:隐含层与输出层;
③ 定义loss表达式并选择optimizer来优化loss函数;
④ 执行计算图时,前向后向分开处理,如:

//样本数40000
for i in range(40000):
    //将模型中参数的梯度设为0
    optimzer.zero_grad()
    //计算网络前向传播输出
    out = net(x)
    //计算损失函数
    loss = loss_func(out, y)
    //计算网络反向传播输出
    loss.backward()
    //调用该方法以更新参数
    optimzer.step()

小结一下:大体来看,使用Pytorch和TensorFlow是一样的套路,但两者还是有一点区别:Pytorch是一个动态的框架,而TensorFlow是一个静态的框架。TensorFlow构建的计算图一旦定义好就不能够变了,只能传入不同的数据进行计算,然而TensorFlow固定了计算的流程,势必会带来不灵活性,倘若想要改变计算的逻辑,或者说计算逻辑是随着时间变化的,那么对于这样的动态计算而言,TensorFlow是无法实现的,即便能实现也很麻烦,而Pytorch就可以很好的解决这个问题。



日积月累,与君共进,增增小结,未完待续。

发布了152 篇原创文章 · 获赞 147 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/Vensmallzeng/article/details/100114636
今日推荐