Multilabel EuclideanLoss problem

24 views
Skip to first unread message

John Titor

unread,
Aug 26, 2019, 6:23:57 AM8/26/19
to Caffe Users
Hello, i've wrote the EuclideanMultilabel layer (It is the pure copy of EuclideanLoss layer except, that it has no restriction about labels). , also i reworked memory_data_layer to have opportunity input multiple label (i ve coppied realisation from here https://github.com/kevinlin311tw/caffe-multilabel/blob/master/src/caffe/layers/memory_data_layer.cpp. So with this , i have a model file :

name: "XOR"
layer
{
  name
: "inputdata"
  type
: "MemoryData"
  top
: "fulldata"
  top
: "label"
  include
{
    phase
: TRAIN
 
}
  memory_data_param
 
{
    label_size
: 2
    batch_size
: 64
    channels
: 1  
    height
: 1
    width
: 2
 
}
}
layer
{
  name
: "test_inputdata"
  type
: "MemoryData"
  top
: "fulldata"
  top
: "label"
  include
{
    phase
: TEST
 
}
  memory_data_param
 
{
    label_size
: 2
    batch_size
: 4
    channels
: 1
    height
: 1
    width
: 2
 
}
}
layer
{
  name
: "fc6"
  type
: "InnerProduct"
  bottom
: "fulldata"
  top
: "fc6"
  inner_product_param
{
    num_output
: 20
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}

layer
{
  name
: "fc7"
  type
: "InnerProduct"
  bottom
: "fc6"
  top
: "fc7"
  inner_product_param
{
    num_output
: 2
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}

layer
{
  name
: "output"
  bottom
: "fc7"
 top
: "output"
  type
: "AbsVal"
  include
{
    phase
: TEST
 
}
}

layer
{
  name
: "loss"
  type
: "MultiLabelEuclideanLoss"
  bottom
: "fc7"
  bottom
: "label"
  top
: "loss"
}


And train with this code cpp :

#include <caffe/caffe.hpp>
#include <memory>
#include "caffe/layers/memory_data_layer.hpp"

int main()
{
   
float *data = new float[64*1*1*3*400];
   
float *label = new float[64*1*1*3*400];


   
for(int i = 0; i<64*1*1*400; ++i)
   
{
       
int a = rand() % 2;
       
int b = rand() % 2;
        data
[i*2 + 0] = a;
        data
[i*2 + 1] = b;
        label
[i*2] = a + b;
        label
[i*2+1] = a *b ;
       
//label[i*2 + 1] = a *b;
   
}

    caffe
::SolverParameter solver_param;
    caffe
::ReadSolverParamsFromTextFileOrDie("solver.prototxt", &solver_param);

    boost
::shared_ptr<caffe::Solver<float> > solver(caffe::SolverRegistry<float>::CreateSolver(solver_param));
    caffe
::MemoryDataLayer<float> *dataLayer_trainnet = (caffe::MemoryDataLayer<float> *) (solver->net()->layer_by_name("inputdata").get());
    caffe
::MemoryDataLayer<float> *dataLayer_testnet_ = (caffe::MemoryDataLayer<float> *) (solver->test_nets()[0]->layer_by_name("test_inputdata").get());

   
float testab[] = {1, 1, 100 , 100, 500, 100, 1, 5};
   
float testc[] = {0, 1, 1, 0};

    dataLayer_testnet_
->Reset(testab, testc, 4);
    dataLayer_trainnet
->Reset(data, label, 25600);

    solver
->Solve();

    boost
::shared_ptr<caffe::Net<float> > testnet;

    testnet
.reset(new caffe::Net<float>("model.prototxt", caffe::TEST, caffe::Caffe::GetDefaultDevice()));
   
//testnet->CopyTrainedLayersFrom("XOR_iter_5000000.caffemodel");

    testnet
->ShareTrainedLayersWith(solver->net().get());

    caffe
::MemoryDataLayer<float> *dataLayer_testnet = (caffe::MemoryDataLayer<float> *) (testnet->layer_by_name("test_inputdata").get());

    dataLayer_testnet
->Reset(testab, testc, 4);
    testnet
->Forward();

    boost
::shared_ptr<caffe::Blob<float> > output_layer = testnet->blob_by_name("output");

   
const float* begin = output_layer->cpu_data();
   
const float* end = begin + 8;

    std
::vector<float> result(begin, end);

    std
::cout << std::endl;
   
for(int i = 0; i< result.size(); ++i)
   
{
        std
::cout << " I [" << i << "] RESULT : " << result[i] << "\n";
       
//printf("input: %d xor %d,  truth: %f result by nn: %f\n", (int)testab[i*2 + 0], (int)testab[i*2+1], testc[i], result[i]);
   
}

   
return 0;
}

Trying to approximazi a*b / a+b funcs  , but i just get :
 I [0] RESULT : 4.00305 // a+b
 I
[1] RESULT : 3.82771 // a* b
 I
[2] RESULT : 3.98262
 I
[3] RESULT : 3.85999
 I
[4] RESULT : 3.9721
 I
[5] RESULT : 3.87661
 I
[6] RESULT : 3.96224
 I
[7] RESULT : 3.89219

What am i doing wrong , or how to make euclidean multilabel loss ( i mean like (data -> labels(like 15 65)) .
Reply all
Reply to author
Forward
0 new messages