Я знаю, что это не проблема, с которой вы столкнулись, однако другая причина, по которой это может произойти, заключается в том, что у вас есть нефонический поток, открытый в вашем приложении.
using System;
using System.Threading;
using System.Windows.Forms;
namespace Sandbox_Form
{
static class Program
{
private static Thread thread;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
thread = new Thread(BusyWorkThread);
thread.IsBackground = false;
thread.Start();
Application.Run(new Form());
}
public static void BusyWorkThread()
{
while (true)
{
Thread.Sleep(1000);
}
}
}
}
Когда IsBackground
есть false
, это будет поддерживать вашу программу открытой до тех пор, пока поток не завершится, если вы установите IsBackground
на true
, нить не остановит программу. Такие вещи, как BackgroundWoker
, ThreadPool
и Task
, внутренне используют поток с IsBackground
, установленным на true
.
Когда вы используете cross_entropy_with_logits_v2, важно, чтобы вы пропустили логит. Это называется logit к предыдущему значению перед применением softmax. Должно быть так:
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=regular_prediction, labels=y))
Эта функция выполняет softmax, а затем cross_entropy. Это так, потому что, если они применяются отдельно в обратном распространении, вы можете иметь числовую нестабильность. Но при одновременном применении он упрощается при обратном распространении и становится на 100% стабильным.
РЕДАКТИРОВАТЬ: cross_entropy_with_logits_v2 представляет собой слой, который выполняет следующие cross_entropy (softmax (x), y). Проблема в том, что в обратном направлении эта комбинация cross_entropy и затем softmax не является численно устойчивой. Вот почему вы получаете нанс. Когда оба они объединены, упрощение выполняется следующим образом: https://deepnotes.io/softmax-crossentropy
Если применить один, а затем другой, тензор потока не будет иметь умение упрощать.