Входная строка не была в правильном формате String для массива double [] []
Я знаю, что здесь есть больше тем на эту тему, но на самом деле ни одна из них мне не помогла.
Я предоставлю весь код:
namespace ConsoleApplication1
{
public static class Load
{
public static double[][] FromFile(string path)
{
var rows = new List<double[]>();
foreach (var line in File.ReadAllLines(path))
{
// HERE IS THE ERROR
rows.Add(line.Split(new[] { ' ' }).Select(double.Parse).ToArray());
}
return rows.ToArray();
}
}
public class Program
{
static void Main( string [ ] args )
{
string cestain = @"E:\vstup.txt";
double[][] innput = Load.FromFile(cestain);
string cestaout = @"E:\vystup.txt";
double[][] ooutput = Load.FromFile(cestaout);
// c r e a t e a neural network
var network = new BasicNetwork ( ) ;
network . AddLayer (new BasicLayer ( null , true , 2) ) ;
network . AddLayer (new BasicLayer (new ActivationSigmoid ( ) , true , 3) ) ;
network . AddLayer (new BasicLayer (new ActivationSigmoid ( ) , false , 1) ) ;
network . Structure . FinalizeStructure ( ) ;
network . Reset( );
// c r e a t e t r a i n i n g data
IMLDataSet trainingSet = new BasicMLDataSet (innput , ooutput ) ;
// t r a i n the neural network
IMLTrain train = new ResilientPropagation (network , trainingSet) ;
int epoch = 1 ;
do
{
train.Iteration( ) ;
Console.WriteLine(@"Epoch #" + epoch + @" Error : " + train.Error );
epoch++;
} while ( train.Error> 0.01 ) ;
Console.ReadLine();
}
}
}
Вот что я пытаюсь загрузить в double[][]
вход:
166 163 180 228
165 162 160 226
166 163 180 228
166 164 180 228
171 162 111 225
Вот что я пытаюсь загрузить в double[][]
выход:
1 0 0
1 0 0
0 1 0
0 1 0
1 0 0
2 ответа
Проблема: у вас есть дополнительные пустые строки после каждой строки в вашем текстовом файле. когда функция Split() встречает новую строку, она возвращается, потому что нечего разбивать и Add()
функция выдает исключение, так как пустая строка недопустима Double
,
Решение 1: Вы можете использовать StringSplitOptions.RemoveEmptyEntries
в качестве второго аргумента Split()
функция, чтобы игнорировать EmptyLines.
foreach (var line in File.ReadAllLines(path))
{
// HERE IS THE ERROR
rows.Add(line.Split(new[] { ' ' },StringSplitOptions.RemoveEmptyEntries).Select(double.Parse).ToArray());
}
Решение 2: вы можете проверить, пустая линия или нет, используя String.IsNullOrWhiteSpace()
foreach (var line in File.ReadAllLines(path))
{
if(!String.IsNullOrWhiteSpace(line))
{
// HERE IS THE ERROR
rows.Add(line.Split(new[] { ' ' },StringSplitOptions.RemoveEmptyEntries).Select(double.Parse).ToArray());
}
}
У меня была похожая проблема не так давно. С помощью StringSplitOptions.RemoveEmptyEntries
решил это для меня. Так и становится, lines.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
Это помогает, потому что вы получаете пустые строки, поэтому RemoveEmptyEntries
удаляет эти строки из результата метода Split.