同时掌握pytorch、tensorflow、keras,三者建模对比

先用几行代码对比下各个框架写网络模型的一般套路。

pytorch:

from torch.optim as Optimizer                       #Pytorch中优化器接口
from torch import nn                                #Pytorch中神经网络模块化接口

Class XXmodel(nn.Module) :                          #nn.Module所有网络的基类
  def init(self,~):
     #在这里设计模型结构
  def forward(self, input) :
     #在这里计算一次前向传播结果 
      
optimizer = Optimizer.XXX()                          #这里是实例化一个optimizer,也可以是自己定义的一个继承了Optimizer的Class

optimizer.zero_grad()                                #梯度清零

input = torch.tensor( data , dtype = torch.xxdtype)  #把数据转换成tensor

model = XXmodel()                                    #实例化网络模型

ouput = model(input)                                 #一次前向传播

loss = loss_fn(output, target)                       #计算损失

optimizer.backward(loss)                                      #计算梯度

optimizer.step()                                     #一次梯度下降

nn模块的一些常用module列举下:

nn.RNN()
nn.Linear()
nn.BatchNorm1d()
nn.Embedding()
nn.Dropout()
nn.Parameter()

不够用就自定义,module是可以嵌套的。

Keras:

from keras.layers import Input,Embeding,Dense
from keras.models import Model
import keras.backend as K
from keras.optimizers import Adam

x1 = Input((维度,))

y1 = Embedding(output_dim,input_dim,)(x1)  or XXmodel(模型参数)(x1)    #y1通过x1推导

my_model = Model(x1,y1)                                                 #keras只需要输入和输出的Input就可以建模

loss = K.binary_crossentropy(y, y1)                                     #写清楚loss计算方法

my_model.add_loss(loss)

my_model.compile( optimizer='sgd')

#也可以在compile中指定模块中loss方法

my_model.compile(loss=losses.mean_squared_error, optimizer='sgd')       #compile集成了loss,optimizer

my_model.fit(x_train, y_train, epochs=5, batch_size=32)                 #fit开始训练

感觉keras不用自己去写循环去更新每次梯度,很方便。模型构建也方便,x,y推导关系确定了,模型结构就确定了。

tensorflow:

estimator = tf.estimator.Estimator(
    model_fn, #模型函数
    model_dir=None, #存储目录
    config=None, #设置参数对象
    params=None, #超参数,将传递给model_fn使用
    warm_start_from=None #热启动目录路径
)
model_fn = my_model(
  features, #输入的特征数据
  labels, #输入的标签数据
  mode, #train、evaluate或predict
  params #超参数,对应上面Estimator传来的参数
)
def my_model(features,labels,mode,params)):
  #推导关系
  net = tf.feature_column.input_layer(features, params['feature_columns'])
  logits = tf.layers.dense(net, params['n_classes'], activation=None)

  #预测模式:
  predicted_classes = tf.argmax(logits, 1)
  if mode == tf.estimator.ModeKeys.PREDICT:
      #要预测的东西
      predictions = {"CLASS":predicted_class}
      return tf.estimator.EstimatorSpec(mode, predictions=predictions)
   
  #训练模式
   loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
   if mode == tf.estimator.ModeKeys.TRAIN:
       optimizer = tf.train.AdagradOptimizer(learning_rate=0.1)
       train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())  #执行优化!
       return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

  #评价模式
    accuracy = tf.metrics.accuracy(labels=labels,
                                   predictions=predicted_classes,
                                   name='acc_op') #计算精度
    metrics = {'accuracy': accuracy} #返回格式
    if mode == tf.estimator.ModeKeys.EVAL:
        return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops=metrics)

estimator.train(input_fn,其他参数)   or eval() or predict()                         #input_fn是制作tfdataset的函数

tensorflow的estimator功能十分丰富,模型结构,optimizer,loss计算,训练、评估、测试都包含在里面,可以看出很tensorflow更偏底层,封装的东西更少,看到了东西更多。

个人认为:

论代码简洁 keras>pytorch>tensorflow

论可读性 pytorch>keras>tensorflow

    原文作者:不为法华转
    原文地址: https://zhuanlan.zhihu.com/p/78525551
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞