1

我想修改TensorFlow中Cifar10提供的網絡結構。通常,我在第一個卷積圖層(conv1)之後添加了另一個卷積圖層(conv12)。無論我如何設置過濾器(我嘗試了所有1x1,3x3,5x5),並且無論是否使用重量衰減,新層都會將精度降至10%以下。這相當於Cifar10中的隨機猜測,因爲有10個類。對TensorFlow Cifar10改變的精確度較低例如

代碼結構如下,除了將輸入圖像的大小設置爲48x48(而不是24x24)之外,我不修改cifar的任何其他部分。我猜輸入大小應該不重要。

請注意,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輸出。這似乎並不符合你跟隨的任何代碼(如果它是從cifar example from TensorFlow開始的conv2,那麼它肯定不會很好地工作,因爲那個預期深度-64輸入。)

也許你真的想要shape=[1, 1, 64, 64],它只會在你的模型中增加一個額外的「初始式」1x1卷積層?

+0

不,我做了一個depthwsie_conv層。元組中的最後一個值是channel_multiplier,所以在這裏1會使得輸出的深度爲64.我也嘗試了一個正常的卷積層,其中有一個文件夾[1,1,64,64],正如你所建議的那樣(你可以看到評論線),但它也不起作用。所以我仍然認爲這不是我遇到的問題的根源。 – Zk1001

+0

哦!所以你做了 - 我錯過了。 hmmmm。 – dga