python - 自定义估计器的张量不在同一图中
问题描述
我是 tensorflow 的新手,并尝试使用自定义估计器运行 ConvLSTM。
我这样定义了model_fn:
def model_fn(features,labels,mode,params = None):
if params==None:
batch_size = 50
time_steps = 150
dim =40
else:
batch_size = params['batch_size']
time_steps = params['time_steps']
dim = params['dim']
#instantiate cell
net = tf.contrib.rnn.ConvLSTMCell(conv_ndims = 2,input_shape = [dim,dim,1],output_channels = 1,kernel_shape = [3,3])
state = net.zero_state(batch_size,dtype = tf.float32)
features = tf.cast(features,tf.float32)
if mode != tf.estimator.ModeKeys.PREDICT: # Added in order to solve tf.cast problem if there is no labels
labels = tf.cast(labels,tf.float32)
state = net.zero_state(batch_size,dtype = tf.float32) # <-- inconsistent state size between training and predict, is it problematic ?
else:
state = net.zero_state(1,dtype = tf.float32)
inputs = tf.split(features,time_steps,axis = 1)
inputs_list = [tf.squeeze(input_,[1]) for input_ in inputs]
outputs = []
with tf.variable_scope("convLSTM") as scope:
for i, input_ in enumerate(inputs_list):
if i>0:
scope.reuse_variables()
t_output ,state = net(input_,state)
outputs.append(t_output)
outputs = tf.stack(outputs,1)
rmse = tf.Variable(tf.zeros([],dtype = np.float32))
if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(mode,predictions=outputs)
elif mode == tf.estimator.ModeKeys.TRAIN:
loss = tf.losses.absolute_difference(labels,outputs)
optimizer= tf.train.AdagradOptimizer (learning_rate = 0.1)
train_op = optimizer.minimize(loss,global_step = tf.train.get_global_step())
rmse = tf.metrics.root_mean_squared_error(labels,outputs)[0]
tf.summary.scalar('RMSE loss',rmse)
return tf.estimator.EstimatorSpec(mode,loss=loss,train_op = train_op)
elif mode == tf.estimator.ModeKeys.EVAL:
loss = tf.losses.absolute_difference(labels,outputs)
rmse = tf.metrics.root_mean_squared_error(labels,outputs)[0]
tf.summary.scalar('RMSE loss',rmse)
return tf.estimator.EstimatorSpec(mode,loss=loss,eval_metric_ops = {'RMSE':rmse})
输入功能:
def input_fn_train(batch_size):
dataset = tf.data.TFRecordDataset(['Data/train.tfrecords'])
dataset = dataset.map(parse_)
dataset = dataset.shuffle(buffer_size = 5)
dataset = dataset.batch(batch_size)
return dataset.prefetch(buffer_size = 5)
def input_fn_eval(batch_size):
dataset = tf.data.TFRecordDataset(['Data/eval.tfrecords'])
dataset = dataset.map(parse_)
dataset = dataset.shuffle(buffer_size = 5)
dataset = dataset.batch(batch_size)
return dataset.make_one_shot_iterator().get_next()
哪种方式更好,迭代器或数据集输出?
对于主要的:
def main():
batch_size = 5
data_pred = misc.input_fn_eval(1)
rnn = tf.estimator.Estimator(
model_fn = model.model_fn,
model_dir = "logs/20_08/",
params = {'batch_size':batch_size,'time_steps':150,'dim':40})
rnn.train(input_fn =lambda : misc.input_fn_train(batch_size),steps = 1)
video = rnn.predict(input_fn = lambda:data_pred)
print(next(video))
if __name__ == "__main__":
main()
现在,代码似乎很好,至少在语法上,可用于训练。我想预测几帧,以检查演变,但我不断收到错误:
ValueError: Tensor("ConvLSTMCellZeroState_1/zeros_1:0", shape=(1, 40, 40, 1), dtype=float32) must be from the same graph as Tensor("Squeeze:0", shape=(?, 40, 40, 1), dtype=float32).
对于迭代器和数据集,我也有这个(我相信预测输入函数,它曾经与训练的函数相同。创建一个不同的函数似乎已经解决了它。)。
非常感谢您的帮助 !我希望问题足够清楚,如果不是,请告诉我。
解决方案
推荐阅读
- python - 如何使用键盘模块检测任何按键?
- github - Github 包注册表是 Docker 注册表的替代品吗?
- c# - 从 byte[] 返回 FileResult
- xml - 使用 Xquery 返回属性值
- ios - [iOS Swift4]如何支持 ViewControllers(模态和推送)
- android - Rest API 进入 onFailure() 方法问题 - retrofit2
- scala - 在条件成立时在 Scala 中链接多个函数
- python - *** 在 Python -3 中是什么意思?
- django - 使用请求的结果直接生成表单
- python-3.x - 如何比较两个不同列表的每个元素?