现在的项目里普遍使用Estimator一套,使用tf.data构建数据流。听大佬讲代码提到为什么使用前者不用后者?
首先看下两者的定义:
tf.placeholder_with_default(input, shape, name=None)
<span class="pln">tf</span><span class="pun">.</span><span class="pln">compat</span><span class="pun">.</span><span class="pln">v1</span><span class="pun">.</span><span class="pln">placeholder</span><span class="pun">(</span><span class="pln"> dtype</span><span class="pun">,</span><span class="pln"> shape</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">=</span><span class="kwd">None</span><span class="pln"> </span><span class="pun">)</span> 二者的区别在于传参。placeholder_with_default 需要传入对应的input,官方文档说output没有被fed时此时获取的是input 的数据。 这句话乍一看还真的不好理解,output是啥? 在这里实际上是 placeholder_with_default 这个函数的返回值,就是定义了一个Tensor 更好听的就是占位符。 给这个Tensor赋值有两种情况: (1)在模型训练阶段:从数据流可以获取数据喂到这个 Tensor,该值就是与 Input 一致。 (2)在线上推理的时候直接喂到这个 Tensor。 上面的第二点就阐述了官方文档的说明,可以仔细的品一下。 对于 Placeholder 很早以前使用过,那时候的使用还是使用Tf.Session 然后使用feed_dict的方式给Tensor赋值 这个有个问题就是feed_dict要求传入的值都是原始类型,对比 placeholder_with_default 可以传入一个Tensor, 这个很容易与数据流打通,尤其是对Tfrecord数据的读取过程。如果是读取原始数据的确是可以使用Placeholder,但是现在 但是现在应该不太建议了。