У меня есть некоторый код, который был написан с помощью 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))
Это правильный способ сделать это или неправильно поняли концепции оценки?На данный момент приложение вылетает при вызове функции поезда.Так что, наверное, я что-то не так понял.