Создание пользовательского слоя и его свертка - PullRequest
0 голосов
/ 21 февраля 2019

Рассмотрим код:

from tensorflow.contrib import layers

#input_features is given, and is 1x20x20x1000 for instance.
N_outputs = 200
N_intermediate = 50

out_lst = []
for i in xrange(N_outputs):
    net = layers.conv2d(
        input_features,
        N_intermediate, [1, 1]
    )
    out = layers.conv2d(
        net,
        1, [1, 1],
        activation_fn=None,
        normalizer_fn=None
    )

    out_lst.append(out)

logits = tf.concat(out_lst,axis = 3)

В целом, сеть должна принимать входные данные размером 1x20x20x1000 и возвращать выходные данные размером 1x20x20x200, где каждый из 200 выходных логитов проходит через свой собственный единственный размерный слойN_intermediate.

Проблема заключается в том, что построение графика происходит довольно медленно, а затем требует слишком много памяти, что приводит к ошибке памяти.Для сравнения, следующий код

#input_features is given, and is 1x20x20x1000. 
N_outputs = 200
N_intermediate = 50

net = layers.conv2d(
        input_features,
        N_intermediate*N_outputs, [1, 1]
    )
net = layers.conv2d(
        net,
        N_outputs, [1, 1],
        activation_fn=None,
        normalizer_fn=None
)

logits = net

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

Каков наилучший способ создать сеть, эквивалентную сети первой версии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...