Почему моя программа сбрасывает наиболее значимые цифры при чтении / записи в файл? - PullRequest
1 голос
/ 11 января 2020

Я писал две функции для сохранения 4-мерного вектора в файл, а затем считывал вектор обратно в файл.

void saveLayer(string filename, int layer){
    ofstream ofile(filename, ios::out | ios::trunc);
    vector<vector<vector<vector<double>>>> oweights(layers[layer]->weights);
    for(vector<vector<vector<double>>> stratg:oweights){
        for(vector<vector<double>>layeri:stratg){
            for(vector<double> neuronq:layeri){
                for(double q:neuronq){
                    ofile<<setprecision(15)<<q;
                }
            }
        }
    }
    vector<vector<vector<double>>> obiases=layers[layer]->biases;
    for(vector<vector<double>>z:obiases){
        for(vector<double> w:z){
            for(double q:w){
                ofile<<setprecision(15)<<q;
            }
        }
    }
    ofile.close();
}

void loadLayer(string filename, int nS, vector<int> layerStruct){
    vector<vector<vector<vector<double>>>> newWeights;
    vector<vector<vector<double>>> newBiases;
    ifstream ifile(filename, ios::in);
    for(int i=0; i<nS; i++){
        vector<vector<vector<double>>> netWeights;
        for(int z=1; z<layerStruct.size(); z++){
            vector<vector<double>> layerWeights;
            for(int x=0; x<layerStruct[z]; x++){
                vector<double> neuronWeights;
                for(int y=0; y<layerStruct[z-1]; y++){
                    double w;
                    ifile>>w;
                    neuronWeights.push_back(w);
                }
                layerWeights.push_back(neuronWeights);
            }
            netWeights.push_back(layerWeights);
        }
        newWeights.push_back(netWeights);
    }
    for(int i=0; i<nS; i++){
        vector<vector<double>> netBiases;
        for(int z=1; z<layerStruct.size(); z++){
            vector<double> layerBiases;
            for(int x=0; x<layerStruct[z]; x++){
                double neuronBias;
                ifile>>neuronBias;
                layerBiases.push_back(neuronBias);
            }
            netBiases.push_back(layerBiases);
        }
        newBiases.push_back(netBiases);
    }
    layers[0]->numStrats=nS;
    layers[0]->weights=newWeights;
    layers[0]->biases=newBiases;
    ifile.close();
}

Моя проблема в том, что когда предполагается писать или читать, скажем, 1,2345, он читает или пишет 0,2345, опуская самую значительную цифру. Я не знаю, связана ли проблема с функциями сохранения или загрузки. Я был бы очень признателен за любое объяснение, почему это так.

1 Ответ

2 голосов
/ 11 января 2020

Между данными, записанными в выходной файл, нет разделителей. С учетом 1,234 и 5,687

ofile<<setprecision(15)<<q;

запишет 1,2345,678 в выходной файл. Все ваши номера объединяются в один большой шарик. При обратном чтении

ifile>>w;

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

например. 1.2345.678 будет считан до 1.2345, где он найдет секунду '.'. Числа с плавающей точкой не могут иметь 2 десятичных знака (даже если это double), поэтому анализатор останавливается, оставляя 0,68 в потоке для следующего чтения и возвращает 1,2345. В следующий раз около .678 читается и возвращается как 0,678.

Самая значимая цифра теперь загадочным образом исчезла, и, поскольку double хорош только до 15 цифр, вы, вероятно, не заметите, что он был привязан к предыдущему числу как 16-е число git.

Возможное решение: запишите пробел после каждого числа.

ofile<<setprecision(15)<<q << ' ';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...