Python (tensorflow) — результаты точности регуляризации отсева

Я пытаюсь завершить код для проблемы классификации (классификация изображений) в среде Python. Я построил 5-слойную NN с определенным количеством нейронов, используя оптимизатор градиентного спуска из библиотеки tensorflow. Первый «полный» код вывел на высокий уровень точности, но поскольку проявилась проблема переобучения, я просто решил ввести процедуру регуляризации отсева. В конце первого прогона все было хорошо, с Точность обучения: 1,0 и Точность тестирования: 0,9606 после обучения модели более 1000 итераций. Через несколько секунд я решил перезапустить код, и, как вы можете видеть на следующих двух изображениях, что-то пошло не так. Точность прогнозирования за счет регуляризации отсева — FAIL , Функция стоимости через регуляризацию отсева - НЕУДАЧА. Моделирование остановилось до последней определенной итерации, не предоставив мне никакого выходного предупреждения! Запуск одного и того же кода, как это возможно? У кого-нибудь была такая проблема раньше? Является ли это проблемой вычисления кросс-энтропийной функции или как точность НС может мгновенно упасть до нуля с такого высокого уровня точности?


person Claudio Maino    schedule 22.10.2017    source источник
comment
Вы можете поделиться своим кодом здесь для обзора?   -  person Sameer Mahajan    schedule 23.10.2017
comment
выложил код!   -  person Claudio Maino    schedule 23.10.2017


Ответы (1)


Это код. Он основан на наборе данных mnist, используемом для задач классификации цифр. Вот как следует:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

Xflatten=tf.reshape(X, [-1, 784])

Y1f=tf.nn.relu(tf.matmul(Xflatten,W1) + b1)
Y1=tf.nn.dropout(Y1f,pkeep)

Y2f=tf.nn.relu(tf.matmul(Y1,W2) + b2)
Y2=tf.nn.dropout(Y2f,pkeep)

Y3f=tf.nn.relu(tf.matmul(Y2,W3) + b3)
Y3=tf.nn.dropout(Y3f,pkeep)

Y4f=tf.nn.relu(tf.matmul(Y3,W4) + b4)
Y4=tf.nn.dropout(Y4f,pkeep)

Y=tf.nn.softmax(tf.matmul(Y4,W5) + b5)

Y_=tf.placeholder(tf.float32, [None, 10]) #Y_ stands for the labels representing the digits; "one-hot" encoded

cross_entropy= -tf.reduce_sum(Y_ * tf.log(Y)) #tf.reduce_sum() computes the summation of the required elements for the cross entropy computation

is_correct=tf.equal(tf.argmax(Y,1),tf.argmax(Y_,1)) #tf.argmax() allows to make the "one-hot" decoding
accuracy=tf.reduce_mean(tf.cast(is_correct, tf.float32)) 

optimizer=tf.train.GradientDescentOptimizer(learning_rate)train_step=optimizer.minimize(cross_entropy) 

sess=tf.Session()
sess.run(init)

iterations_num=1000 
xaxis=np.arange(iterations_num) 
num_minibatches = int(50000 / minibatch_size) cost_train=[]
accuracy_train=[]
cost_test=[]
accuracy_test=[]

for i in range(iterations_num):

    #load batch of images and correct answers
    batch_X, batch_Y = mnist.train.next_batch(100)
    train_data={Xflatten: batch_X, Y_: batch_Y}

    #train
    sess.run(train_step, feed_dict=train_data)

    #success?
    a_train,c_train=sess.run([accuracy, cross_entropy], feed_dict=train_data)
    cost_train.append(c_train)
    accuracy_train.append(a_train)

    #success on test data?
    test_data={Xflatten: mnist.test.images, Y_: mnist.test.labels}
    a_test,c_test=sess.run([accuracy, cross_entropy], feed_dict=test_data)
    cost_test.append(c_test)
    accuracy_test.append(a_test)

plt.plot(xaxis,cost_train,'b',xaxis,cost_test,'r')

plt.ylabel('cost with dropout regularization')

plt.xlabel('iterations')

plt.title("Learning rate =" + str(learning_rate))

plt.show()

plt.plot(xaxis,accuracy_train,'b',xaxis,accuracy_test,'r')

plt.ylabel('accuracy with dropout regularization')

plt.xlabel('iterations')

plt.title("Learning rate =" + str(learning_rate))

plt.show()

print ("Train Accuracy:" + str(a_train))
print ("Test Accuracy:" + str(a_test))   

sess.close()
person Claudio Maino    schedule 23.10.2017