我正在尝试按照paper
所述训练对象检测模型共有3个完全连接的层,分别具有512、512、25个神经元。来自最后一个卷积层的16x55x55特征图被馈送到完全连接的层中以检索适当的类。在此阶段,将(16x1x1)描述的每个网格馈入完全连接的层中,以将网格分类为属于25个类之一。在下面的图片中可以看到该结构
我正在尝试改编TF MNIST分类教程中的代码,我想知道是否可以像下面的代码片段所示那样将每个网格的损失相加并用它来训练模型权重。 / p>
flat_fmap = tf.reshape(last_conv_layer, [-1, 16*55*55])
total_loss = 0
for grid of flat_fmap:
dense1 = tf.layers.dense(inputs=grid, units=512, activation=tf.nn.relu)
dense2 = tf.layers.dense(inputs=dense1, units=512, activation=tf.nn.relu)
logits = tf.layers.dense(inputs=dense2, units=25)
total_loss += tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
loss=total_loss,
global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec(mode=tf.estimator.ModeKeys.TRAIN, loss=total_loss, train_op=train_op)
在上面的代码中,我认为每次迭代都会创建3个新层。但是,我希望在对一个网格然后对另一个网格进行分类时保留权重。
答案 0 :(得分:0)
添加到total_loss应该没问题。
tf.losses.sparse_softmax_cross_entropy也将损失加在一起。
它使用logits计算sparse_softmax,然后使用math_ops.reduce_sum通过求和来减少所得数组。 因此,您正在以一种或另一种方式将它们添加在一起。
网络声明中的for循环似乎很不寻常,在运行时执行此操作并将每个网格传递给feed_dict可能更有意义。
dense1 = tf.layers.dense(inputs=X, units=512, activation=tf.nn.relu)
dense2 = tf.layers.dense(inputs=dense1, units=512, activation=tf.nn.relu)
logits = tf.layers.dense(inputs=dense2, units=25)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(loss)
total_loss = 0
with tf.session as sess:
sess.run(init)
for grid in flat_fmap:
_, l = sess.run([optimizer,loss], feed_dict{X: grid, labels=labels})
total_loss += l