TensorFlow edifício gráfico lento com redes ramificadas (por exemplo, ResNeXt)

votos
1

Eu estou tentando implementar um bloco ResNeXt (tipo B) do papel na TensorFlow:

ResNext

Para fazê-lo, eu usei um loop para gerar cada caminho dependendo do parâmetro cardinalidade ( cardinality = 32na imagem acima)

def resnext_block(input_tensor, filters, stride=1, projection=False, cardinality=32, depth=4):
    residual = input_tensor

    # Split
    branches = []
    for i in range(cardinality):
        with tf.variable_scope(branch%i % i):
            branch = tf.layers.conv2d(inputs=input_tensor, filters=depth, kernel_size=1, padding='same')
            branch = tf.layers.batch_normalization(branch, training=train_flag)
            branch = activation(branch)
            branch = tf.layers.conv2d(inputs=branch, filters=depth, kernel_size=3, strides=stride, padding='same')
            branch = tf.layers.batch_normalization(branch, training=train_flag)
            branch = activation(branch)
            branches.append(branch)

    # Merge
    merged = tf.concat(branches, -1)
    # Transform
    transformed = tf.layers.conv2d(inputs=merged, filters=filters, kernel_size=1, padding='same')
    transformed = tf.layers.batch_normalization(transformed, training=train_flag)

    if projection:
        residual = tf.layers.conv2d(inputs=input_tensor, filters=filters, kernel_size=1, strides=stride)
        residual = tf.layers.batch_normalization(residual, training=train_flag)

    return activation(transformed + residual)

Se eu executar o meu modelo para valores baixos de cardinalidade (<4), o gráfico constrói rapidamente e formação começa em curso.

Para valores elevados de cardinalidade, TensorFlow gasta muito tempo construir o gráfico (ou seja, com um núcleo de CPU a 100% e nenhuma outra actividade). O arquivo de eventos cresce muito grande (> 1 GB) presumivelmente porque há tantos nós no gráfico (apesar do fato do número de parâmetros treináveis pode ser mantido a um número semelhante ao reduzir depth).

Há algum truques que eu estou faltando para acelerar / otimizar esse processo?

Não estou vendo muito muitos exemplos ResNeXt em TensorFlow (os que eu já encontrados têm cardinalidade definida para pequenos números), o que me faz pensar que talvez a arquitetura gráfico da TF não é adequado para estes tipos de modelos.

Atualizar

Parece que circunvoluções agrupados são a melhor maneira de conseguir isso (estilo C bloco no papel). No entanto, estes ainda não estão implementadas no TF 1.10. Veja esta questão GitHub

Publicado 20/09/2018 em 04:21
fonte usuário
Em outras línguas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more