前言:下面整理了tensorflow2.x学习的过程中自己整理的一些笔记,后续会不断的更新
(1)第一步:登录服务器:——使用SSH登录
在本地计算机使用先用ssh工具重定向:
ssh -L 16006:127.0.0.1:6006 name@server_ip -p 22 # 你的用户名name和ip 有的服务器做了端口映射 所以-p后面添加你服务器的连接端口号,默认是22端口
其中:16006代表自己本机的端口号,6006是服务器上tensorboard使用的端口号。
(2)在本地终端开启tensorflow
export LC_ALL=C
tensorboard --logdir=path --port=6006 # path是你服务器上保存的tensorboard文件的目录,这里需要尤其注意
(3)本地浏览器浏览
本地浏览器输入:http://127.0.0.1:16006/
上述三部即可在本地浏览器查看服务器端的tensorboard文件了
(1)关于子类化模型的保存问题
踩过坑,关于子类化模型没有使用默认的fit进行训练,而是自定义训练过程,保存模型的时候出现错误,不能够保存整个模型,需要设置model._set_inputs()
参见我的博文:详解tensorflow2.0的模型保存方法(一)
(2)关于验证GPU是否可用的问题
即使通过tf.test.xxx和tf.cinfig.xxx验证了GPU、CUDA、CUDNN都是返回的True,也并不代表这个TensorFlow是可以正常使用的,我们在编写卷积层使用conv2d或者是Conv2D的时候,在使用lstm或者LSTM的时候依然是错误的,这可能是我们所安装cudnn版本太低的问题,
比如我使用tensorflow2.1,CUDA10.1、cudnn7.6.3 就出现了这个问题,找了很久,后来将cudnn7.6.3更新成cudnn7.6.5就成功了!
(3)tensorflow2.1在使用keras的评价指标的时候出现的坑
需要格外注意的是:在使用tf.keras.metrics.xxx中的任意一个内容的时候,大概会需要160M以上的内存,若果是显卡被别人占用。比如我就什么都不运算,就只下面的一句话,看起来什么也没有干,但是它依然报错了:
import tensorflow as tf
acc = tf.keras.metrics.CategoryAccuracy()
则会报错,报错内容为:
tensorflow.python.framework.errors_impl.InvalidArgumentError: assertion failed: [0] [Op:Assert] name: EagerVariableNameReuse
所以在使用的时候应该指定未使用的GPU,已确定不会出错,
这个坑自己踩了,足足花了两天时间才解决。
(3)在进行卷积运算的时候或者是循环神经网络的时候出现如下错误:
could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
在网上试了很多方法,什么清空缓存,即rm -rf ~/.nv/
然后什么CUDA与CUDNN的版本不匹配,尝试了各个版本的cudnn,最终依然得不到解决,个人解决方案很简单,那就是查看一下GPU是不是别人在使用,比如我在测试的时候总是出现这个错误,一看发现别人正在还用GPU:0,及时通过查看,GPU:0的使用不到40%。自己怎么不能用呢?可能是别人设置了什么,所以解决办法就是:
通过tf.device()重新指定一块GPU,即可
或者是有时候模型过于庞大,GPU内存装不下,也会出现这样的问题。
3.1 三种计算图:
- tf1.x的默认自动静态图、分为两步:第一步:定义计算图,第二步:通过会话执行计算图
- tf2.x的默认自动动态图、定义和执行是立即执行的,立即得到返回结果。
- 使用tf.function包装的AutoGraph。运行该函数就相当于在TensorFlow1.0中用Session执行代码。使用tf.function构建静态图的方式叫做 Autograph.
什么是计算图呢?
计算图由节点(nodes)和线(edges)组成。
节点表示操作符Operator,或者称之为算子,线表示计算间的依赖。
实线表示有数据传递依赖,传递的数据即张量。
虚线通常可以表示控制依赖,即执行先后顺序。
可以用@tf.function装饰器将普通Python函数转换成和TensorFlow1.0对应的静态计算图构建代码。
在TensorFlow1.0中,使用计算图分两步,第一步定义计算图,第二步在会话中执行计算图。
在TensorFlow2.0中,如果采用Autograph的方式使用计算图,第一步定义计算图变成了定义函数,第二步执行计算图变成了调用函数。(即定义python函数就相当于是定义计算图、调用该函数就相当于于是执行计算图)
实践中,我们一般会先用动态计算图调试代码,然后在需要提高性能的的地方利用@tf.function切换成Autograph获得更高的效率。
3.2 tensorflow2.x的三种API
低阶API
中阶API:包括数据管道tf.data、特征列feature_column、激活函数、损失函数、各种层、评估指标、优化器、回调函数
高阶API:
构建模型的三种方法:
低阶函数构建
使用Sequence和Model构建
使用SubModel来构建
训练模型的三种方法:
内置fit、evaluate方法
内置tran_on_batch、test_on_batch方法
自定义训练循环
总结:三个三,即三种计算图、三种构建模型方法、三种训练方法。