深度学习框架(TensorFlow、keras、PyTorch)

  • Post author:
  • Post category:其他


一、TensorFlow(参见

中文文档

)

TensorFlow其命名基于工作原理,

tensor

意为

张量

(即多维数组),

flow

意为

流动

。即多维数组从数据流图一端流动到另一端。TensorFlow 让我们可以先绘制计算结构图, 也可以称是一系列可人机交互的计算操作, 然后把编辑好的Python文件转换成更高效的C++, 并在后端进行计算。

TensorFlow主要是由计算图、张量以及模型会话三个部分组成。首先需要构建一个计算图,然后按照计算图启动一个会话,在会话中完成变量赋值,计算,得到最终结果等操作。

1.数据流图(Data Flow Graph)

数据流图用

“结点”(nodes)和“线”(edges)

的有向图来描述数学计算。

  • “节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。
  • “线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。

张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。

2.TensorBoard(可视化工具)

为了更方便 TensorFlow 程序的理解、调试与优化,可以用 TensorBoard 来展现你的 TensorFlow 图像,绘制图像生成的定量指标图以及附加数据。

二、keras(具体使用参考

keras中文文档


Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速.

遵循 处理数据集——建立模型——compile(指定loss和优化器)——fit(train集)——evaluate(test集)——predict

1.数据集

keras内部收入了常用的一些数据集(电影评论IMDB、路透社新闻reuters、MNIST 手写字符数据集),直接import即可

譬如from keras.datasets import imdb

划分数据集可以直接导入sklearn.model_selection的中的train_test_split函数

2.建立模型

(1)顺序模型

可以用add方法,也可以直接按下图写在一起

注意需要在第一层指定input_shape,例如(784,),如果是二维的则可以直接指定input_length/input_dim = 784


embedding层

:可以自己导入预训练matrix,也可以导入,直接指定size。可以选择trainable为true或者false


BN层

:加速收敛,防止过拟合


dropout层

:指定随机失活率,防止过拟合,参数一般选0.5


LSTM层

:可以利用return_sequences参数来返回所有结果还是最后结果

(2)序贯模型

区别在于可以merge,还可以复用,更加灵活。而且predict_classes函数只能在序贯模型中使用。

(3)compile

主要用来指定优化器和loss,优化器可以自定义(调整

学习率

),也可以直接用’adam’等名称指定

注意,学习率过高可能导致模型完全不收敛

(4)fit

可以指定callbacks,譬如ModelCheckpoint、早停、或者自定义每个epoch都评估F1等

#自建召回率计算函数,每一Epochs都进行F1计算
from keras.callbacks import Callback
from sklearn.metrics import confusion_matrix, f1_score, precision_score, recall_score
class Metrics(Callback):
    def on_train_begin(self, logs={}):
        self.val_f1s = []
        self.val_recalls = []
        self.val_precisions = []
 
    def on_epoch_end(self, epoch, logs={}):
        val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()
        val_targ = self.validation_data[1]
        _val_f1 = f1_score(val_targ, val_predict,average='weighted')
        _val_recall = recall_score(val_targ, val_predict,average='weighted')
        _val_precision = precision_score(val_targ, val_predict,average='weighted')
        self.val_f1s.append(_val_f1)
        self.val_recalls.append(_val_recall)
        self.val_precisions.append(_val_precision)
        print( ' — val_f1: %f — val_precision: %f — val_recall %f' %(_val_f1, _val_precision, _val_recall))
        return
    
metrics = Metrics()
earlyStopping = EarlyStopping(monitor='val_acc', patience=5, verbose=1, mode='max')
filepath="xx.hdf5"
checkpoint = ModelCheckpoint(filepath,monitor='val_acc', verbose=1,save_best_only=True)
callbacks_list = [earlyStopping,metrics,checkpoint]

model.fit(x_train, y_train, batch_size=128,epochs=30,callbacks=callbacks_list,shuffle =True,validation_data=(x_test, y_test))

还可以使用callbacks中的TensorBoard

最简单的方式就是直接调用 tensorBoardCallback = TensorBoard(log_dir=’./logs’, write_graph=True),其他方式可

参考

(5)evaluate/predict

注意一一对应,如果将y改为one-hot编码,则对应的也要用predict_classes或者用np.max来找最大的那个label

3.Pytorch(

中文文档


Torch 自称为神经网络界的 Numpy, 因为他能将 torch 产生的 tensor 放在 GPU 中加速运算 (前提是你有合适的 GPU), 就像 Numpy 会把 array 放在 CPU 中加速运算,开发团队将 Lua 的 Torch 移植到了更流行的语言 Python 上,所以PyTorch 说他就是在神经网络领域可以用来替换 numpy 的模块。

PyTorch 最大优点就是建立的神经网络是

动态的

, 对比静态的 Tensorflow, 他能更有效地处理一些问题, 比如说 RNN 变化时间长度的输出。PyTorch还有自动求导机制。



版权声明:本文为zhiman_zhong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。