Я преобразовал код из системы, основанной на очереди, в набор данных tenorflow. После преобразования я вижу потерю точности и время увеличилось. Я приписываю это неправильной реализации на моем конце, и в настоящее время я пытаюсь устранить проблему, которая может быть проблемой. Теперь методом проб и ошибок в этом преобразовании я сделал несколько предположений, основанных на ряде статей и примеров, с которыми столкнулся, и я просто хотел убедиться, что моя текущая реализация верна и что мои предположения были также.
Ранее у меня было огромное количество изображений, и я собирал их в очередь, затем извлекал из очереди мои 100 изображений, выполнял обработку и суммирование, а затем продолжал. Эта загрузка в память через очередь, по моему мнению, могла стать причиной узкого места, поэтому, когда я услышал об API набора данных, я подумал, что это стоит посмотреть. Итак, теперь я извлекаю всю информацию об изображении и передаю ее своему методу, где затем выполняю пакетную обработку с помощью пакетного метода набора данных. До и после показаны ниже. Я читал, что нет необходимости вызывать iter.get_next для набора данных, поскольку ops будет вызывать его автоматически, однако с точностью, которую я вижу в конце, я сомневаюсь, правда это или нет. В настоящее время, как вы можете видеть, я просто передаю iter.initializer в качестве операции sess.run с другими своими операциями и передаю feed_dict. Любое понимание было бы полезно, поскольку я несколько новичок в этом. Спасибо!
Предыдущая функция выборки при использовании очереди:
(Имейте в виду, я бы поставил изображения в очередь в объект blob и передал бы это подмножество этому методу)
def get_summary(self, sess, images, labels, weights, keep_prob = 1.0):
feed_dict = {self._input_images: images, self._input_labels: labels,
self._input_weights: weights, self._is_training: False}
summary, acc = sess.run([self._summary_op, self._accuracy], feed_dict=feed_dict)
return summary, acc
Текущая функция выборки с использованием API набора данных:
(Теперь перед вызовом этого я заполняю свой объект BLOB-объекта всеми данными и использую приведенные ниже функции пакетной обработки - обратите внимание, что я никогда не выполняю вызов iter.get_next ())
def get_summary(self, sess, images, labels, weights, keep_prob = 1.0, batch_size=32):
dataset = tf.data.Dataset.from_tensor_slices((self._input_images, self._input_labels,
self._input_weights)).repeat().batch(batch_size)
iter = dataset.make_initializable_iterator()
feed_dict = {self._input_images: images, self._input_labels: labels,
self._input_weights: weights, self._is_training: False}
_, summary, acc = sess.run([iter.initializer, self._summary_op, self._accuracy], feed_dict=feed_dict)
return summary, acc