Классификатор изображений с использованием Cifar 100, точность поезда не увеличивается - PullRequest
0 голосов
/ 18 января 2019

Я пытался обучить модель классификатора изображений с использованием набора данных cifar100 в тензорном потоке, но точность не увеличивается более чем на 1,2%. Я погуглил проблему и нашел несколько решений, но моя модель все еще не работает.

Я реализовал несколько шагов, таких как:

  1. увеличение слоя CNN и объединение вместе с выпадениями и Нормализация
  2. изменение нет. плотных слоев
  3. изменение размера партии и эпох
  4. смена оптимизаторов

Обычная вещь, которую я заметил, заключается в том, что при epoch = 10 и размере пакета = 256 & epoch = 500 и размере пакета = 512 потери на обучение и точность меняются одинаково.

Во избежание переоснащения я также пытался регуляризовать отсев, это показывает некоторые изменения (состав поезда варьируется от 0,5 до 1,2%), при тех же параметрах, когда я увеличивал периоды, ничего не менялось (состав поезда и модель).

Я хотел знать, является ли это проблемой с набором данных или с определением модели.

модель классификатора:

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)

Результаты:

  1. эпоха: 0 - стоимость: 4,62 - согласно: 0,01
  2. эпоха: 1 - стоимость: 4,62 - согласно: 0,01
  3. эпоха: 2 - стоимость: 4,62 - согласно: 0,008
  4. эпоха: 3 - стоимость: 4,61 - согласно: 0,012
  5. эпоха: 4 - стоимость: 4,61 - согласно: 0,005
  6. эпоха: 5 - стоимость: 4,62 - согласно: 0,006
  7. эпоха: 6 - стоимость: 4,62 - согласно: 0,016
  8. эпоха: 7 - стоимость: 4,62 - согласно: 0,012
  9. эпоха: 8 - стоимость: 4,61 - согласно: 0,014
  10. эпоха: 9 - стоимость: 4,62 - согласно: 0,009
  11. Точность модели - 0,010499999858438969

1 Ответ

0 голосов
/ 19 января 2019

Первый аргумент, который вы передаете 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))
...