使用 cifar 100 的图像分类器,训练精度不增加

Posted

技术标签:

【中文标题】使用 cifar 100 的图像分类器,训练精度不增加【英文标题】:Image classifier using cifar 100, train accuracy not increasing 【发布时间】:2019-06-13 01:30:24 【问题描述】:

我试图在 tensorflow 中使用 cifar100 数据集训练图像分类器模型,但准确度没有增加超过 1.2%。我搜索了这个问题并找到了几个解决方案,但我的模型仍然表现不佳。

我实施了几个步骤,例如:

    增加 CNN 层和池化以及 drop outs 和 归一化 更改编号。密集层 更改批量大小和时期 更改优化器

我注意到一个常见的事情是,当 epoch=10 和 batch size=256 & epoch=500 和 batch size=512 时,训练损失和准确率以相同的方式变化。

为了防止过度拟合,我还尝试了 dropout 正则化,这显示了一些变化(训练 acc. 在 0.5 和 1.2% 之间变化),当我增加 epoch 时使用相同的参数没有任何变化(train and model acc.)..

我想知道这是数据集的问题还是模型定义的问题。

分类器模型:

def classifierModel(inp):
    layer1=tf.nn.relu(tf.nn.conv2d(inp, filter=tf.Variable(tf.truncated_normal([5,5,3,16])), 
                                   strides=[1,2,2,1], padding='SAME'))
    layer1=tf.nn.bias_add(layer1, tf.Variable(tf.truncated_normal([16])))
    layer1=tf.nn.relu(tf.nn.max_pool(layer1, ksize=[1,1,1,1], strides=[1,2,2,1], padding='SAME'))

    layer2=tf.nn.relu(tf.nn.conv2d(layer1, filter=tf.Variable(tf.truncated_normal([5,5,16,32])), 
                                   strides=[1,2,2,1], padding='SAME'))
    layer2=tf.nn.bias_add(layer2, tf.Variable(tf.truncated_normal([32])))
    layer2=tf.nn.relu(tf.nn.max_pool(layer2, ksize=[1,1,1,1], strides=[1,2,2,1], padding='SAME'))

    layer3=tf.nn.relu(tf.nn.conv2d(layer2, filter=tf.Variable(tf.truncated_normal([5,5,32, 64])), 
                                   strides=[1,2,2,1], padding='SAME'))
    layer3=tf.nn.bias_add(layer3, tf.Variable(tf.truncated_normal([64])))

    layer3=tf.nn.relu(tf.nn.max_pool(layer3, ksize=[1,1,1,1], strides=[1,2,2,1], padding='SAME'))
    layer3=tf.nn.dropout(layer3, keep_prob=0.7)
    print(layer3.shape)


    fclayer1=tf.reshape(layer3, [-1, weights['fc1'].get_shape().as_list()[0]])
    fclayer1=tf.add(tf.matmul(fclayer1, weights['fc1']), biases['fc1'])
    fclayer1= tf.nn.dropout(fclayer1, keep_prob=0.5)
    fclayer2=tf.add(tf.matmul(fclayer1, weights['fc2']), biases['fc2'])
    fclayer2=tf.nn.dropout(fclayer2, keep_prob=0.5)
    fclayer3=tf.add(tf.matmul(fclayer2, weights['fc3']), biases['fc3'])
    fclayer3=tf.nn.dropout(fclayer3, keep_prob=0.7)
    outLayer=tf.nn.softmax(tf.add(tf.matmul(fclayer3, weights['out']), biases['out']))
    return outLayer

优化器、成本、准确性:

cost=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=model, labels=y))
optimizer=tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
correct_pred=tf.equal(tf.argmax(model, 1), tf.argmax(y, 1))
accuracy=tf.reduce_mean(tf.cast(correct_pred, tf.float32))

培训:

with tf.Session() as sess:
sess.run(init)
for i in range(epochs):
    #shuffle(idx)
    #train_features=train_features[idx, :, :, :]
    #train_labels=train_labels[idx, ]
    for batch_features, batch_labels in get_batches(batch_size, train_features, train_labels):
        sess.run(optimizer, feed_dict=x:batch_features, y:batch_labels)
    if (i%display_step==0):

        epoch_stats(sess, i, batch_features, batch_labels)

model_acc=sess.run(accuracy, feed_dict=x:test_features, y:test_labels)
saver.save(sess, save_file)

writer.add_graph(sess.graph)

结果:

    epoch : 0 - cost : 4.62 - acc: 0.01 epoch : 1 - cost : 4.62 - acc: 0.01 epoch : 2 - cost : 4.62 - acc: 0.008 epoch : 3 - cost : 4.61 - acc: 0.012 epoch : 4 - cost : 4.61 - acc: 0.005 epoch : 5 - cost : 4.62 - acc: 0.006 epoch : 6 - cost : 4.62 - acc: 0.016 epoch : 7 - cost : 4.62 - acc: 0.012 epoch : 8 - cost : 4.61 - acc: 0.014 epoch : 9 - cost : 4.62 - acc: 0.009 模型精度 - 0.010499999858438969

【问题讨论】:

你的fclayer1fclayer2的激活函数在哪里? 在将图像传递给训练器之前,您可能需要对图像进行随机播放,以防它们被排序,否则批次包含相同类别的图像 @SamerAyoub 数据集没有排序,我也尝试过洗牌数据集(你可以看到它以灰色注释掉),但准确度没有改变 @PrayagMadhu 尝试在模型能够过度拟合数据之前删除 tf.nn.dropout 【参考方案1】:

您传递给 softmax_cross_entropy_with_logits_v2 的第一个参数不正确。 您必须传递“以前的”值才能应用 softmax。那是因为 softmax_cross_entropy_with_logits_v2 真的是 cross_entropy (softmax (x))。理由是导数可以简化。

在模型中,您应该执行以下操作:

def classifierModel(inp):
    layer1=tf.nn.relu(tf.nn.conv2d(inp, filter=tf.Variable(tf.truncated_normal([5,5,3,16])), 
                                   strides=[1,2,2,1], padding='SAME'))
    layer1=tf.nn.bias_add(layer1, tf.Variable(tf.truncated_normal([16])))
    layer1=tf.nn.relu(tf.nn.max_pool(layer1, ksize=[1,1,1,1], strides=[1,2,2,1], padding='SAME'))

    layer2=tf.nn.relu(tf.nn.conv2d(layer1, filter=tf.Variable(tf.truncated_normal([5,5,16,32])), 
                                   strides=[1,2,2,1], padding='SAME'))
    layer2=tf.nn.bias_add(layer2, tf.Variable(tf.truncated_normal([32])))
    layer2=tf.nn.relu(tf.nn.max_pool(layer2, ksize=[1,1,1,1], strides=[1,2,2,1], padding='SAME'))

    layer3=tf.nn.relu(tf.nn.conv2d(layer2, filter=tf.Variable(tf.truncated_normal([5,5,32, 64])), 
                                   strides=[1,2,2,1], padding='SAME'))
    layer3=tf.nn.bias_add(layer3, tf.Variable(tf.truncated_normal([64])))

    layer3=tf.nn.relu(tf.nn.max_pool(layer3, ksize=[1,1,1,1], strides=[1,2,2,1], padding='SAME'))
    layer3=tf.nn.dropout(layer3, keep_prob=0.7)
    print(layer3.shape)


    fclayer1=tf.reshape(layer3, [-1, weights['fc1'].get_shape().as_list()[0]])
    fclayer1=tf.add(tf.matmul(fclayer1, weights['fc1']), biases['fc1'])
    fclayer1= tf.nn.dropout(fclayer1, keep_prob=0.5)
    fclayer2=tf.add(tf.matmul(fclayer1, weights['fc2']), biases['fc2'])
    fclayer2=tf.nn.dropout(fclayer2, keep_prob=0.5)
    fclayer3=tf.add(tf.matmul(fclayer2, weights['fc3']), biases['fc3'])
    fclayer3=tf.nn.dropout(fclayer3, keep_prob=0.7)
    logits = tf.add(tf.matmul(fclayer3, weights['out']), biases['out'])
    outLayer=tf.nn.softmax(logits)
    return outLayer, logits

在损失函数中:

model, logits = classifierModel(inp)
cost=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y))
optimizer=tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
correct_pred=tf.equal(tf.argmax(model, 1), tf.argmax(y, 1))
accuracy=tf.reduce_mean(tf.cast(correct_pred, tf.float32))

【讨论】:

以上是关于使用 cifar 100 的图像分类器,训练精度不增加的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch CIFAR10图像分类 ZFNet篇

Pytorch CIFAR10图像分类 ZFNet篇

Pytorch CIFAR10图像分类 ZFNet篇

Pytorch CIFAR10图像分类 ZFNet篇

Pytorch CIFAR10图像分类 ZFNet篇

Pytorch CIFAR10图像分类 ZFNet篇