Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在带有@tf.function的自定义训练循环中使用tf.summary时出现问题_Python_Tensorflow - Fatal编程技术网

Python 在带有@tf.function的自定义训练循环中使用tf.summary时出现问题

Python 在带有@tf.function的自定义训练循环中使用tf.summary时出现问题,python,tensorflow,Python,Tensorflow,我想在自定义训练循环中使用@tf.function和tf.summary,如下所示。问题是: 仅显示第一次记录的数据(见图) 其余的数据会被记录(因为文件大小会增加),但它们不可显示,否则会有一个滑块。我猜这和图张量有关。。。不确定 另外,如果我为interval设置了if条件,所有结果都将被归类到一个组名con_3中 正确的摘要应如下所示: 对每个项目进行分类 使用滑块在不同时间显示结果: 我试图将收集过程移到self.grad()之外,但它是由@tf.function修饰的,

我想在自定义训练循环中使用
@tf.function
tf.summary
,如下所示。问题是:

  • 仅显示第一次记录的数据(见图)
  • 其余的数据会被记录(因为文件大小会增加),但它们不可显示,否则会有一个滑块。我猜这和图张量有关。。。不确定
  • 另外,如果我为interval设置了if条件,所有结果都将被归类到一个组名con_3中


正确的摘要应如下所示:

  • 对每个项目进行分类
  • 使用滑块在不同时间显示结果:


我试图将收集过程移到
self.grad()
之外,但它是由
@tf.function
修饰的,并且不允许将
图形张量
传递到外部

我想做的只是每隔一段时间做一次日志记录,而不是记录每个批次的结果

dataset_iter = iter(dataset)
for epoch in range(self.num_epochs):
    self.epoch_cnt.assign(epoch)
    self.optimizer.lr = self.lr_fn(epoch) 
    print("learning rate - epoch %d: " % epoch, self.optimizer.get_config()['learning_rate'])

    for i in tqdm(range(self.data_loader.steps_per_epoch),
                  desc='Epoch%d/%d' % (epoch+1, self.num_epochs)):
        self.batch_idx.assign(i)
        batch = dataset_iter.get_next()
        trainable_weights_all = self.get_trainable_weights()
        input_imgs, input_Ks = self.batch_processor.prepare_batch(batch[..., :3], batch[..., 3:])
        
        grads = self.grad(input_imgs, input_Ks, trainable_weights_all) # use @tf.function here
        self.optimizer.apply_gradients(zip(grads, trainable_weights_all))
        self.global_step.assign_add(1)

@tf.function    # turn off to debug, e.g. with plt
def grad(self, input_imgs, input_Ks, trainables):
    with tf.GradientTape() as tape:
        outputs = self.process_batch(input_imgs, input_Ks)
        total_loss = self.compute_losses(input_imgs, outputs)
        grads = tape.gradient(total_loss, trainables)
    
        if self.global_step % self.summary_freq == 0:
            tf.print("loss: ", self.losses['loss/total'], output_stream=sys.stdout)

        # collect data
        early_phase = self.batch_idx % self.summary_freq == 0 and self.global_step < 2000
        late_phase = self.global_step % 2000 == 0
        if early_phase or late_phase:
            print("colleting data in step ", self.global_step, " batch index ", self.batch_idx)
            with self.train_sum_writer.as_default():
                self.collect_summary(outputs)
            self.train_sum_writer.flush()

return grads
dataset\u iter=iter(数据集)
对于范围内的历元(self.num_历元):
自我历元分配(历元)
self.optimizer.lr=self.lr\u fn(历元)
打印(“学习速率-历元%d:“%epoch,self.optimizer.get_config()['learning_rate']))
对于tqdm中的i(范围(自数据加载程序每历元步数),
desc='Epoch%d/%d'(Epoch+1,self.num_Epoch)):
自批分配(i)
batch=dataset\u iter.get\u next()
可训练重量=自身。获取可训练重量()
input\u imgs,input\u Ks=self.batch\u processor.prepare\u batch(批[…,:3],批[…,3:])
grads=self.grad(输入imgs、输入Ks、可训练权重all)#此处使用@tf.function
自我优化。应用梯度(zip(梯度、可训练权重)
self.global\u step.assign\u add(1)
@tf.功能#关闭以进行调试,例如使用plt
def梯度(自我、输入、输入、可培训人员):
使用tf.GradientTape()作为磁带:
输出=自处理批处理(输入、输入)
总损耗=自计算损耗(输入、输出)
梯度=磁带梯度(总损耗,可培训)
如果self.global\u步骤%self.summary\u freq==0:
tf.print(“损失:”,自身损失['loss/total'],输出流=sys.stdout)
#收集数据
早期阶段=self.batch\u idx%self.summary\u freq==0,self.global\u步骤<2000
后期\u阶段=自我。全局\u步骤%2000==0
如果是早期\u阶段或晚期\u阶段:
打印(“在步骤中收集数据”,self.global\u步骤,“批次索引”,self.batch\u idx)
使用self.train\u sum\u writer.as\u default():
自我收集汇总(输出)
self.train\u sum\u writer.flush()
返校生