【问题标题】:Tensorflow Estimators : proper way to train image grids separatelyTensorflow Estimators:分别训练图像网格的正确方法
【发布时间】:2019-01-09 16:08:39
【问题描述】:

我正在尝试按照paper 中的描述训练对象检测模型

有 3 个全连接层,有 512、512、25 个神经元。来自最后一个卷积层的 16x55x55 特征图被馈送到全连接层以检索适当的类。在这个阶段,由 (16x1x1) 描述的每个网格都被馈送到全连接层,以将网格分类为属于 25 个类之一。结构见下图

fully connected layers

我正在尝试调整 TF MNIST 分类教程中的代码,我想知道是否可以像下面的代码 sn-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 个新层。但是,我希望在对一个网格和另一个网格进行分类时保留权重。

【问题讨论】:

    标签: tensorflow deep-learning object-detection tensorflow-estimator


    【解决方案1】:

    添加到 total_loss 应该没问题。

    tf.losses.sparse_softmax_cross_entropy 也将损失加在一起。

    它使用 logits 计算 sparse_softmax,然后使用 math_ops.reduce_sum 通过求和来减少结果数组。 因此,您以一种或另一种方式将它们加在一起。

    As you can see in its source

    网络声明中的 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
    

    【讨论】:

    • 我明白了,谢谢。在 for 循环中声明dense1 dense2 层呢?似乎对于每个网格,我都在生成一个全新的图层,然后让网格通过它。我想确保每个网格都通过相同的密集层,并且根据总损失进行训练。
    • 你是对的。看起来确实很奇怪。在伪代码中添加了更多细节,如果您正在寻找,请告诉我。
    • 感谢您与我们联系。我认为如果我只使用图像网格,您提供的伪代码将起作用。然而,在我的模型中,图像 500x500 在被处理为网格之前会经过几个卷积层和池化层。我正在寻找一种将所有层集成到一个模型函数中的方法,我可以将其传递给 Estimator 进行训练。至于代码,我指的是TF CNN教程tensorflow.org/tutorials/estimators/cnn
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 2017-12-16
    • 2018-04-12
    • 1970-01-01
    • 2017-04-06
    • 2020-10-05
    • 2017-10-07
    • 2019-11-16
    相关资源
    最近更新 更多