Tensorflow kezdő itt.
Van egy kódrészletem, amely képzést és érvényesítést végez (együtt) egy képkészleten. A betanítási ciklusban időnként végrehajtok egy érvényesítést, és megkapom a veszteséget egy érvényesítési adatkészletből. Összefoglalom az eredményeket, és tensorboardot használok a vizualizáció megtekintéséhez.
A problémám az, hogy kétszer számolom a veszteségemet, és nem kellene. A kódom egyértelművé teszi, hogy mi történik
Szerezzen be néhány képet, amely már fel van osztva képzési és érvényesítési készletekre, és építse fel a neurális hálót is:
images, labels = (
self._input_pipeline(filenames, self.model_config.BATCH_SIZE))
v_images, v_labels = (
self._input_pipeline(v_filenames, self.model_config.BATCH_SIZE))
logits = self.build_nets(images)
tf.get_variable_scope().reuse_variables()
v_logits = self.build_nets(v_images)
Állítsa be a veszteségfüggvényt:
_ = self.set_loss(logits, labels)
validation_step = self.set_loss(v_logits, v_labels)
A set_loss így néz ki:
def set_loss(self, y, y_):
cross_entropy_sum = (
tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=y, labels=y_)))
tf.add_to_collection('cross_entropy_loss', cross_entropy_sum)
return tf.losses.get_losses()
A probléma az, hogy a cross_entropy_loss kétszer hozzáadódik a gyűjteményhez, így a keresztentropia veszteség kétszeresét kapom.
A 'cross_entropy_loss' gyűjteményt a fő rutinban használják a cross_entropy_total kiszámításához:
get_cross_entropy = tf.get_collection('cross_entropy_loss')
cross_entropy_total = tf.add_n(get_cross_entropy, name='cross_entropy_loss_across_all_gpus')
tf.summary.scalar("cross entropy loss", cross_entropy_total)
Egyetlen összefoglaló művelet generálja az összefoglalót:
summary_op = tf.summary.merge_all()
A képzés lépése így néz ki:
train_step = (
tf.train.GradientDescentOptimizer(model_config.INITIAL_LEARNING_RATE).minimize(cross_entropy_total))
Íme az utolsó darab, a képzési és az érvényesítési darabok futtatása, valamint az összefoglaló kiírása
_, cross_entropy = sess.run([train_step, cross_entropy_total])
if step % self.model_config.SUMMARY_EVERY == 0:
summary_str = sess.run(summary_op)
summary_writer.add_summary(summary_str, step)
#validation
_, cross_entropy = sess.run([validation_step, cross_entropy_total])
v_summary_str = sess.run(summary_op)
v_summary_writer.add_summary(v_summary_str, step)
Szóval tudna valaki segíteni, hogyan kerülhetem el, hogy a cross_entropy_total kétszer számoljon? Például ha a veszteség az ellenőrzés elvégzése nélkül 100, ha bedugom a fent látható érvényesítési darabokat, akkor 200 lesz