Caffe: точность железнодорожной сети = 1 константа! Точность вопроса
Прямо сейчас я работаю в сети с данными 2 классов... но точность постоянна 1 после первой итерации!
Входные данные - изображения в градациях серого. оба изображения класса выбираются случайным образом при создании HDF5Data.
Почему это случилось? Что не так или где ошибка!
network.prototxt:
name: "brainMRI"
layer {
name: "data"
type: "HDF5Data"
top: "data"
top: "label"
include: {
phase: TRAIN
}
hdf5_data_param {
source: "/home/shivangpatel/caffe/brainMRI1/train_file_location.txt"
batch_size: 10
}
}
layer {
name: "data"
type: "HDF5Data"
top: "data"
top: "label"
include: {
phase: TEST
}
hdf5_data_param {
source: "/home/shivangpatel/caffe/brainMRI1/test_file_location.txt"
batch_size: 10
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 20
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 50
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool2"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 2
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "softmax"
type: "Softmax"
bottom: "ip2"
top: "smip2"
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "smip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
Выход:
I0217 17:41:07.912580 2913 net.cpp:270] This network produces output loss I0217 17:41:07.912607 2913 net.cpp:283] Network initialization done. I0217 17:41:07.912739 2913 solver.cpp:60] Solver scaffolding done. I0217 17:41:07.912789 2913 caffe.cpp:212] Starting Optimization I0217 17:41:07.912813 2913 solver.cpp:288] Solving brainMRI I0217 17:41:07.912832 2913 solver.cpp:289] Learning Rate Policy: inv I0217 17:41:07.920737 2913 solver.cpp:341] Iteration 0, Testing net (#0) I0217 17:41:08.235076 2913 solver.cpp:409] Test net output #0: accuracy = 0.98 I0217 17:41:08.235194 2913 solver.cpp:409] Test net output #1: loss = 0.0560832 (* 1 = 0.0560832 loss) I0217 17:41:35.831647 2913 solver.cpp:341] Iteration 100, Testing net (#0) I0217 17:41:36.140849 2913 solver.cpp:409] Test net output #0: accuracy = 1 I0217 17:41:36.140949 2913 solver.cpp:409] Test net output #1: loss = 0.00757247 (* 1 = 0.00757247 loss) I0217 17:42:05.465395 2913 solver.cpp:341] Iteration 200, Testing net (#0) I0217 17:42:05.775877 2913 solver.cpp:409] Test net output #0: accuracy = 1 I0217 17:42:05.776000 2913 solver.cpp:409] Test net output #1: loss = 0.0144996 (* 1 = 0.0144996 loss) ............. .............
1 ответ
Обобщая некоторую информацию из комментариев:
- Вы запускаете тестирование с интервалами test_interval:100
итераций.
- Каждый интервал испытаний проходит test_iter:5
* batch_size:10
= 50 образцов.
- Ваш поезд и наборы тестов кажутся очень плохими: все отрицательные образцы (метка =0) сгруппированы вместе перед всеми положительными образцами.
Рассмотрим ваш SGD итеративный решатель, вы кормите его партиями batch_size:10
во время тренировки. Ваш тренировочный набор имеет 14746 отрицательных образцов (то есть 1474 партии) перед любым положительным образцом. Таким образом, для первых 1474 итераций ваш решатель "видит" только отрицательные примеры, а не положительные.
Что вы ожидаете, что этот решатель узнает?
Эта проблема
Ваш решатель видит только отрицательные примеры, и, следовательно, узнает, что независимо от того, что является вводом, он должен вывести "0". Ваш набор тестов также заказывается таким же образом, поэтому, тестируя только 50 образцов в каждом test_interval, вы тестируете только отрицательные примеры в наборе тестов, в результате чего получается идеальная точность 1.
Но, как вы заметили, ваша сеть фактически ничему не научилась.
Решение
Я полагаю, вы уже догадались, каким должно быть решение к настоящему времени. Вы должны перетасовать свой тренировочный набор и проверить свою сеть на всем своем тестовом наборе.