2017-04-14 19 views
0

我實現與tensorflow經典圖像分類的問題,我有9個班,首先我用softmax_cross_entropy_with_logits作爲分類和鐵路網絡,更糟糕經過一些步驟,它提供了約99%的火車準確性,sparse_softmax_cross_entropy_with_logits結果比softmax_cross_entropy_with_logits

然後與sparse_softmax_cross_entropy_with_logits測試同樣的問題這一次不收斂可言,(火車精度大約爲0.10和0.20)

僅供信息,softmax_cross_entropy_with_logits,我用[batch_size時,num_classes]與D型FLOAT32的標籤,和sparse_softmax_cross_entropy_with_logits我使用[batch_size]與dtype int32 fo r標籤。

有沒有人有什麼想法?

更新:

this is code: 

def costFun(self): 
    self.y_ = tf.reshape(self.y_, [-1]) 
    return tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(self.score_, self.y_)) 

def updateFun(self): 
    return tf.train.AdamOptimizer(learning_rate = self.lr_).minimize(self.cost_) 

def perfFun(self): 
    correct_pred = tf.equal(tf.argmax(self.score_,1), tf.argmax(y,1)) 
    return(tf.reduce_mean(tf.cast(correct_pred, tf.float32))) 

def __init__(self,x,y,lr,lyr1FilterNo,lyr2FilterNo,lyr3FilterNo,fcHidLyrSize,inLyrSize,outLyrSize, keepProb): 

    self.x_   = x 
    self.y_   = y 
    self.lr_   = lr 
    self.inLyrSize  = inLyrSize 
    self.outLyrSize_ = outLyrSize 
    self.lyr1FilterNo_ = lyr1FilterNo 
    self.lyr2FilterNo_ = lyr2FilterNo 
    self.lyr3FilterNo_ = lyr3FilterNo 
    self.fcHidLyrSize_ = fcHidLyrSize 
    self.keepProb_  = keepProb 

    [self.params_w_, self.params_b_] = ConvNet.paramsFun(self) 
    self.score_, self.PackShow_  = ConvNet.scoreFun (self) 
    self.cost_      = ConvNet.costFun (self) 
    self.update_      = ConvNet.updateFun(self) 
    self.perf_      = ConvNet.perfFun (self) 

主:

lyr1FilterNo = 32 
lyr2FilterNo = 64 
lyr3FilterNo = 128 

fcHidLyrSize = 1024 
inLyrSize = 32 * 32 

outLyrSize = 9 
lr   = 0.001 
batch_size = 300 

dropout  = 0.5 
x   = tf.placeholder(tf.float32, [None, inLyrSize ]) 
y   = tf.placeholder(tf.int32, None   ) 

ConvNet_class = ConvNet(x,y,lr,lyr1FilterNo,lyr2FilterNo,lyr3FilterNo,fcHidLyrSize,inLyrSize,outLyrSize, keepProb) 
initVar = tf.global_variables_initializer() 


with tf.Session() as sess: 
    sess.run(initVar) 

    for step in range(10000): 

     trData_i = np.reshape(trData_i , (-1, 32 * 32)) 
     trLabel_i = np.reshape(trLabel_i, (-1, 1  )) 

     update_i, PackShow, wLyr1_i, wLyr2_i, wLyr3_i = sess.run([ConvNet_class.update_, ConvNet_class.PackShow_, 
          ConvNet_class.params_w_['wLyr1'], ConvNet_class.params_w_['wLyr2'], ConvNet_class.params_w_['wLyr3']], 
          feed_dict = { x:trData_i, y:trLabel_i, keepProb:dropout}) 
+0

這兩個操作應該對單一熱點('tf.train.softmax_cross_entropy_with_logits()')或稀疏('tf.train.sparse_softmax_cross_entropy_with_logits()')格式中的相同的logits和相同的標籤產生相同的結果。你有沒有檢查過這兩個操作是否爲相同的輸入計算相同的損失?你能顯示你使用的每個版本的代碼嗎? – mrry

+0

@mrry謝謝你的迴應,不,我沒有得到相同的結果與稀疏和softmax相同的logits,我也張貼我的代碼,我使用32x32輸入形狀,9類和其他東西,我刪除了一些部分更易讀,再次感謝您的關注 –

回答

1

我發現這個問題,這要歸功於@mrry有幫助的評論,其實我搞錯精度的計算,實際上,「sparse_softmax 「和」softmax「對輸入logits具有相同的損失(或成本),

用於計算精度,我更改

correct_pred = tf.equal(tf.argmax(self.score_,1), tf.argmax(y,1))

correct_pred = tf.equal(tf.argmax(self.score_,1), y))

因爲在 「sparse_softmax」 地面實況標籤不是在一個熱矢量格式,但真正的Int32或Int64的數字。