经典网络实现
前言
本意是了解如何自己构建网络,以防日后的模型迁移要再学一遍. 不要问为什么我知道要重学
可能网络会有错误,但是无伤大雅,知道如何构建就行 反正以后经典网络可以直接导入
不过在之前要先了解一下模型保存不同格式的区别以防模型实现了不会保存
模型保存
Save_model格式
这个是最简单粗暴的模型保存方法了。
保存的模型将包括:
- 模型的架构/配置
- 模型的权重值(在训练过程中学习)
- 模型的编译信息(如果调用了
compile()
) - 优化器及其状态(如果有的话,使您可以从上次中断的位置重新开始训练)
# 保存为dirname_path路径下文件名为dirname的文件夹 |
H5格式
Keras 还支持保存单个 HDF5 文件,其中包含模型的架构、权重值和
compile()
信息。它是 SavedModel 的轻量化替代选择。
但是同时因为只有一个h5文件与 SavedModel 格式相比,H5 文件不包括以下两方面内容:
- 通过
model.add_loss()
和model.add_metric()
添加的外部损失和指标不会被保存(这与 SavedModel 不同)。如果您的模型有此类损失和指标且您想要恢复训练,则您需要在加载模型后自行重新添加这些损失。请注意,这不适用于通过self.add_loss()
和self.add_metric()
在层内创建的损失指标。只要该层被加载,这些损失和指标就会被保留,因为它们是该层call
方法的一部分。 - 已保存的文件中不包含自定义对象(如自定义层)的计算图。
# 只需要在文件名后加.h5后缀即可 |
checkpoints
保存时附带签名
class Model(tf.keras.Model): |
ResNet
手写实现
不同的ResNet只有结构不同,unit是相同的只需要改变layer_dims就可以实现了
这里使用重写类来构建网络,虽然要写前向传播比较麻烦,但是自由度更高
import os |
自带api实现
因为application里面都有,功能都类似故后面不再赘述
from tensorflow.keras.applications import * |
VGG
这里使用keras的高级api来构建网络,当然使用Sequential也可以实现同样的效果.
# -*- coding:utf-8 -*- |
LSTM
前者需要手动更新state参数($h{t-1}$,$c{t-1}$)但是后者自动更新,如果需要多层叠加则需要设置return_sequence=True , unroll=True
# -*- coding:utf-8 -*- |
AutoEncoder|VAE
这里是自定义训练,当然相比之下更复杂但是自由度也更高。
autoencoder就是两个自定义网络,先降维得到特征向量h,再升到原本维度就行了没什么技术含量,就不写了,关键是它的思路非常具有启发性。
这里要注意的是mean,var Dense是两个Dense,即使计算方式一样但是要用两Dense,如果一个Dense算两次因为权重的原因结果是相同的,直接会导致图片越来越暗。
先附上tf.nn的几种损失函数区别再附代码
# -*- coding:utf-8 -*- |
Gan
WGAN原理
GAN一直面临着G,D训练困难、G,D的损失函数与训练好坏无关(由于js散度,loss 常常是log2)等问题,在此基础上便提出了WGAN,相对于传统的GAN,WGAN只做了几点改动确有很好的效果
- D的最后一层去掉sigmod
- G,Dloss不取log
- 每次更新D的参数后做一个梯度惩罚(gradient penalty)
GAN的原本损失函数为
但是这样导致了如果D太好了G则训练不到有效的梯度,G太好了D又训练不到有效的梯度
所以WGAN的损失函数改为了,在improve WGAN中还加入了gradient penalty
WGAN理论上给出了GAN训练不稳定的原因,即交叉熵(JS散度)不适合衡量具有不相交部分的分布之间的距离,转而使用wassertein距离去衡量生成数据分布和真实数据分布之间的距离,理论上解决了训练不稳定的问题。
WGAN相对于DCGAN,WGAN虽然收敛时间更长但是更稳定,所以对于更复杂网络来说更倾向于WGAN,比如使用resnet可以达到更好的结果。
code
generator里的反卷积参数必须最后要计算结果能吻合Discriminator的input_shape
因为要在batchnorm后面做激活所以不能像之前一样在卷积层里面激活。
这是我自己的wgan跑3000个epoch后的结果,可以明显看出学习到了头发和眼睛(相比之下别人调的参太牛了)
数据集kaggle上随便找啊,kaggle真香,各方意义上,
龙书里面的提到的数据集在这里https://pan.baidu.com/s/1Yn53uxFLCbja13_6Ay44MA
数据集来源在这里,我开始没看issue没找到这个数据集,爬到一半才看到😓,
我爬的数据在https://pan.baidu.com/s/1JsUHx_1blY6pGx0DQfE0nQ 提取码:3621 (只有三万张图片…
我写的gan参数太差了,看龙书说跑3万次似乎能得到比较好的效果?算了直接上别人已经调好参的WGAN代码吧,知乎那个调好参的DCGAN太猛了,300epoch居然就成型了orz(虽然我没跑
train函数
import os |
datasetload 函数
import multiprocessing |
1000epoch之后是这样
后记
本来是想每一个经典网络都详细写的,但是感觉这样会导致太专业全是公式也不会有人去仔细看 其实是我不会。结果变成了现在这种类似板子的东西。水博客才是原动力
终于体会到电脑的苦了,cpu占用率99% 还要开多线程同时爬图片…(虽然现在字都显示不出来了
这里就随便总结一下学习的经验:
代码方面
- keras.build(inputs_shape):这里最好是使用tuple形式表示不然会报奇怪的错,tensorflow和pytorch不同这方面更加严格。
- tf.losses: 这个模块里的函数大小写不同功能也是不同的,
具体可以看官网,如果用complie建议用大写的函数,自定义loss使用小写的函数 - sigmod和softmax: 当’分类’事物不完全相互独立可以使用sigmod否则softmax,softmax一定要onehot
- model.save:这个因为保存了网络结构只能用在纯自定义网络里,继承类是不行的。
- layers.BatchNormalization::这个函数有一个trainable参数,train=True|None,test=False|0,具体可以看源码说明,但是千万要设置正确原因可参考这里
- layers.Flatten与Dense:flatten只是单纯的reshape维度是固定的,Dense还作了一次全连接
网络等方面
可以从代码中看出现有的几种网络构建格式。当初我也纠结了许多,最后还是准备使用gan网络的格式,毕竟框架好用是好用,但这是牺牲‘自由’换来的,对后期自主构建网络可能会起到反效果。每个人喜好不同,也不用太参考我的建议。
k折验证等trick是视频里没有讲的(视频参考下面的学习资源),可以自己去看看相关trick。
学习资源
我才不是看到Gan可以随机生成老婆才想学Gan的
日月光华的《tensorflow入门学习与实战的》资源弄不到,可惜了免费课程讲的确实好就是太贵了。
就跟着龙书学Gan顺便复习了一遍经典网络,顺便附上李宏毅讲解的Gan网络(每次看完这种视频都感觉概率论白学了,建议李宏毅的可以先看一半再看龙书。
emmm,再附上别人整理的深度学习路线吧 应该不会有人看的完
本文链接:https://dummerfu.top/p/35344.html
版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议 转载请注明出处!