на Городские пейзажи и получить сопоставимые показатели.

ел бы знать возможные способы реализации слоев нормализации партии с синхронизацией статистики партии при обучении с несколькими графическими процессорами.

Caffe Может быть, есть несколько вариантов кофе, которые могли бы сделать, какссылка на сайт, Но для уровня BN я понимаю, что он по-прежнему синхронизирует только выходные данные уровней, а не средства и переменные. Может быть, MPI может синхронизировать средства и переменные, но я думаю, что MPI немного сложно реализовать.

факел Я видел некоторые комментарииВот а такжеВот, которые показывают, что running_mean и running_var могут быть синхронизированы, но я думаю, что пакетное среднее и пакетная переменная не могут или их трудно синхронизировать.

Tensorflow Обычно это то же самое, что и кофе с факелом. Реализация БН относитсяэтот, Я знаю, что tennsflow может распределить операцию на любое устройство, указанноеtf.device(), Но вычисление средних и переменных находится в середине уровня BN, поэтому, если я соберу средние и переменные в процессоре, мой код будет выглядеть следующим образом:

cpu_gather = []
label_batches = []
for i in range(num_gpu):
    with tf.device('/gpu:%d' % i):
        with tf.variable_scope('block1', reuse=i > 0):
            image_batch, label_batch = cifar_input.build_input('cifar10', train_data_path, batch_size, 'train')
            label_batches.append(label_batch)

            x = _conv('weights', image_batch, 3, 3, 16, _stride_arr(1))
            block1_gather.append(x)

with tf.device('/cpu:0'):
    print block1_gather[0].get_shape()
    x1 = tf.concat(block1_gather, 0)
    # print x1.get_shape()
    mean, variance = tf.nn.moments(x1, [0, 1, 2], name='moments')

for i in range(num_gpu):
    with tf.device('/gpu:%d' % i):
        with tf.variable_scope('block2', reuse=i > 0):
            shape = cpu_gather[i].get_shape().as_list()
            assert len(shape) in [2, 4]
            n_out = shape[-1]
            beta, gamma, moving_mean, moving_var = get_bn_variables(n_out, True, True)

            x = tf.nn.batch_normalization(
                cpu_gather[i], mean, variance, beta, gamma, 0.00001)

            x = _relu(x)

Это только для одного слоя BN. Для сбора статистики в процессоре мне нужно взломать код. Если у меня будет более 100 слоев BN, это будет громоздко.

Я не являюсь экспертом в этих библиотеках, так что, возможно, есть какое-то недопонимание, не стесняйтесь указывать на мои ошибки.

Меня не волнует скорость тренировок. Я делаю сегментацию изображения, которая потребляет много памяти GPU, а BN нужен разумный размер пакета (например, больше 16) для стабильной статистики. Таким образом, использование нескольких графических процессоров неизбежно. На мой взгляд, тензорный поток может быть лучшим выбором, но я не могу решить проблему взлома кода. Решение с другими библиотеками тоже будет приветствоваться.

Ответы на вопрос(2)

Ваш ответ на вопрос