0

У меня есть полностью convotuional сеть для оценки глубины, как это: (только верхние и нижние слои для простоты):Caffe потеря слой, средний и точность

# input: image and depth_image 
layer { 
    name: "train-data" 
    type: "Data" 
    top: "data" 
    top: "silence_1" 
    include { 
    phase: TRAIN 
    } 
    transform_param { 
    #mean_file: "mean_train.binaryproto" 
    scale: 0.00390625 
    } 
    data_param { 
     source: "/train_lmdb" 
    batch_size: 4 
    backend: LMDB 
    } 
} 
layer { 
    name: "train-depth" 
    type: "Data" 
    top: "depth" 
    top: "silence_2" 
    include { 
    phase: TRAIN 
    } 
    transform_param { 
    scale: 0.00390625 
    } 
    data_param { 
    source: "train_depth_lmdb" 
    batch_size: 4 
    backend: LMDB 
    } 
} 
layer { 
    name: "val-data" 
    type: "Data" 
    top: "data" 
    top: "silence_1" 
    include { 
    phase: TEST 
    } 
    transform_param { 
    #mean_file: "mean_val.binaryproto" 
    scale: 0.00390625 
    } 
    data_param { 
    source: "val_lmdb" 
    batch_size: 4 
    backend: LMDB 
    } 
} 
layer { 
    name: "val-depth" 
    type: "Data" 
    top: "depth" 
    top: "silence_2" 
    include { 
    phase: TEST 
    } 
    transform_param { 
    scale: 0.00390625 
    } 
    data_param { 
    source: "val_depth_lmdb" 
    batch_size: 4 
    backend: LMDB 
    } 
} 
################## Silence unused labels ################## 
layer { 
    name: "silence_layer_1" 
    type: "Silence" 
    bottom: "silence_1" 
} 

layer { 
    name: "silence_layer_2" 
    type: "Silence" 
    bottom: "silence_2" 
} 
.... 
layer { 
    name: "conv" 
    type: "Convolution" 
    bottom: "concat" 
    top: "conv" 
    convolution_param { 
     num_output: 1 
     kernel_size: 5 
     pad: 2 
     stride: 1 
     engine: CUDNN 
     weight_filler { 
      type: "gaussian" 
      std: 0.01 
     } 
     bias_filler { 
      type: "constant" 
      value: 0 
     } 
    } 
} 

layer { 
    name: "relu" 
    type: "ReLU" 
    bottom: "conv" 
    top: "result" 
    relu_param{ 
    negative_slope: 0.01 
     engine: CUDNN 
    } 
} 

# Error 
layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "result" 
    bottom: "depth" 
    top: "accuracy" 
    include { 
    phase: TEST 
    } 
} 
layer { 
    name: "loss" 
    type: "EuclideanLoss" 
    bottom: "result" 
    bottom: "depth" 
    top: "loss" 
} 

Теперь у меня есть 3 вопроса:

Когда я тренирую сеть, уровень точности всегда 1. Я не понимаю, почему?

Является ли EuclideanLayer правильным слоем для этой цели?

Является ли это необходимым в таком случае или я могу пренебречь средним значением?

#Define image transformers 
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) 
transformer.set_mean('data', mean_array) 
transformer.set_transpose('data', (2,0,1)) 

image = "test.png" 

img = caffe.io.load_image(image, False) 

img = caffe.io.resize_image(img, (IMAGE_WIDTH, IMAGE_HEIGHT)) 

net.blobs['data'].data[...] = transformer.preprocess('data', img) 

pred = net.forward() 

output_blob = pred['result'] 
+0

Возможно, вы отметили это как «глубокое обучение»? – MSalters

+0

да простите, я отредактировал его – thigi

ответ

1
  1. Точность всегда 1 - см this answer.
  2. "EuclideanLoss" слой подходит для регрессии.
  3. Вычитание среднего должно помочь сети сходиться лучше. Продолжайте использовать его. Вы можете больше узнать о важности нормализации данных и о том, что можно сделать в этом отношении here.
+0

Моя проблема в том, что если я использую среднее значение, я получаю черные изображения в качестве вывода. – thigi

+0

все нулевые изображения? @thigi – Shai

+0

Да, это действительно странно. Я добавлю для себя свой prediction.py. Все выходные значения для моего предсказания становятся отрицательными, если я использую среднее значение. – thigi

Смежные вопросы