首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sparse_softmax_cross_entropy_with_logits结果比softmax_cross_entropy_with_logits差

sparse_softmax_cross_entropy_with_logits结果比softmax_cross_entropy_with_logits差
EN

Stack Overflow用户
提问于 2017-04-14 16:05:40
回答 1查看 914关注 0票数 1

我用tensorflow实现了经典的图像分类问题,我有9类,首先使用softmax_cross_entropy_with_logits作为分类器和训练网络,经过一定的步骤使训练准确率达到99%,

然后用sparse_softmax_cross_entropy_with_logits测试同样的问题,这一次它根本不收敛,(火车的精度在0.10和0.20左右)

对于您的信息,对于softmax_cross_entropy_with_logits,我对标签使用batch_size、num_classes和dtype float32,对于sparse_softmax_cross_entropy_with_logits,对于dtype int32使用batch_size作为标签。

有人知道吗?

更新:

代码语言:javascript
复制
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) 

主要:

代码语言:javascript
复制
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} )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-15 17:14:02

我发现了这个问题,感谢@mrry给出了有益的评论,实际上,我在计算准确性方面弄错了,事实上,"sparse_softmax“和"softmax”在输入逻辑上有相同的损失(或成本),

为了提高计算精度,我更改

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数字。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43415177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档