先用几行代码对比下各个框架写网络模型的一般套路。
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