переписать feed_dict tf.session и tf.graph в оценщик - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть некоторый код, который был написан с помощью feed_dict для API низкого уровня tf.Session и tf.Graph, и, поскольку я хочу использовать его на TPU, я пытаюсь переписать его в API tf.Estimator

Ниже приведена текущая версия кода.(некоторые фрагменты для краткости удалены и помечены как ...)

class my_tpu_class(object):

def __init__(self, ):
    // ...code to initialize class members
    self.g = tf.Graph()
    self._buildGraph()
    self.session = tf.Session(graph = self.g)

def _buildGraph(self):
    with self.g.as_default():
        XPH = tf.placeholder(tf.float32, [None, self.inputShape[0], self.inputShape[1], self.inputShape[2]], name='XPH')
        self.XPH = XPH
        YPH = tf.placeholder(tf.float32, [None, self.outputShape1[0] + self.outputShape2[0] + self.outputShape3[0] + self.outputShape4[0]], name='YPH')
        self.YPH = YPH

        conv1 = tf.layers.conv2d(inputs=XPH,
                                 filters=self.numFeature1,
                                 activation=selu.selu,
                                 name='conv1')
        self.conv1 = conv1

       // ...rest of code to build the network and get the loss.

        loss1 = tf.reduce_sum(tf.pow(YBaseChangeSigmoid - tf.slice(YPH,[0,0],[-1,self.outputShape1[0]], name='YBaseChangeGetTruth'), 2, name='YBaseChangeMSE'), name='YBaseChangeReduceSum')

        loss = loss1 + other losses...
        self.loss = loss

        tf.summary.scalar("loss", loss)
        self.merged_summary_op = tf.summary.merge_all()

        self.training_op = tf.train.AdamOptimizer(learning_rate=learningRatePH).minimize(loss)
        self.init_op = tf.global_variables_initializer()

def init(self):
    self.session.run( self.init_op )

def close(self):
    self.session.close()

def train(self, batchX, batchY):
    loss, _, summary = self.session.run( (self.loss, self.training_op, self.merged_summary_op),
                                          feed_dict={self.XPH:batchX, self.YPH:batchY, self.learningRatePH:self.learningRateVal,
                                          self.phasePH:True, self.dropoutRatePH:self.dropoutRateVal})
    return loss, summary

Я прочитал большую часть документации по оценщику и тензорному потоку и смог найти следующую версию, используя интерфейс оценщика.

class my_tpu_class(object):

def __init__(self, ):
    //...code to initialize class members

def my_model_fn(self, XPH, YPH, mode, params): 
        conv1 = tf.layers.conv2d(inputs=XPH,
                                 filters=self.numFeature1,
                                 activation=selu.selu,
                                 name='conv1')
        self.conv1 = conv1

        // rest of code to build the network and get the loss....

        loss1 = tf.reduce_sum(tf.pow(YBaseChangeSigmoid - tf.slice(YPH,[0,0],[-1,self.outputShape1[0]], name='YBaseChangeGetTruth'), 2, name='YBaseChangeMSE'), name='YBaseChangeReduceSum')

        loss = loss1 + other losses....
        self.loss = loss

        tf.summary.scalar("loss", loss)
        self.merged_summary_op = tf.summary.merge_all()

        self.training_op = tf.train.AdamOptimizer(learning_rate=params['learningRatePH']).minimize(loss)
        return tf.estimator.EstimatorSpec(mode=mode, loss=self.loss, train_op=self.training_op, eval_metric_ops=self.merged_summary_op)

def init(self):
    print ("No op")

def close(self):
    self.session.close()

def train_input_fn(self, features, labels):
    dataset = tf.data.Dataset.from_tensor_slices((features, labels))
    return dataset.make_one_shot_iterator().get_next()

def train(self, batchX, batchY):
    my_tpu_estimator = tf.estimator.Estimator( model_fn=self.my_model_fn, 
                                               params= {'learningRatePH':self.learningRateVal, 'phasePH':True, 'dropoutRatePH':self.dropoutRateVal })
    my_tpu_estimator.train(input_fn=self.train_input_fn(batchX, batchY))

Это правильный способ сделать это или неправильно поняли концепции оценки?На данный момент приложение вылетает при вызове функции поезда.Так что, наверное, я что-то не так понял.

1 Ответ

0 голосов
/ 18 сентября 2018

Код, который вы написали, не является кодом TPU. Он просто использует Estimator API, который является API высокого уровня. По моему мнению, он должен работать на CPU или GPU, но не на TPU. Для TPU вы должны использовать API TPUEstimator.

Чтобы выяснить точную причину сбоя, я хочу знать, что если вы используете это на TPU или CPU. Также не могли бы вы скопировать и вставить ошибку консоли, возникающую во время сбоя.

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