2

Я совершенно новый в кафе и в глубоком обучении. Я просто пытаюсь внедрить архитектуру глубокого обучения. ArchitectureВнедрение архитектуры глубокого обучения с данным набором данных

Это архитектура, которую я пытаюсь реализовать. Архитектура и набор данных Parse27k были созданы и построены Группа компьютерного зрения в Visual Computing Institute, RWTH Aachen University.

Ниже вы можете увидеть мои модели, которые мне нужно улучшить:

Train_val.prototxt

name: "Parse27" 
layer { 
    name: "data" 
    type: "HDF5Data" 
    top: "crops" 
    top: "labels" 
    include { 
    phase: TRAIN 
    } 

    hdf5_data_param { 
    source: "/home/nail/caffe/caffe/examples/hdf5_classification/data/train.txt" 
    batch_size: 256 
    } 
} 
layer { 
    name: "data" 
    type: "HDF5Data" 
    top: "crops" 
    top: "labels" 
    include { 
    phase: TEST 
    } 
    hdf5_data_param { 
    source: "/home/nail/caffe/caffe/examples/hdf5_classification/data/test.txt" 
    batch_size: 256 
    } 
} 
layer { 
    name: "conv1" 
    type: "Convolution" 
    bottom: "crops" 
    top: "conv1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 96 
    kernel_size: 11 
    stride: 4 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "relu1" 
    type: "ReLU" 
    bottom: "conv1" 
    top: "conv1" 
} 
layer { 
    name: "pool1" 
    type: "Pooling" 
    bottom: "conv1" 
    top: "pool1" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 2 
    } 
} 
layer { 
    name: "norm1" 
    type: "LRN" 
    bottom: "pool1" 
    top: "norm1" 
    lrn_param { 
    local_size: 5 
    alpha: 0.0001 
    beta: 0.75 
    } 
} 
layer { 
    name: "conv2" 
    type: "Convolution" 
    bottom: "norm1" 
    top: "conv2" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 256 
    pad: 2 
    kernel_size: 5 
    group: 2 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 1 
    } 
    } 
} 
layer { 
    name: "relu2" 
    type: "ReLU" 
    bottom: "conv2" 
    top: "conv2" 
} 
layer { 
    name: "pool2" 
    type: "Pooling" 
    bottom: "conv2" 
    top: "pool2" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 2 
    } 
} 
layer { 
    name: "norm2" 
    type: "LRN" 
    bottom: "pool2" 
    top: "norm2" 
    lrn_param { 
    local_size: 5 
    alpha: 0.0001 
    beta: 0.75 
    } 
} 
layer { 
    name: "conv3" 
    type: "Convolution" 
    bottom: "norm2" 
    top: "conv3" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 384 
    pad: 1 
    kernel_size: 3 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "relu3" 
    type: "ReLU" 
    bottom: "conv3" 
    top: "conv3" 
} 
layer { 
    name: "conv4" 
    type: "Convolution" 
    bottom: "conv3" 
    top: "conv4" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 384 
    pad: 1 
    kernel_size: 3 
    group: 2 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 1 
    } 
    } 
} 
layer { 
    name: "relu4" 
    type: "ReLU" 
    bottom: "conv4" 
    top: "conv4" 
} 
layer { 
    name: "conv5" 
    type: "Convolution" 
    bottom: "conv4" 
    top: "conv5" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 256 
    pad: 1 
    kernel_size: 3 
    group: 2 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 1 
    } 
    } 
} 
layer { 
    name: "relu5" 
    type: "ReLU" 
    bottom: "conv5" 
    top: "conv5" 
} 
layer { 
    name: "pool5" 
    type: "Pooling" 
    bottom: "conv5" 
    top: "pool5" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 2 
    } 
} 
layer { 
    name: "fc6" 
    type: "InnerProduct" 
    bottom: "pool5" 
    top: "fc6" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 4096 
    weight_filler { 
     type: "gaussian" 
     std: 0.005 
    } 
    bias_filler { 
     type: "constant" 
     value: 1 
    } 
    } 
} 
layer { 
    name: "relu6" 
    type: "ReLU" 
    bottom: "fc6" 
    top: "fc6" 
} 
layer { 
    name: "drop6" 
    type: "Dropout" 
    bottom: "fc6" 
    top: "fc6" 
    dropout_param { 
    dropout_ratio: 0.5 
    } 
} 
layer { 
    name: "fc7" 
    type: "InnerProduct" 
    bottom: "fc6" 
    top: "fc7" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 4096 
    weight_filler { 
     type: "gaussian" 
     std: 0.005 
    } 
    bias_filler { 
     type: "constant" 
     value: 1 
    } 
    } 
} 
layer { 
    name: "relu7" 
    type: "ReLU" 
    bottom: "fc7" 
    top: "fc7" 
} 
layer { 
    name: "drop7" 
    type: "Dropout" 
    bottom: "fc7" 
    top: "fc7" 
    dropout_param { 
    dropout_ratio: 0.5 
    } 
} 
layer { 
    name: "fc8" 
    type: "InnerProduct" 
    bottom: "fc7" 
    top: "fc8" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 1000 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "fc8" 
    bottom: "labels" 
    top: "accuracy" 
    include { 
    phase: TEST 
    } 
} 
layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" 
    bottom: "fc8" 
    bottom: "labels" 
    top: "loss" 
} 

Solver.prototxt

net: "models/Parse27/train_val.prototxt" 
test_iter: 1000 
test_interval: 1000 
base_lr: 0.01 
lr_policy: "step" 
gamma: 0.1 
stepsize: 100000 
display: 20 
max_iter: 450000 
momentum: 0.9 
weight_decay: 0.0005 
snapshot: 10000 
snapshot_prefix: "models/Parse27/Parse27_train" 
solver_mode: GPU 

У меня есть 2 основные трудности в реализации этой архитектуры.

  1. Как видно выше, моя модель не включает слой пользовательских потерь. Моя модель - почти архитектура caffeNet. Но я должен заменить свой последний слой, который находится внутри красного ящика с пользовательским слоем потерь (зеленый квадрат).

  2. Мой набор данных поезда имеет следующую структуру.

crops  Dataset {27482, 3, 128, 192} 
labels  Dataset {27482, 12} 
mean  Dataset {3, 128, 192} 
pids  Dataset {27482} 

Как видно здесь количество строк (примеры) в посевах и в метках такого же 27482. Однако у меня есть 12 столбцов в моих наборах данных этикеток. И моя модель работает, когда есть только 1 ярлык. Как я могу заставить его тренироваться для всех лейблов?

Моя модель в Train_val.prototxt выглядит как это сейчас:

enter image description here

Любой вид помощи или предложения будут высоко оценены.

ответ

2

Если вы правильно поняли, вы пытаетесь предсказать 12 дискретных меток (атрибутов) для каждого примера ввода. В этом случае, вы должны "Slice" этикетки:

layer { 
    type: "Slice" 
    name: "slice_labels" 
    bottom: "label" 
    top: "attr_00" 
    top: "attr_01" 
    top: "attr_02" 
    top: "attr_03" 
    top: "attr_04" 
    top: "attr_05" 
    top: "attr_06" 
    top: "attr_07" 
    top: "attr_08" 
    top: "attr_09" 
    top: "attr_10" 
    top: "attr_11" 
    slice_param { 
    axis: -1 # slice the last dimension 
    slice_point: 1 
    slice_point: 2 
    slice_point: 3 
    slice_point: 4 
    slice_point: 5 
    slice_point: 6 
    slice_point: 7 
    slice_point: 8 
    slice_point: 9 
    slice_point: 10 
    slice_point: 11 
    } 
} 

Теперь у вас есть «скаляр» ярлык для каждого атрибута. Я верю, что вы можете взять это отсюда.

+0

Я получаю такое сообщение об ошибке, когда выполняю его F1101 14: 11: 12.764832 7023 layer.hpp: 374] Check failed: ExactNumBottomBlobs() == bottom.size() (2 против 13) Точность слоя принимает в качестве входного сигнала 2 нижних блока (блоков). Я даже попытался отправить только один из атрибутов на потерю и fc8 по-прежнему той же ошибкой. ссылка на изображение https://postimg.org/image/3yh66h8fp/ модель prototxt документ http://codepad.org/GfsLcWqn – MIRMIX

+0

@MIRMIX посмотреть на модели, публикуемую: https: //i.stack.imgur .com/B7Cmq.png. Как вы можете видеть, у вас есть ** другой уровень потери (и точности) ** для каждого атрибута.У вас не может быть одного слоя для всех атрибутов. Работайте в соответствии с планом, который вы пытаетесь реализовать. – Shai

+0

Я получил его, но все еще, как я упоминал, даже когда я пытаюсь сделать это для одного атрибута, он снова получает сообщение об ошибке. https://postimg.org/image/xrqzhgzz7/ Должен ли он работать хотя бы на один ярлык? – MIRMIX

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