2016-06-22 4 views
1

У меня есть обученная сеть caffe для проблемы 2class и вы хотите проверить выходную мощность для одной информации. Поэтому я запускаю классификацию следующим образом:Deep Learning caffe - классификация данных приводит к NaN

proto = 'deploy.prototxt' 
model = 'snapshot_iter_4000.caffemodel' 
net = caffe.Net(proto, model, caffe.TEST) 

# get image from database to variable "image" 
out = net.forward_all(data=image) 
print out 
>> {'prob': array([[ nan, nan], 
    [ nan, nan]], dtype=float32)} 

Я посмотрел на выход для обучения; Я видел, что точность никогда не улучшается (это всегда около 0,48). Я проверил все входные данные lmdb, в нем нет данных, содержащих NaN. Более того, я всегда тренирую несколько классификаторов с одним и тем же набором данных, и они работают так, как ожидалось.

Неужели кто-нибудь столкнулся с этой проблемой? Существуют ли некоторые численные неустойчивости, известные для caffe?

Был бы рад, если кто-то может мне помочь! Спасибо =)

Это solver.prototxt я использовал для всех сетей:

test_iter:100 
test_interval:100 
base_lr: 0.03 
display:50 
max_iter: 6000 
lr_policy: "step" 
gamma: 0.1 
momentum:0.9 
weight_decay:0.0005 
stepsize: 2000 
snapshot:2000 
snapshot_prefix:"snapshot" 
solver_mode:GPU 
net:"train_val.prototxt" 
solver_type:SGD 

и чистая архитектура (которая является AlexNet):

layer { 
    name: "data" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    transform_param { 
    mirror: true 
    crop_size: 70 
    } 
    data_param { 
    source: "./dataset/train_db" 
    batch_size: 300 
    backend: LMDB 
    } 
} 
layer { 
    name: "data" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TEST 
    } 
    transform_param { 
    crop_size: 70 
    } 
    data_param { 
    source: "./dataset/val_db" 
    batch_size: 300 
    backend: LMDB 
    } 
} 

layer { 
    name: "conv1" 
    type: "Convolution" 
    bottom: "data" 
    top: "conv1" 
    param { 
    lr_mult: 1.0 
    decay_mult: 1.0 
    } 
    param { 
    lr_mult: 2.0 
    decay_mult: 0.0 
    } 
    convolution_param { 
    num_output: 96 
    kernel_size: 11 
    stride: 4 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.0 
    } 
    } 
} 
layer { 
    name: "relu1" 
    type: "ReLU" 
    bottom: "conv1" 
    top: "conv1" 
} 
layer { 
    name: "norm1" 
    type: "LRN" 
    bottom: "conv1" 
    top: "norm1" 
    lrn_param { 
    local_size: 5 
    alpha: 0.0001 
    beta: 0.75 
    } 
} 
layer { 
    name: "pool1" 
    type: "Pooling" 
    bottom: "norm1" 
    top: "pool1" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 1 
    } 
} 
layer { 
    name: "conv2" 
    type: "Convolution" 
    bottom: "pool1" 
    top: "conv2" 
    param { 
    lr_mult: 1.0 
    decay_mult: 1.0 
    } 
    param { 
    lr_mult: 2.0 
    decay_mult: 0.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: 0.1 
    } 
    } 
} 
layer { 
    name: "relu2" 
    type: "ReLU" 
    bottom: "conv2" 
    top: "conv2" 
} 
layer { 
    name: "norm2" 
    type: "LRN" 
    bottom: "conv2" 
    top: "norm2" 
    lrn_param { 
    local_size: 5 
    alpha: 0.0001 
    beta: 0.75 
    } 
} 
layer { 
    name: "pool2" 
    type: "Pooling" 
    bottom: "norm2" 
    top: "pool2" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 2 
    } 
} 
layer { 
    name: "conv3" 
    type: "Convolution" 
    bottom: "pool2" 
    top: "conv3" 
    param { 
    lr_mult: 1.0 
    decay_mult: 1.0 
    } 
    param { 
    lr_mult: 2.0 
    decay_mult: 0.0 
    } 
    convolution_param { 
    num_output: 384 
    pad: 1 
    kernel_size: 3 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.0 
    } 
    } 
} 
layer { 
    name: "relu3" 
    type: "ReLU" 
    bottom: "conv3" 
    top: "conv3" 
} 
layer { 
    name: "conv4" 
    type: "Convolution" 
    bottom: "conv3" 
    top: "conv4" 
    param { 
    lr_mult: 1.0 
    decay_mult: 1.0 
    } 
    param { 
    lr_mult: 2.0 
    decay_mult: 0.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: 0.1 
    } 
    } 
} 
layer { 
    name: "relu4" 
    type: "ReLU" 
    bottom: "conv4" 
    top: "conv4" 
} 
layer { 
    name: "conv5" 
    type: "Convolution" 
    bottom: "conv4" 
    top: "conv5" 
    param { 
    lr_mult: 1.0 
    decay_mult: 1.0 
    } 
    param { 
    lr_mult: 2.0 
    decay_mult: 0.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: 0.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.0 
    decay_mult: 1.0 
    } 
    param { 
    lr_mult: 2.0 
    decay_mult: 0.0 
    } 
    inner_product_param { 
    num_output: 4096 
    weight_filler { 
     type: "gaussian" 
     std: 0.005 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.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.0 
    decay_mult: 1.0 
    } 
    param { 
    lr_mult: 2.0 
    decay_mult: 0.0 
    } 
    inner_product_param { 
    num_output: 4096 
    weight_filler { 
     type: "gaussian" 
     std: 0.005 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.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.0 
    decay_mult: 1.0 
    } 
    param { 
    lr_mult: 2.0 
    decay_mult: 0.0 
    } 
    inner_product_param { 
    num_output: 2 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.0 
    } 
    } 
} 


layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" 
    bottom: "fc8" 
    bottom: "label" 
    top: "loss" 
} 
layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "fc8" 
    bottom: "label" 
    top: "accuracy" 
    include { 
    phase: TEST 
    } 
} 
+0

Возможно ли, что у вас есть 'nan' in ''snapshot_iter_4000.caffemodel''? – Shai

+1

Следуйте за этой страницей (http://stackoverflow.com/q/33962226/1714410). – Shai

ответ

1

Обновление:

Из комментариев, полученных в ответ на мой ответ, причина, по которой в NaN привела к вопросу о том, что:

Шкала top: "data" в слое Data равна [0, 255], а начальная скорость обучения - base_lr: 0.03, которая слишком велика для масштаба входных данных и, следовательно, приводит к расхождению.

Нормализация top: "data" на [0, 1] в Data слое решить эту проблему:

transform_param { 
    mirror: true 
    scale: 0.00390625 
    crop_size: 70 
} 

Нань более возможно, указывает на учебную расходимость в вашем случае, что означает тренировку не сходящиеся (это указывается вашей точностью 0,48 для классификации 2 класса). Поскольку ваш входной файл lmdb работал раньше, причина в том, что у вас слишком большой уровень обучения, что слишком сильно обновляло параметры модели во время обучения и, следовательно, приводило к количеству NAN. Таким образом, вы можете просто попробовать меньшую скорость обучения, например, в 10 раз меньше, пока ваша тренировка не будет работать.
Кроме того, нить, предоставленная @Shai in the comment above, также очень хороша.

+0

Извините, я был неточен. Я использовал те же самые параметры тренировки (solver.prototxt) с одним и тем же набором данных. Таким образом, скорость обучения (которая была фактически 0,03) не должна быть проблемой. Однако я не использую пользовательский Losslayer, и я проверил входы для NaN. Что я обнаружил, так это то, что я получаю классификаторы с точностью ~ 50% даже без NaN для ок. 1 из 50 классификаторов. Поэтому я подумал, может быть, когда я использую Stochastic Gradient Descent - случайная инициализация была проблемой. Как вы думаете об этом? –

+0

Является ли сеть. prototxt тоже то же самое? – Dale

+0

Да, я использую ту же настройку caffe для всех классификаторов –

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