Python 3.x 尝试使用tf.数据解析培训/测试摘要

Python 3.x 尝试使用tf.数据解析培训/测试摘要,python-3.x,tensorflow,tensorboard,Python 3.x,Tensorflow,Tensorboard,我希望在我的NN培训期间总结,类似于,但我看到的所有示例都使用feed_dict,而不是tf.data。我的培训和测试有单独的初始值设定项: self.train_init = iterator.make_initializer(train_data) # initializer for train_data self.test_init = iterator.make_initializer(test_data) # initializer for test_data 在训练期间,我使用

我希望在我的NN培训期间总结,类似于,但我看到的所有示例都使用feed_dict,而不是tf.data。我的培训和测试有单独的初始值设定项:

self.train_init = iterator.make_initializer(train_data) # initializer for train_data
self.test_init = iterator.make_initializer(test_data)   # initializer for test_data
在训练期间,我使用sess.run(self.train_init)初始化训练初始值设定项,但为了测试准确性,我需要初始化sess.run(self.test_init),我相信。目前我的代码如下所示:

for i in range(100):
    sess.run(self.train_init)
    total_loss = 0
    n_batches = 0
    try:
        while True:
              _, l = sess.run([self.optimizer, self.loss])
              total_loss += l
              n_batches += 1
    except tf.errors.OutOfRangeError:
        pass

        if i % (10/1) == 0:
           print('Avg. loss epoch {0}: {1}'.format(i, total_loss/n_batches))
           acc, summ = sess.run(self.accuracy, self.summary_op)
           writer.add_summary(summ, i)
目前,精度每10次迭代测量一次,但它使用的是训练批,而不是测试批。我希望能够随着时间的推移看到训练和测试的准确性,以便清楚地看到是否出现过拟合(训练精度好,但测试精度差)


当我使用tf.Data时,我不知道如何做到这一点。在进行100次迭代时,如何在初始值设定项之间切换,同时创建所需内容的摘要?

通常在培训过程之外对测试集进行评估,以优化性能。但如果你真的想在现场进行,对我来说最合适的解决方案之一是:

  • 创建两个tf.data和一个占位符以在它们之间切换
  • 使用tf.cond()控制流,如
  • 代码可能类似于:

    with tf.name_scope('train_pipeline'):
        train_ds = tf.data.Dataset.from_tensor_slices(...)
        ...
        train_ds = iterator.make_initializer(train_data)
        train_init = iterator.initialize
        X_iterator_train = iterator.get_next()
    with tf.name_scope('test_pipeline'):
        test_ds = tf.data.Dataset.from_tensor_slices(...)
        ...
        test_ds = iterator.make_initializer(test_data)
        test_init = iterator.initialize
        X_iterator_test = iterator.get_next()
    
    train_or_test = tf.placeholder(tf.string, name='switch_buton')
    def f1(): X_iterator_train
    def f2(): X_iterator_test
    inputs = tf.cond(tf.equal(train_or_test, 'train'), lambda :f1(), lambda: f2(), name='input_cond')
    
    # model
    ... # use your input(IteratorGetNext) at your first layer, something like tf.nn.conv2d(inputs, ...)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
    
        # init summary writers for two different path
        train_writer = tf.summary.FileWriter(...)
        test_writer = tf.summary.FileWriter(...)
    
        for ep in range(nb_epoch):
            sess.run([train_init, test_init])
            # begin training
            for step in range(nb_batch):
                # 90% train, 10% test
                if step % 9 == 0:
                    sess.run(train_op, feed_dict={train_or_test: 'test'})  # switch to test input pipeline
                    train_writer.add_summary()
                else:
                    sess.run(train_op, feed_dict={train_or_test: 'train'})  # switch to train input pipeline
                    test_writer.add_summary()
    

    谢谢你的回答。如果我可以要求跟进,我已经将其设置为在培训后测试测试准确性的批次(按照惯例)。但在每个时代,都无法同时看到训练和测试的准确性,也无法看到过度拟合。tensorflow网站使用类似的方法来使用feed_dict方法(),但是您和示例都没有使用tf.Data结构。那么,有没有办法做到这一点,或者说,按照惯例,这是因为对表现的惩罚而从未做到的呢?@JamieDimon在评论中指出。这个方法使用了
    tf.data.Dataset
    现在有更多的细节了,谢谢,这肯定回答了我的问题。