1

Я пытаюсь изменить структуру сети, предоставляемую 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') 
..... 

Может кто-то пожалуйста, скажите мне, что не так с кодом?

ответ

0

Вашей вторая свертка:

kernel12 = _variable_with_weight_decay('weights', shape=[1, 1, 64, 1] 

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

Возможно, вам действительно захотелось shape=[1, 1, 64, 64], который просто добавит в вашу модель дополнительный сверточный слой 1-го уровня «начальный стиль»?

+0

Нет, я сделал слой deepwsie_conv. Последнее значение в кортеже - это channel_multiplier, поэтому 1 здесь сделает вывод на глубину 64. Я также попробовал обычный слой свертки, у которого есть фильтр [1,1,64,64], как вы предложили (вы можете см. прокомментированную строку), но он также не работает. Поэтому я все же полагаю, что это не является источником проблемы, которую я испытываю. – Zk1001

+0

О! Так ты и сделал - я пропустил это. хммм. – dga

Смежные вопросы