CNTK CMD RedirectStandardOutput = true не работает - PullRequest
0 голосов
/ 11 мая 2019

Microsoft отказалась от CNTK для ML.NET (Ужасный продукт) и ONNX (Еще не смотрел на это).

CNTK, лучший продукт Microsoft с открытым исходным кодом, но, к сожалению, множество ошибок и нулевой поддержки!

Я неохотно смотрю на сообщество Stackoverflow для возможного разрешения.

string filepath = @"<My big long Path>\";
string filename = Path.Combine(filepath, @"Data\SLUHandsOn.cntk");

if (!File.Exists(filename))
    ProcessOutputData("File does not exist!");

Process process = new Process();

process.StartInfo.FileName = "CMD";
process.StartInfo.WorkingDirectory = filepath;
process.StartInfo.Arguments = "/c cntk configFile=" + "\"" + filename + "\"";

process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;

process.Start();

process.OutputDataReceived += new DataReceivedEventHandler((x, y) =>
{
    ProcessOutputData(y.Data);
});

process.BeginOutputReadLine();

Метод ProcessOutputData также довольно прост:

private void ProcessOutputData(string text)
{

    if (InvokeRequired)
    {
        Invoke(new MethodInvoker(() => { ProcessOutputData(text); }));
    }
    else
    {
        // Output Data:
        richTextBox1.AppendText(text + Environment.NewLine);
    }
}

Само собой разумеется, CNTK, кажется, не выводит данные. Я попытался запустить CNTK как с CMD.exe, так и с помощью CNTK.exe из Visual Studio Tools for AI Вторично распространяемый.

Опять же, проблема, с которой я сталкиваюсь, в том, что нет данных RedirectStandardOutput.

Спасибо.

ОТВЕТ Кредит: MarcelGrommer - Спасибо!

process.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
{

    ProcessOutputData(e.Data);
});

// Asynchronously read the standard Error of the spawned process.
process.BeginErrorReadLine();

1 Ответ

1 голос
/ 13 мая 2019

Вы должны воспользоваться каналом RedirectStandardError. CNTK вычисляет ошибку сети, поэтому данные поступают на канал StandardError. Это работает.

processCNTK.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
{
            string outFromCNTK = e.Data;
}
...