Архитектура свертки NN, ошибка формирования - PullRequest
0 голосов
/ 05 октября 2018

Я пытался заставить работать CNN для набора данных Omligot (105 x 105 x 1 изображений) с помощью двух найденных мной руководств: Руководство CNN 1 и Учебное пособие CNN 2 , работающее над обычным набором данных MNIST (28 x 28 x 1 изображений).

Я все еще борюсь с формирующимся конфликтом в реализации (после недели с включенным и выключенным временем для отладки) Никто до сих пор не смог оказать какую-либо помощь, и в то же время я мог отлаживатьв некотором смысле, где, я думаю, я могу дать лучшее описание ошибки формирования.

Большая часть моего кода выглядит следующим образом (просто пропускаю несколько ненужных вещей здесь и там).Итак, мои заполнители определены следующим образом:

x = tf.placeholder(tf.float32, shape=(None, 105, 105, 1) )  # placeholder for train data
y = tf.placeholder(tf.float32, shape=(None, 20) )           # placeholder for labels
lr = tf.placeholder(tf.float32,shape=(), name="learnRate")  # for varying learning rates during training

размер метки 20, учитывая, что в алфавите 20 разных символов.Итак, вектор с горячим кодированием длины 20.

С этого момента моя модель определяется следующим образом (где я прокомментировал результаты измерений для каждого вывода):

# weight and bias dimension definitions
self.ConFltSize = 3
self.ConOutSize = 7
self.weights = {
    'wc1': tf.Variable(tf.random_normal([self.ConFltSize,self.ConFltSize,1, 32], stddev=0.01, name='W0')), 
    'wc2': tf.Variable(tf.random_normal([self.ConFltSize,self.ConFltSize,32, 64], stddev=0.01, name='W1')), 
    'wc3': tf.Variable(tf.random_normal([self.ConFltSize,self.ConFltSize,64, 128], stddev=0.01, name='W2')), 
    'wd1': tf.Variable(tf.random_normal([self.ConOutSize * self.ConOutSize * 128, 128], stddev=0.01, name='W3')), 
    'out': tf.Variable(tf.random_normal([128, self.InLabels.shape[1]], stddev=0.01, name='W4')), 
    }

self.biases = {
    'bc1': tf.Variable(tf.random_normal([32], stddev=0.01, name='B0')), 
    'bc2': tf.Variable(tf.random_normal([64], stddev=0.01, name='B1')), 
    'bc3': tf.Variable(tf.random_normal([128], stddev=0.01, name='B2')),
    'bd1': tf.Variable(tf.random_normal([128], stddev=0.01, name='B3')),
    'out': tf.Variable(tf.random_normal([self.InLabels.shape[1]], stddev=0.01, name='B4')),
    }

# Model definition + shaping results
# x = provide the input data
# weights = dictionary variables for weights
# biases = dictionary variables for biases
def Architecture(self, x, weights, biases): 

    conv1 = self.conv(x, weights['wc1'], biases['bc1'])      # convolution layer 1
    conv1 = self.maxPool(conv1)                              # max pool layer 1
    # out shape -> [None, 53, 53, 32]

    conv2 = self.conv(conv1, weights['wc2'], biases['bc2'])  # convolution layer 2
    conv2 = self.maxPool(conv2)                              # max pool layer 2
    # out shape -> [None, 27, 27, 64]

    conv3 = self.conv(conv2, weights['wc3'], biases['bc3'])  # convolution layer 3
    conv3 = self.maxPool(conv3)                              # max pool layer 3
    # out shape -> [None, 14, 14, 128]

    flayer = tf.reshape(conv3, [-1, weights['wd1'].shape[0]])   # flatten the output from convo layer
    # for 7 x 7 x 128 this is -> [None, 6272] 
    flayer = tf.add(tf.matmul(flayer, weights['wd1']), biases['bd1'])           # fully connected layer 1
    flayer = tf.nn.relu(flayer)
    # out shape -> [None, 128]

    out = tf.add( tf.matmul(flayer, weights['out']), biases['out'] )   # do last set of output weight * vals + bias  
    # out shape -> [None, 20]       

    return out      # net input to output layer

Но тактеперь в моей основной программе я передаю входные данные в мою модель в пакетном режиме, в основном с помощью:

    out = self.Architecture(x, self.weights, self.biases)    # Implement network architecture, and get output tensor (net input to output layer)

    # normalize, softmax and entropy the net input, in comparison with provided labels
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=out, labels=y) )   # cost function
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(cost)                  # gradient descent optimizer

    pred = tf.equal(tf.argmax(out, 1), tf.argmax(y , 1)) # output true / false if predicted value matches label
    accuracy = tf.reduce_mean(tf.cast(pred, tf.float32))             # percentage value of correct predictions

    for i in range(iters):          
            [BX, _, BY, _] = batch.split(trainX, trainY, Bsize) # random split in batch size
            # data shapes: BX -> [160, 105, 105, 1], BY -> [160, 20]

            # Code bombs out after feeding with input data
            opt = sess.run(optimizer, feed_dict={lr:learnr, x:BX, y:BY } )

Исключение, которое я затем получаю с помощью команды sess.run:

'логиты и метки должны быть транслируемыми: logits_size = [640,20] label_size = [160,20] \ n \ t [[Узел: softmax_cross_entropy_with_logits = SoftmaxCrossEntropyWithLogits [T = DT_FLOAT, _device = "/ job: localhost / replica0 / задача: 0 / устройство: ЦП: 0 "] (Add_1, softmax_cross_entropy_with_logits / Reshape_1)]] '

Исходя из этого, я понимаю, что softmax получает [640, 20] в качестве ввода, пока оножидая [160, 20] ... Я не понимаю, как, где данные могут быть сформированы в [640, 20] ???

Пожалуйста, покажите мне, если я что-то упустил, или неправильно истолковал ошибку?

...