0

Nach einigem zu kämpfen, entschied ich mich, eine einfachste Aufgabe zu versuchen, ein Netz zu trainieren, um zu klassifizieren, wo eine Zahl nicht negtive ist. Und ich scheiterte ...Ich kann Caffe nicht arbeiten

Ich generierte die Daten mit folgendem Code. Und ich bin mir nicht sicher, ob es richtig ist. Ich las aus der Datei die Daten zurück, und es sah recht, aber ...

#pragma comment(lib, "hdf5") 
#pragma comment(lib, "hdf5_cpp") 

#include <cstdint> 

#include <array> 
#include <random> 
#include <vector> 

using namespace std; 

#include <H5Cpp.h> 

using namespace H5; 

mt19937 rng; 

float randf(float i_min, float i_max) 
{ 
    return rng() * ((i_max - i_min)/0x100000000) + i_min; 
} 

#define NAME "pos_neg" 

#define TRAIN_SET_SIZE 0x100000 
#define TEST_SET_SIZE 0x10000 

void make(const string &i_cat, uint32_t i_count) 
{ 
    H5File file(NAME "." + i_cat + ".h5", H5F_ACC_TRUNC); 

    hsize_t dataDim[2] = { i_count, 1 }; 
    hsize_t labelDim = i_count; 

    FloatType dataType(PredType::NATIVE_FLOAT); 
    DataSpace dataSpace(2, dataDim); 

    DataSet dataSet = file.createDataSet("data", dataType, dataSpace); 

    IntType labelType(PredType::NATIVE_INT); 
    DataSpace labelSpace(1, &labelDim); 

    DataSet labelSet = file.createDataSet("label", labelType, labelSpace); 

    vector<float> data(i_count); 
    vector<int> labels(i_count); 

    for (uint32_t i = 0; i < i_count/2; ++i) 
    { 
     labels[i * 2] = 0; 
     data[i * 2] = randf(0.f, 1.f); 

     labels[i * 2 + 1] = 1; 
     data[i * 2 + 1] = randf(-1.f, 0.f); 
    } 

    dataSet.write(&data[0], PredType::NATIVE_FLOAT); 
    labelSet.write(&labels[0], PredType::NATIVE_INT); 
} 

int main() 
{ 
    make("train", TRAIN_SET_SIZE); 
    make("test", TEST_SET_SIZE); 
} 

Und das Netzwerk wie dieser Ich

versuchte

name: "PosNegNet" 
layer { 
    name: "data" 
    type: "HDF5Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    hdf5_data_param { 
    source: "pos_neg_train.txt" 
    batch_size: 64 
    } 
} 
layer { 
    name: "data" 
    type: "HDF5Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TEST 
    } 
    hdf5_data_param { 
    source: "pos_neg_test.txt" 
    batch_size: 65536 
    } 
} 
layer { 
    name: "fc1" 
    type: "InnerProduct" 
    bottom: "data" 
    top: "fc1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 1 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" 
    bottom: "fc1" 
    bottom: "label" 
    top: "loss" 
} 
layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "fc1" 
    bottom: "label" 
    top: "accuracy" 
    include { 
    phase: TEST 
    } 
} 

Und und ein Satz von Parametern sieht

net: "pos_neg.prototxt" 
test_iter: 1 
test_interval: 500 
base_lr: 0.001 
momentum: 0.9 
momentum2: 0.999 
lr_policy: "fixed" 
display: 100 
max_iter: 10000 
snapshot: 5000 
snapshot_prefix: "pos_neg" 
type: "Adam" 
solver_mode: GPU 

Und ich habe caffe.exe unter Windows ausgeführt. Und ich habe immer Verlust = 0, Genauigkeit = 0,5.

Ich weiß, ich muss etwas falsch gemacht haben, aber ich weiß nicht, von wo sie suchen müssen, gut, andere als Quellcode ausgrub ...


Und ich fand, dass caffe ziemlich langsam ist . Ich habe nur etwa 16 Iterationen pro Sekunde für eine Float [64] -Daten mit 1024 Element pro Batch auf einem 1080Ti. War das normal oder habe ich wieder etwas falsch gemacht?

Antwort

1

Set num_output: 2 in Ihrem "fc1": wenn "SoftmaxWithLoss" und/oder "Accuracy" Schichten mit caffe erwartet Ihre Vorhersage von Klassenwahrscheinlichkeiten ein Vektor zu sein. In Ihrem Fall haben Sie zwei Klassen, daher sollte dieser Vektor die Länge 2 haben (und nicht 1, wie er derzeit steht).


Alternativ können Sie num_output: 1 halten und den Verlust zu "SigmoidCrossEntropyLoss" Schicht wechseln. Sie können jedoch "Accuracy" Schicht nicht mehr verwenden ...

+2

Vielen Dank! > _ << – BlueWanderer

+1

Es ist eine Warnung für mich, und ich kann in Zukunft weniger dumme Sachen machen: | – BlueWanderer

+0

@BlueWanderer, was du "dumme Dinge" nennst = aus deinen Fehlern lernen. Es ist unbezahlbar. – Shai