2016-06-14 105 views
3

我想創建一個CNN使用Tensorflow,將圖像分類爲16類Tensorflow cnn錯誤:logits和標籤必須是相同的大小:

我原來的圖像尺寸爲72x72x1,我的網絡結構是這樣的:

# Network 
n_input = dim 
n_output = nclass # 16 
weights = { 
    'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32], stddev=0.1)), 
    'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64], stddev=0.1)), 
    'wd1': tf.Variable(tf.random_normal([9*9*128, 1024], stddev=0.1)), 
    'wd2': tf.Variable(tf.random_normal([1024, n_output], stddev=0.1)) 
} 
biases = { 
    'bc1': tf.Variable(tf.random_normal([32], stddev=0.1)), 
    'bc2': tf.Variable(tf.random_normal([64], stddev=0.1)), 
    'bd1': tf.Variable(tf.random_normal([1024], stddev=0.1)), 
    'bd2': tf.Variable(tf.random_normal([n_output], stddev=0.1)) 
} 

這裏是我的CONV網功能:

def conv_basic(_input, _w, _b, _keepratio): 
# Input 
_input_r = tf.reshape(_input, shape=[-1, 72, 72, 1]) 

# Conv1 
_conv1 = tf.nn.relu(tf.nn.bias_add(
     tf.nn.conv2d(_input_r, _w['wc1'], strides=[1, 1, 1, 1], padding='SAME') 
     , _b['bc1'])) 
_pool1 = tf.nn.max_pool(_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') 
mean, var = tf.nn.moments(_pool1, [0, 1, 2]) 
_pool1 = tf.nn.batch_norm_with_global_normalization(_pool1, mean, var, 1., 0., 1e-7, 0) 
_pool_dr1 = tf.nn.dropout(_pool1, _keepratio) 

# Conv2 
_conv2 = tf.nn.relu(tf.nn.bias_add(
     tf.nn.conv2d(_pool_dr1, _w['wc2'], strides=[1, 1, 1, 1], padding='SAME') 
     , _b['bc2'])) 
_pool2 = tf.nn.max_pool(_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') 
mean, var = tf.nn.moments(_pool2, [0, 1, 2]) 
_pool2 = tf.nn.batch_norm_with_global_normalization(_pool2, mean, var, 1., 0., 1e-7, 0) 
_pool_dr2 = tf.nn.dropout(_pool2, _keepratio) 

# Vectorize 
_dense1 = tf.reshape(_pool_dr2, [-1, _w['wd1'].get_shape().as_list()[0]]) 

# Fc1 
_fc1 = tf.nn.relu(tf.add(tf.matmul(_dense1, _w['wd1']), _b['bd1'])) 
_fc_dr1 = tf.nn.dropout(_fc1, _keepratio) 

# Fc2 
_out = tf.add(tf.matmul(_fc_dr1, _w['wd2']), _b['bd2']) 

# Return everything 
out = { 
    'input_r': _input_r, 
    'conv1': _conv1, 
    'pool1': _pool1, 
    'pool1_dr1': _pool_dr1, 
    'conv2': _conv2, 
    'pool2': _pool2, 
    'pool_dr2': _pool_dr2, 
    'dense1': _dense1, 
    'fc1': _fc1, 
    'fc_dr1': _fc_dr1, 
    'out': _out 
} 
return out 

當我嘗試運行此,我得到一個錯誤:"tensorflow.python.framework.errors.InvalidArgumentError: logits and labels must be same size: logits_size=[6,16] labels_size=[1,16]"

上線cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(_pred, y))

我試過改變wd1的重量值,除了說要求的形狀需要xxx的倍數外,它只是改變括號中的值。

這些值(特別是6)看起來很隨意,它們來自於idk。如果有人向我解釋FC層神經元數量是如何選擇的,那將會很好,因爲它似乎也有點武斷。

感謝

編輯:我的全碼https://gist.github.com/EricZeiberg/f0b138d859b9ed00ce045dc6b341e0a7

回答

0

它很難從你提供的東西告訴我們,但好像你的飼料投入使用的6批次大小,但只爲他們提供一個標籤。你的數據來自哪裏?

+0

我已編輯文章以包含我的完整代碼 – Eric

3

鑑於你的代碼(和猜測它是什麼缺少的),我認爲你有這些參數和結果(如果錯了指正):

  • batch_size:1
  • num_classes:16
  • 標籤y:int類型,形狀[batch_size, 1]
  • 輸出_pred:類型FLOAT32,形狀[batch_size, num_classes]

在代碼中,你只能使用最多2個池,其中輸入特徵映射減少[1, 72, 72, 1][1, 18, 18, 64]

在這一步,你應該寫:

# Vectorize 
_dense1 = tf.reshape(_pool_dr2, [1, 18*18*64]) 

你也應該更換你的矩陣wd1

'wd1': tf.Variable(tf.random_normal([18*18*64, 1024], stddev=0.1)) 

通常,在這些情況下,您需要打印每個形狀,一步接一步,並自己實現其中形狀不符合你的期望。

+0

我已編輯帖子以包含我的完整代碼 – Eric

+0

嘗試完代碼後,它現在說'ValueError:無法將張量的值(1,16) u'Reshape_3:0',形狀爲'(1,)'' – Eric

+0

哦,我的批量大小爲1,num_classes爲16 – Eric

相關問題