记录我的Tensorflow2.0踩坑之路

2019-10-31 10:57:50 浏览数 (1)

Tensorflow2.0正式版终于发布了,对习惯了keras的朋友们来说恐怕早就开始用测试版了,而对于像我这种一直使用1.x的人来说2.0正式版简直就是灾难,原因就在于2.0并不向下兼容1.x,只是给了一个转换程序而已,这也就意味着以前写的基于1.x的不少程序可能要重新写了。

在官网给的两个例子一个是用序列形式写的,主要用到函数,

tf.keras.models.Sequential([])

具体用法就是按照顺序把卷积呀池化呀都挨个加入列表中就构建起一个模型了。另一个是用“类”形式写的其call部分就是模型的构架了。

序列形式看似简单,实则死板,对于构建复杂模型不够直观,而“类”形式是能够比较直观的构建复杂模型的,但是正如官网介绍的那样,这东西是给高手用的既然是高手自然要复杂很多,我试着写了一个随随便便一百多行,而且不少东西相互穿插,稍微没有经验的恐怕都会被搞得晕头转向,官网这两条路子看来都是不太好的,不建议大家用这两种方式写。

之后我就开始搜寻各种教程案例,最后发现还有两种写作形式,一个也属于序列构建模型方式,主要用到

model =tf.keras.models.Sequential()

函数然后给model.add来一层一层的添加模型类,似官网的方式。另一个则是用tf.keras.Input函数作为模型的输入且在该函数里说明输入tensor的shape,再直接构建模型其余部分然后用函数

model=tf.keras.Model(inputs, outputs,name='mymodel')

把输入和输出上下文做一个连接这就定义好一个模型了,这种写作方式构建模型灵活直观,实在是不明白官网为何不以这种形式作为范例。

2.0模型构建模型的方式很多样,而之后训练模型的写法也有两种,一种是利用model.fit函数直接把训练集和测试集以及要训练多少个epochs等等输入就可以开始训练模型了可以说十分简便。另一种则是异常复杂的方式,也就是官网提供的给高手用的方式,这种写法要利用

tf.data.Dataset.from_tensor_slices

这个函数把数据先整理成一个迭代器并且洗牌和设定批量大小然后使用循环依次提取来训练模型,中间还要设定具体更新和测试过程十分复杂。这种方式基本上把所有步骤都拆分开写,这么写的好处就是你可以灵活修改训练过程,而model.fit只能依赖有限的回调函数来实现包括学习率衰减断点继续训练等功能。这两种写法各有所长,如果你对训练过程没有特殊的修改需求的话建议还是用model.fit这种写法吧!

最后总结一下,最好用的构建模型的方式是用tf.keras.Input函数和

model=tf.keras.Model(inputs, outputs,name='mymodel')

函数直接构建网络,而训练部分如果没有特殊需求还是用.fit比较好。总的说来2.0确实比1.x进步很多,只不过对于1.x的老用户来说可能要付出一些时间成本来学习了,对于keras用户来说由于2.0与keras深度合体则要轻松许多,甚至找不到办法的时候就查找kares的解决办法,说不定就解决了。

具体整理宝典如下,下载链接:

链接: https://pan.baidu.com/s/1MPcB5-He3p3RJhVrRJXFmA

提取码: ch7h

0 人点赞