tensorflow2.0(2)-自定义Dense层以及训练过程

如题所述

第1个回答  2022-07-30

  之前展示了tensorflow2.0的一个初级的实用例子作为开始,对比1.x版本操作还是有好很多的。接下来也将继续从比较基础的层面去了解tf2.0的各种实现
  tensorflow2.0在上以keras去搭建网络,这种封装好的基础/高级api在使用上无疑更便捷,但在学习的过程中也不妨自己去实现一些功能,加深理解。
以实现最简单的全连接层和训练过程为例,

简单搭个网络:

我们可以用类去自定义Dense的功能,也是非常简单的

这一样来,就可以直接用自定义的类DenseLayer去替换keras的全连接层

对于实现分类的损失函数而言,也是简单粗暴的,对于标签的格式是one_hot的,用 tf.nn.softmax_cross_entropy_with_logits
反之 tf.nn.sparse_softmax_cross_entropy_with_logits ,本文自然用到了后者。

关于tf2.0,貌似 tf.GradientTape() 保留了下来,自定义梯度计算这一部分可以作为一个篇章去讲述,以后也会去探索
所以把单步训练和梯度更新过程写在一起

因为在loss_func的计算里包含了softmax,所以在最后一层不添加激活函数

参考上一篇文章,但也有不一样的地方,其中没用到测试集,只关注训练时loss的变化过程

最终可以看到loss是降得很快的

end.