按照此处[ https://www.tensorflow.org/extend/adding_an_op]的示例,我创建了自己的运算符,我们将其MyConv

现在,如果我做这样的事情:

# placeholders for inputs and labels
input = tf.placeholder(...)
label = tf.placeholder(...)

# MyConv operator on inputs... returns 1D tensor
conv_out = my_module.my_conv(input, ...)
# final classifier 
output = tf.layers.dense(inputs=conv_out, units=10)

# eveything we need for backprop
probs = tf.losses.sparse_softmax_cross_entropy(logits=output, labels=label)
loss = tf.reduce_mean(probs)
adam_opt = tf.train.AdamOptimizer(learning_rate=0.01)
train_op = adam_opt.minimize(loss)

并使用简单的输入转发将模型运行N-1次,而使用反向传递仅运行N次:

num_of_chunks = 100

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for c in range(num_of_chunks):
        single_input = np.array(...)
        # for num_of_chunks-1 times, just push the single_input through the network
        if c != num_of_chunks - 1:
            result = sess.run([output], feed_dict={input:single_input})
        # only the last time, do the backprop and run the optimizer
        else:
            result, loss_out, train_out = sess.run([output, loss, train_op], feed_dict={input:single_input, label:np.array(...)})

有趣的事情发生了。 TF sess.run()方法将实例化MyConv类的一个对象并使用num_of_chunks-1次,但最后一次(当它执行此else路径时)将创建类MyConv的新对象并使用该新对象( MyConv()构造函数已被调用一次)。 看起来就像是因为我在else路径中引入了sess.run()sess.run()创建了MyConv运算符的新对象,而这并不是我所期望的行为(我将某些信息存储为私有类成员,并且我真的MyConv在运行会话时保留一个MyConv对象)。

因此,问题是:您是否知道sess.run()方法为什么会因为我从“仅向前模式”切换到“正向和反向传播模式”而创建了运算符的新对象?

还有,一个音符。 如果删除此if-else语句并让每个块都执行MyConv ,那么一切都很好,仅实例化和使用MyConv一个对象。

  ask by Vladimir Canic translate from so

本文未有回复,本站智能推荐:

1回复

sess.run()太慢

Tensorflow对象检测模块的sess.run()函数大约需要2.5秒来检测600x600图像中的边界模糊。 如何加快此代码的速度?
1回复

sess.run循环内

我有一个根据输入张量计算一系列操作的图。 该输入张量将从网络摄像头派生。 在这种情况下,我可以在while循环中包含sess.run(...) 。 但是,这是最佳选择吗? 在while循环的每次迭代中,图形中的张量(即权重)是否保持在GPU的内存中? 我读到,GPU计算最昂贵的部分是
2回复

当我调用“sess.run()”时,“python.exe”程序引发错误

当我运行以下行时: Python 停止工作,但是当我运行另一个示例(如下所示)时,Python 和 Tensorflow 不会引发任何错误。 我试着改变generation到1 ,而batch_size至1 ,但没有任何工作。 这是我的(Python)代码: 这是错误日志: 信息:我目前使用的是
2回复

sess.run()多个操作与多个sess.run()

在tensorflow中,如果我们想运行多个操作,那么将列表中的ops传递给单个sess.run()与使用多个sess.run()会有什么区别(例如速度或结果)。将一个操作传递给每个操作? 例: 编辑:最初,我还想知道是否存在多个会话会导致不同结果的情况,例如,计算图中的依赖关系导致执行
1回复

sess.run()无法运行?

我是新来的人,正在研究张量流并遇到问题。 以上是在main.py中导入的model_method.py。 main.py中的fittt函数: 在model_method.py中的build() : 在model_method.py中的fit() : 为了检查运行过程,我在mod
1回复

sess.run(LAYER)返回什么?

我试图四处搜寻,但奇怪的是,我找不到类似的东西。 假设我有一些完全连接的层: 当我用sess.run(...)运行它们时,我得到一个张量。 这个张量是多少? 是重量吗? 梯度? sess.run是否针对我们提供的所有类型的层都返回此值?
1回复

为什么在每个时期之后sess.run(tf.assign)需要更长的时间来执行?

我写了一个函数,通过tf.assign()函数在每个纪元后更新可训练变量,新值是numpy数组,并且在每个纪元后,可训练变量的形状不会改变。 但是,当时期增加时,尽管可训练变量的数量和形状相同,但是运行此代码的时间也增加了。 有没有人可以解释这种现象? start_time = time.t
2回复

sess.run()导致训练缓慢

我正在训练CNN,我相信我对sess.run()使用导致我的训练非常缓慢。 本质上,我使用的是mnist数据集... 问题是,CNN的第一层必须以[batch_size, 28, 28, 1]的形式接受图像,这意味着我必须在将每个图像馈送到CNN之前对其进行转换。 我用我的脚本执行以