Tensorflow 坑(和一些说明)

工作中遇到的一些问题,随手记下
来自我的cmd https://www.zybuluo.com/jiehanwang/note/770502

    • densenet 耗费显存的解释:

    不少人跟我们反映过 DenseNet 在训练时对内存消耗非常厉害。这个问题其实是算法实现不优带来的。当前的深度学习框架对 DenseNet 的密集连接没有很好的支持,我们只能借助于反复的拼接(Concatenation)操作,将之前层的输出与当前层的输出拼接在一起,然后传给下一层。对于大多数框架(如 Torch 和 TensorFlow),每次拼接操作都会开辟新的内存来保存拼接后的特征。这样就导致一个 L 层的网络,要消耗相当于 L(L+1)/2 层网络的内存(第 l 层的输出在内存里被存了 (L-l+1) 份)。来自这里

    • tfrecord数据过大,导致训练迟迟不能运行(减少训练数据确实可以运行)。tfrecord为何需要如此巨大的cpu内存???

    • densenet 随着计算进行,CPU内存也逐渐增大,如下图:


      image_1br3j3cm319i61qq5qei97mgmhg.png-59.8kB
    • 在densenet_small代码中,用Momentum可以达到90%以上,而GD只能到80%左右。

    opt = tf.train.MomentumOptimizer(lr, 0.9, use_nesterov=True)
    # opt = tf.train.GradientDescentOptimizer(lr)
    
  1. 七个小贴士,顺利提升TensorFlow模型训练表现。链接

  2. tfrecord的数据必须保持完整,不然训练的时候会发生截断错误,导致退出

  3. retrain 报错:模型大小不能超过67M,新版的tf据说已经解决了这个问题,mac上运行也没有问题。但是yard估计没有更新。加入以下语句即可解决。export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python

  4. A placeholder generates an error if it is executed without a feed, so you won't forget to feed it. 如果用feeding输入数据的话,最好用placeholder,这样,如果没有输入,在编译的时候就会报错。

  5. sv = tf.train.Supervisor(logdir=log_path, init_op=init) 会判断模型是否存在.如果存在,会自动读取模型.不用显式地调用restore。如果训练程序shut down或者crash了,那么它最近的checkpoint以及事件文件就被留到了logdir里。当你重启程序的时候,managed_session会从最近的checkpoint中加载图,并且从中止的地方恢复训练。
    再youtube-8m的train代码中就是这种方式。

  6. 如果模型包含一个标量整型变量名字为global_step,则该变量的值会被添加到checkpoint文件名中。例如,在global step 1234,checkpoint 文件名就是 “model.ckpt-1234”。【youtube-8m中的模型保存方式】

  7. 深度学习theano/tensorflow多显卡多人使用问题集: https://zhuanlan.zhihu.com/p/23250782 里面提到,多人用同一块卡的时候容易出现一方的内存不足。TF默认会占用所有的显存。以及,如何设置TF占用显存的百分比。

  8. 当保存的模型带有设备信息时,可以用以下方法去除,这样在gpu上训练的模型就可以在只有cpu的机器上运行。

When importing such models, it's useful to be able to clear the device settings in the graph so that we can run it on locally available devices. This can be achieved by calling import_meta_graph with the clear_devices option set to True.

  1. 解决“device specification '/device:GPU:3' because no supported kernel for GPU devices is available.”问题的方法(这是一个坑)有些操作只能在cpu进行,不按照以下方式进行,可能会出错

I just follow mrry's suggestion here, adding "allow_soft_placement=True" as follows: config = tf.ConfigProto(allow_soft_placement = True) sess = tf.Session(config = config) Then it works. I reviewed the Using GPUs in tutorial. It mentions adding "allow_soft_placement" under the error "Could not satisfy explicit device specification '/gpu:X' ". But it not mentions it could also solve the error "no supported kernel for GPU devices is available". Maybe it's better to add this in tutorial text in order to avoid confusing future users.

  1. densenet并行化中,出现过的问题汇总:

1). ValueError: No variables to save。这是因为没有用同一个graph的命名空间。
2). ValueError: Variable BatchNorm/beta does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?
3). ValueError: Variable block_1/weight_conv_1 already exists, disallowed. Did you mean to set reuse=True in VarScope?
4). Variable conv2d/weight_conv_0/ExponentialMovingAverage/ does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?

  1. 下面的这篇并行方式值得参考:http://geek.csdn.net/news/detail/191567

  2. 如果想要达到重复利用变量的效果, 我们就要使用 tf.variable_scope(), 并搭配 tf.get_variable() 这种方式产生和提取变量. 不像 tf.Variable() 每次都会产生新的变量, tf.get_variable() 如果遇到了同样名字的变量时, 它会单纯的提取这个同样名字的变量(避免产生新变量). 而在重复使用的时候, 一定要在代码中强调 scope.reuse_variables(), 否则系统将会报错, 以为你只是单纯的不小心重复使用到了一个变量.

  3. Tensorflow cifar10_multi_gpu问题:"Variable conv1/weights/ExponentialMovingAverage/ does not exist". you can find the answer to your problem here: Issue 6220

You need to put: with tf.variable_scope(tf.get_variable_scope()) in front of the loop which runs over your devices ... so, do that:

with tf.variable_scope(tf.get_variable_scope()):
    for i in xrange(FLAGS.num_gpus):
        with tf.device('/gpu:%d' % i): 

The explanation is given in the link... Here the quote: When you do tf.get_variable_scope().reuse_variables() you set the current scope to reuse variables. If you call the optimizer in such scope, it's trying to reuse slot variables, which it cannot find, so it throws an error. If you put a scope around, the tf.get_variable_scope().reuse_variables() only affects that scope, so when you exit it, you're back in the non-reusing mode, the one you want.Hope that helps, let me know if I should clarify more.

  1. 如果要在tfrecord 上加上limit epoch数值如下:

    filename_queue = tf.train.string_input_producer(file_, num_epochs = FLAGS.num_epoch)
    

    需要初始化如下,否则会报错

    session.run(tf.global_variables_initializer())
    session.run(tf.local_variables_initializer())
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=session, coord=coord)
    
  2. train 和 test的数据流切换实现training的时候eval。参考这下面的链接。主要用到了tf.cond() 和 tf.QueueBase.from_list()函数【我没有搞定】

https://stackoverflow.com/questions/41162955/tensorflow-queues-switching-between-train-and-validation-data

  1. tfrecord 清点里面的数据数量

    c = 0
    for fn in tf_records_filenames:
      for record in tf.python_io.tf_record_iterator(fn):
         c += 1
    
  2. Densenet 采用内存优化的代码,其实就是给每个block加了一层1*1的卷积?这个理解有误,需要进一步查看文献

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,355评论 0 23
  • 总的来说, 对于嫌疑人X来说,在他看到自首的女人前,他觉得自己的献身,是非常值得的,因为那对母女把他从死亡边界拉回...
    只一点阅读 320评论 0 0
  • 终于,你也走了。你们在那边一定好好的。带给我们的欢乐永生难忘。乖,小虎。 心痛到极致时会忘记一切。
    执念馥郁阅读 126评论 0 0
  • 我们躲在虚掩的世界里 分头去疯 分头去疼痛 重逢 遥遥无期 为你写一百首诗 每一个字像泪一样流淌 像雪一样盛放 你...
    月宛央阅读 152评论 0 0
  • 读书的时候,特想有幅眼镜。那时候还不时兴文艺范儿,也不流行复古风,就觉得戴幅眼镜很有味道。自从有了这个梦想之后,...
    薇禾阅读 381评论 0 0