1:安装GPU-tensorflow那些坑:
详见我的另一篇因为中文输入法崩溃掉而写的英文博文。
2:tf.slice
tf.slice可以给我们返回一个切成的slice的列表,别被官方文档的例子迷惑了
3:legacy_seq2seq的输入
要输入一个list, list里面都是长度为batch的一维tensor, 所以记得给placeholder切片。
4: Dst tensor is not initialized.
This is a common bug while training on a public SVM, and it's cause is that your GPU doesn't have enough memory for you. So if you're a user of NVIDIA-gpu, use the command " nvidia-smi " to check what's happening in your GPU.
5: 手动指定GPU之后意外小规模地使用了其他GPU
原因:以指定在gpu6上计算为例。使用tf.device("/gpu:6")只是保证tensorflow只使用gpu6计算,其他gpu还是会按照规定的使用率(默认是占满)去占
解决方法是再手动指定一下可见设备,这样就强硬地解决了这个问题。
代码:在引用了os库之后 os.environ["CUDA_VISIBLE_DEVICES"] = "6"
或是在运行前,在终端使用cuda的命令设置变量:CUDA_VISIBLE_DEVICES=0 python xxx.py
其中xxx.py就是你要执行的python脚本的文件名
6:有关循环
在构图的时候永远也不要用for循环,否则Tensorflow的拓扑排序会失败:它不知道什么顺序什么时候究竟发生了什么,以及变量复用可能带来的一系列情况,使得计算图出现有向环,拓扑排序失败。
解决办法:使用tf.while_loop()函数,要特别注意的是千万千万避免出现以下情况:A在cond和body之前定义,在cond和body里面又调用一次,然后在cond和body之后再用,这样会报错:A在循环中。此外,还要注意的是循环的变量默认形状是不能变的,若要变化需要在while_loop()参数中指定一个更为宽松的形状条件,比如A在两次循环中维度为[10, 20], [10, 30],之后都是第二个元素在变,那么就将A的形状指定为[10, None]就完事大吉了