TensorFlow: реализация сетей, где все, если карта объектов одного слоя не связана со всеми картами объектов следующего слоя - PullRequest
0 голосов
/ 16 мая 2018

Я сейчас пытаюсь реализовать LeNet-5 в тензорном потоке, как описано в http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf.

У меня возникли небольшие проблемы с определением C3 (последний абзац страницы 7, первый абзац страницы 8), поскольку я не знаю, как конкретно указать сети, какие карты функций из S2 подключены, а какие из C3 (т.е. я знаю только как подключить все карты функций).

Мой код:

def LeNet(x):
    # Hyperparameters for initliazitation of weights
    mu = 0
    sigma = 0.1

    #This is the first convolutional layer C1
    #Initialize weights for the first convolutional layer. 6 feature maps connected to
    #one (1) 5x5 neighborhood in the input. 5*5*1*6=150 trainable parameters
    C1_w = tf.Variable(tf.truncated_normal(shape = [5,5,1,6],mean = mu, stddev = sigma))
    #Bias for each feature map. 6 parameters, with the weights we have 156 parameters
    C1_b = tf.Variable(tf.zeros(6))
    #Define the convolution layer with the weights and biases defined.
    C1 = tf.nn.conv2d(x, C1_w, strides = [1,1,1,1], padding = 'VALID') + C1_b
    #LeCun uses a sigmoidal activation function here.

    #This is the sub-sampling layer S2
    #Subsampling (also known as average pooling) with 2x2 receptive fields. 12 parameters.
    S2 = tf.nn.avg_pool(C1, ksize = [1,2,2,1], strides = [1,2,2,1], padding = 'VALID')
    #The result is passed to a sigmoidal function
    S2 = tf.nn.sigmoid(S2)

    #Another convolutional layer C3.
    #Initlialize weights. 16 feature maps connected connected to 5*5 neighborhoods
    C3_w = tf.Variable(tf.truncated_normal(shape = [5,5,6,16], mean = mu, stddev = sigma)) #This is the line I would want to change.
    C3_b = tf.Variable(tf.zeros(16))

Правильно знать, что код работает (конечно, с остальным приложенным кодом, просто показывая важную часть), но я не делаю то, что описано в статье, и я хотел бы следовать этому более внимательно. У меня есть 5x5x6x16 = 2400 + 16 = 2416 обучаемых параметров в C3, и сеть должна иметь здесь 1516 обучаемых параметров.

Может быть, возможно определить C3_w как матрицу, где некоторые значения являются tf.constants, а некоторые - tf.Variables? Как можно это сделать?

ОБНОВЛЕНИЕ № 1:

Хорошо, я пытаюсь использовать функцию разделения, как в примерах. Я хочу сделать следующее:

split1, split2 = tf.split(C3_w, [10, 6], axis=1) 

То есть разделить на [10, 6] по первому измерению (поскольку мой тензор - [5, 5, 6, 16]. Но это показывает мне эту ошибку:

ValueError: Sum of output sizes must match the size of the original Tensor along the split dimension or the sum of the positive sizes must be less if it contains a -1 for 'split' (op: 'SplitV') with input shapes: [5,5,6,16], [2], [] and with computed input tensors: input[1] = <10 6>, input[2] = <1>.

Обновление № 2

Даже если бы код в обновлении # 1 работал, я думаю, что я бы не реализовывал процедуру, описанную в статье. Я бы взял «первые» 10 соединений вместе с этим измерением и отбросил бы «следующий» 6. Это не то, как это делается в статье (см. Таблицу I на стр. 8, немного более сложную.

1 Ответ

0 голосов
/ 16 мая 2018

Просто разбейте карту объектов на несколько переменных, используя tf.split в зависимости от ситуации.Затем у вас есть отдельные переменные, которые подаются в следующий соответствующий слой.Backprop будет отлично работать через такую ​​операцию.

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

https://www.tensorflow.org/api_docs/python/tf/split

...