gpt4 book ai didi

python - 在 feed_dict 和队列之间轻松切换以输入 TensorFlow 模型

转载 作者:行者123 更新时间:2023-12-01 02:47:26 24 4
gpt4 key购买 nike

现在我有一个模型配置为使用 feed_dict 获取输入。代码看起来像这样:

# model.py
class MyModel(object):
def __init__(self, hyperparams):
self.build_model(hyperparams)

def build_model(self, hps):
self.input_data = tf.placeholder(dtype=tf.float32, shape=[hps.batch_size, hps.nfeats])
self.labels = tf.placeholder(dtype=tf.float32, shape=[hps.batch_size])
# Define hidden layers, loss, training step, etc.

# train.py
model = MyModel(hps)
for _ in range(100):
x, y = some_python_function() # Read a batch from disk, preprocess
sess.run(model.train_step, feed_dict={model.input_data: x, model.labels: y})

出于性能原因,我想改用队列进行训练。但我想保持使用 feed_dict 的能力,例如用于推理或测试。

有没有一种优雅的方式来做到这一点?我想做的是,在使用队列时,“交换”队列出队操作返回的张量的占位符变量。我认为 tf.assign 是执行此操作的方法,即:

single_x, single_y = tf.parse_single_example(...)
x, y = tf.train.batch([single_x, single_y], batch_size)
model = MyModel(hps)
sess.run([tf.assign(model.input_data, x), tf.assign(model.labels, y)])
for _ in range(100):
sess.run(model.train_step)

但这会引发AttributeError:“Tensor”对象没有属性“assign”tf.assign 的 API 文档将第一个参数描述为:“可变的张量。应该来自变量节点。可能未初始化。”这是否意味着我的占位符不可变?我可以让他们这样吗?或者我以错误的方式处理这个问题?

最小可运行示例 here .

最佳答案

您可以通过以下方式将变量操作 的创建分开:

  • 添加在 Model 类实例化时调用的 build_variables 方法,
  • 更改 build_model 方法的接口(interface),以便它接受您的 xy 张量作为参数,从而构建模型基于它们的操作

这样您就可以重用模型的变量和常量。缺点是 placeholder 版本和任何其他版本的操作都会重复。

import tensorflow as tf
import numpy as np

BATCH_SIZE = 2

class Model(object):

def __init__(self):
self.build_variables()

def build_variables(self):
self.w = tf.Variable(tf.random_normal([3, 1]))

def build_model(self, x, y):
self.x = x
self.y = y
self.output = tf.matmul(self.x, self.w)
self.loss = tf.losses.absolute_difference(self.y, self.output)


model = Model()
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())

def placeholder_run():
x = tf.placeholder(dtype=tf.float32, shape=[BATCH_SIZE, 3])
y = tf.placeholder(dtype=tf.float32, shape=[BATCH_SIZE, 1])
model.build_model(x, y)

for i in range(3):
x = np.random.rand(BATCH_SIZE, 3)
y = x.sum(axis=1, keepdims=True)
loss = sess.run(model.loss, feed_dict={model.x:x, model.y:y})
print(loss)

def nonph_run():
x = tf.random_normal([BATCH_SIZE, 3])
y = tf.reduce_sum(x, axis=1, keep_dims=True)
model.build_model(x, y)
for i in range(3):
loss = sess.run(model.loss)
print(loss)

if __name__ == '__main__':
# Works
placeholder_run()
# Doesn't fail
nonph_run()

关于python - 在 feed_dict 和队列之间轻松切换以输入 TensorFlow 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45134654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com