Я задался вопросом, возможно ли обучить 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)