Как реализовать TensorBoard v2 (tf.contrib.summary) с while_loop? - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу записать значение потерь и точности, оцененное внутри вложенной функции тела while_loop во время тренировки.Это структура: у меня есть класс, метод этого класса строит график с помощью while_loop (build_graph ()).Другой метод вызывает build_graph () и затем запускает сеанс.Оно работает.Или это похоже на работу.Однако я хотел бы использовать TensorBoard, чтобы проверить, действительно ли потери и точность улучшаются, но я не могу суммировать эти тензоры.Я попытался определить tf.contrib.summary.create_file_writer ('summary') и график и передать их в build_graph () в качестве параметров, чтобы функция body могла их видеть.Я проверил список во время выполнения графика из tf.contrib.summary.all_summary_ops (), и он не пустой.Однако, когда я открываю TensorBoard, я получаю «Нет активных панелей для текущего набора данных».Ни один график.Я знаю, что tf.summary не работает в while_loop, но кажется, что tf.contrib.summary работает.

Вот рабочий пример

import tensorflow as tf
import sys
import datamanagement

class myNet:
    def __init__(self):
        self.varlist = ["x", "y"]
        self.data = []
        self.hsize = [10, 10]
        self.batch_size = 10
        self.tr_mainsteps = 1000
        self.learnrate = 0.001
        self.sourcedatafile = "XYfit.csv"  # source file

        # Dataset parameters
        self.seq_params = {'dim': len(self.varlist),
                           'batch_size': self.batch_size,
                           'shuffle': True,
                           'filepath': self.sourcedatafile}

        # Dataset from CSV file
        self.dataset = datamanagement.CSVDataSet(**self.seq_params).finaldataset

        # Iterator on the CSV file
        self.dataiterator = self.dataset.make_initializable_iterator()

        # Optimizer
        self.optim = tf.train.RMSPropOptimizer(learning_rate=self.learnrate)

        # Official creation of the graph
        self.graph = tf.get_default_graph()
        with self.graph.as_default():
            # Writer creation
            self.writer = tf.contrib.summary.create_file_writer('./summary')
            with self.writer.as_default():
                tf.contrib.summary.always_record_summaries()

    def mymodel(self, Zinp, reuse=False):
        # This function builds the graph of the network
        with tf.variable_scope("mymod/net", reuse=reuse):
            h1 = tf.layers.dense(Zinp, self.hsize[0], activation=tf.nn.leaky_relu, name='h1')
            h2 = tf.layers.dense(h1, self.hsize[1], activation=tf.nn.leaky_relu, name='h2')
            out = tf.layers.dense(h2, len(self.varlist), activation=None, name='final')       # None means linear activation

        return out

    def _trainepoch(self, ind):
        with self.writer.as_default():
            # Real data tensor from CSV file
            self.realdata = self.dataiterator.get_next()

            # random input vector
            self.Znoise = tf.random_uniform([self.batch_size, len(self.varlist)], minval=-1., maxval=1.)

            # Model and output tensor
            self.output = self.mymodel(self.Znoise, reuse=tf.AUTO_REUSE)

            # Loss
            self.loss = tf.losses.mean_squared_error(self.realdata, self.output)

            tf.contrib.summary.scalar("loss", self.loss)

            #Trainable variables
            t_vars = tf.trainable_variables()

            # Evaluation of the weight gradients
            grad = self.optim.compute_gradients(self.loss, var_list=t_vars)

            # Update weights based on gradients
            return self.optim.apply_gradients(grad), tf.contrib.summary.all_summary_ops()

    def _train_buildgraph(self):
        def body(ind, ops):
            train_up, ops = self._trainepoch(ind)

            # Ensure that the update is applied before continuing.
            with tf.control_dependencies([train_up]):
                ind = ind + 1
                return ind, ops

        def cond(ind, ops):
            return ind < self.tr_mainsteps

        return tf.while_loop(cond, body, [tf.constant(0), [tf.Variable(False)]])

    def config_run(self, trepoch=50, testNet=False):
        self.tr_mainsteps = trepoch  # Number of adversarial training epoch

        with self.graph.as_default():
            with self.writer.as_default():
                tr_loop, summary_ops = self._train_buildgraph()

        # Graph execution
        with self.graph.as_default():
            with self.writer.as_default():
                with tf.Session() as sess:
                    sess.run(tf.initializers.global_variables())
                    sess.run(self.dataiterator.initializer)

                    tf.contrib.summary.initialize(
                        graph=tf.get_default_graph()
                    )

                    sess.run([summary_ops, tr_loop, summary_ops])

def main(argv):
    hmodel = myNet()
    hmodel.config_run()


if __name__ == "__main__":
    main(sys.argv[1:])

Может ли кто-нибудь мне помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...