Тензорный поток с использованием 2D CNN для видеоданных - проблема обучения? - PullRequest
0 голосов
/ 04 марта 2019

Я задался вопросом, возможно ли обучить 2D CNN на видеоданных, сопоставив сети на соответствующих кадрах, например:

def mobile_netv1(inputs, layer):
    with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope()):
    layer_endpoints = tf.map_fn(lambda x: mobilenet_v1.mobilenet_v1
                    (x, num_classes=1001, is_training=True, reuse=tf.AUTO_REUSE)[1][layer], inputs)
return layer_endpoints

, где вход будет [пакет, кадры, высота, ширина, каналы] и конечные точки будут использоваться в полностью связанном слое, создавая логиты.

Хотя этот небольшой пример не имеет смысла для классификации, я хотел бы знать, возникнут ли проблемы в процессе обучения, например, среднее значение весов не будет правильно рассчитано (только для подмножествапримеры) в оптимизаторе Адама.

Или было бы лучше объединить первые два измерения [пакетные * кадры] и преобразовать их впоследствии в [пакетные, кадры] снова?

edit: forминимальный рабочий пример:

def mobile_netv1(inputs, layer):
  with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope()):
    layer_endpoints = tf.map_fn(lambda x: mobilenet_v1.mobilenet_v1
                (x, num_classes=1001, is_training=True, reuse=tf.AUTO_REUSE)[1][layer], inputs)
  return layer_endpoints


def model_fn(features, labels, mode):
  output = mobile_netv1(features, 'Conv2d_12_depthwise')
  mul_dims = 1
  for i in output.get_shape().as_list()[1:]:
    mul_dims *= i
  flat_output = tf.reshape(output, (-1, mul_dims))
  logits = tf.layers.dense(flat_output, 10)
  one_hot_labels = tf.one_hot(labels, depth=10)
  with tf.variable_scope('loss'):
    loss = tf.nn.softmax_cross_entropy_with_logits_v2(labels=one_hot_labels, logits=logits)
    optimizer = tf.train.AdamOptimizer()
    m_loss = tf.reduce_mean(loss)
    train_op = optimizer.minimize(m_loss, tf.train.get_global_step())
  return tf.estimator.EstimatorSpec(mode, loss=m_loss, train_op=train_op)


def input_fn():
  dataset1 = tf.data.Dataset.from_tensor_slices({"features": tf.ones([10, 10, 128, 128, 3]),
                                                "labels": tf.ones([10, 1], dtype=tf.int64)})
  dataset1 = dataset1.repeat()
  dataset1 = dataset1.batch(batch_size)
  iterator = dataset1.make_one_shot_iterator()
  next_element = iterator.get_next()
  return next_element['features'], next_element['labels']

if __name__ == '__main__':
  classifier = tf.estimator.Estimator(model_fn, model_dir='./run')
  classifier.train(input_fn, steps=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...