Я пытаюсь изменить структуру сети, предоставляемую Cifar10 в TensorFlow. Как правило, после первого слоя свертки (conv1) я добавил еще один уровень свертки (conv12). Независимо от того, как я установил фильтр (я пробовал все 1x1, 3x3, 5x5) и независимо от того, использует ли вес распад или нет, новый уровень уменьшит точность до менее 10%. Это эквивалентно случайному предположению в Cifar10, поскольку существует 10 классов.Низкая точность с заменой на TensorFlow Cifar10 пример
Структура кода следующая, я не изменяю никакую другую часть цифра, кроме того, что размер входного изображения равен 48x48 (вместо 24x24). Я думаю, размер ввода не должен иметь значения.
Обратите внимание, что conv12 - это слой глубины свертки, потому что я хочу добавить только линейный слой после уровня conv1, чтобы свести к минимуму изменение исходного кода. Сделав это, я ожидал, что точность должна быть похожа на оригинальную версию, но она уменьшится примерно до 10%. (Я также попытался нормальный свертке слой, но он не работает также.)
with tf.variable_scope('conv1') as scope:
kernel1 = _variable_with_weight_decay('weights', shape=[5, 5, 3, 64],
stddev=1e-4, wd=0.0)
conv_1 = tf.nn.conv2d(images, kernel1, [1, 1, 1, 1], padding='SAME')
biases1 = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0))
bias1 = tf.nn.bias_add(conv_1, biases1)
conv1 = tf.nn.relu(bias1, name=scope.name)
_activation_summary(conv1)
with tf.variable_scope('conv12') as scope:
kernel12 = _variable_with_weight_decay('weights', shape=[1, 1, 64, 1],
stddev=1e-4, wd=0.0)
#conv_12 = tf.nn.conv2d(conv1, kernel12, [1, 1, 1, 1], padding='SAME')
conv_12 = tf.nn.depthwise_conv2d(conv1, kernel12, [1, 1, 1, 1], padding='SAME')
biases12 = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0))
bias12 = tf.nn.bias_add(conv_12, biases12)
conv12 = tf.nn.relu(bias12)
_activation_summary(conv12)
pool1 = tf.nn.max_pool(conv12, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1],
padding='SAME', name='pool1')
.....
Может кто-то пожалуйста, скажите мне, что не так с кодом?
Нет, я сделал слой deepwsie_conv. Последнее значение в кортеже - это channel_multiplier, поэтому 1 здесь сделает вывод на глубину 64. Я также попробовал обычный слой свертки, у которого есть фильтр [1,1,64,64], как вы предложили (вы можете см. прокомментированную строку), но он также не работает. Поэтому я все же полагаю, что это не является источником проблемы, которую я испытываю. – Zk1001
О! Так ты и сделал - я пропустил это. хммм. – dga