Я пытался заставить работать 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] ???
Пожалуйста, покажите мне, если я что-то упустил, или неправильно истолковал ошибку?