Почему моей сети нужно так много эпох, чтобы дать разумную точность? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть простая сеть с несколькими слоями, я пытался уменьшить слои (и num_outputs) для ускорения модели, но точность также снизилась, и мой вопрос заключается в том, как ускорить сходимость и одновременно повысить точностьвремя.Что-то не так в реализации, которая делает сеть слишком медленной

learning_rate=0.99
n_x=50
n_y=10
lossList=[]
g_tb = tf.Graph()
#
with g_tb.as_default():
    x = tf.placeholder(tf.float32, [None, n_x], name="x")#Glove Vectors
    y = tf.placeholder(tf.float32, [None, n_y], name="y")#scores
    with tf.name_scope('Neural_Nt'):
        fully_connected1 = tf.contrib.layers.fully_connected(inputs=x, num_outputs=500, 
                                                         activation_fn=tf.nn.relu,scope="Fully_Conn1")
        fully_connected2 = tf.contrib.layers.fully_connected(inputs=fully_connected1, num_outputs=400, 
                                                             activation_fn=tf.nn.relu,scope="Fully_Conn2")
        fully_connected3 = tf.contrib.layers.fully_connected(inputs=fully_connected2, num_outputs=300, 
                                                             activation_fn=tf.nn.relu,scope="Fully_Conn3")
        fully_connected4 = tf.contrib.layers.fully_connected(inputs=fully_connected2, num_outputs=50, 
                                                             activation_fn=tf.nn.relu,scope="Fully_Conn4")
        fully_connected5 = tf.contrib.layers.fully_connected(inputs=fully_connected2, num_outputs=10, 
                                                             activation_fn=tf.nn.relu,scope="Fully_Conn5")
        prediction = tf.contrib.layers.fully_connected(inputs=fully_connected3, num_outputs=10, 
                                               activation_fn=tf.nn.softmax,scope="Out")
    with tf.name_scope('Cost'):
        cost = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=prediction,scope="Cost_Function")
    with tf.name_scope('Accuracy'):
        correct_prediction = tf.equal(tf.argmax(prediction, 1, name="Argmax_Pred"), tf.argmax(y, 1, name="Y_Pred"), 
                                      name="Correct_Pred")
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32, name="Cast_Corr_Pred"), name="Accuracy")
 #       
    with tf.name_scope('Optimization'):
        optimizer = tf.train.AdagradOptimizer(learning_rate, name="Optimizer").minimize(cost)

    init = tf.global_variables_initializer()
  #  


# Start session
with tf.Session(graph=g_tb) as sess:
#
    lossList=[]

    sess.run(init)
    #Save the graph in the summary
    #summary_writer = tf.summary.FileWriter(logs_path, graph=tf.get_default_graph())
    training_epochs = 2000#4000
    for epoch in range(training_epochs):
        _, c ,prediction1,acc= sess.run([optimizer, cost,prediction,accuracy], feed_dict={x: np.array(gloveVectors),
                                                     y: np.array(scores)})
    # For every epoch save cost and accuracy
        print(epoch, c)
        lossList.append(c)
    print(acc)

1 Ответ

0 голосов
/ 23 сентября 2019

пишу здесь мои 5 центов, потому что я не могу комментировать.Итак, для начала у вас очень высокая скорость обучения learning_rate=0.99. Если вы выберете высокую скорость обучения, ваша модель может выучить быстрее, но компромисс - это неоптимальный набор весов или плохая точность.Подробнее о скорости обучения можно прочитать здесь.

Еще одна возможность увеличить скорость обучения - увеличить размер пакета.Но имейте в виду, что если вы выбираете очень большой размер партии, количество обновлений веса уменьшается, так что вы можете получить и плохую оценку точности.

Наконец, вы можете попробовать Dropout Layer между вашими обычными слоями.,Это может снизить скорость обучения, повысить точность, а также предотвратить переоснащение.Вы можете прочитать больше о Dropout здесь.

Насколько я понимаю, в вашей реализации нет ничего плохого, но чтобы быть уверенным, что вы можете поделиться данными, которые используете, для повторной проверки.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...