CNN не изучает простые геометрические образцы - PullRequest
0 голосов
/ 09 апреля 2019

Это, должно быть, очень глупый вопрос, но, поскольку у меня недостаточно информации о хранилище уступов, и у меня больше нет времени искать ответ, я должен поставить его здесь, чтобы попросить о помощи.Я создал учебный набор данных изображений простых геометрических форм в виде треугольников, квадратов, ромбов и т. Д. По программам и построил CNN с двумя сверточными слоями и одним объединяющим слоем, а также последний полностью связанный слой для изучения классификаций этих форм.Но сеть просто не научилась этому.Я имею в виду, что потеря просто не уменьшается.В чем причина?

В Caffe файл конфигурации нейронной сети "very_simple_one.prototxt" выглядит следующим образом:

name: "very_simple_one"
layer {
  ##name: "input"
  name: "data"
  ##type: "Input"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mean_file: "images/train_valid_lmdb_mean.binaryproto"
  }
  data_param {
    source: "images/train_valid_lmdb"
    batch_size: 1000
    backend: LMDB
  }
  input_param {
    shape {
      dim: 1
      dim: 3
      dim: 200
      dim: 200
    }
  }
}
layer {
  ##name: "input"
  name: "data"
  ##type: "Input"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mean_file: "images/train_valid_lmdb_mean.binaryproto"
  }
  data_param {
    source: "images/test_lmdb"
    batch_size: 100
    backend: LMDB
  }
  input_param {
    shape {
      dim: 1
      dim: 3
      dim: 200
      dim: 200
    }
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 5
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 5
    stride: 5
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  convolution_param {
    num_output: 3
    kernel_size: 8
    stride: 8
  }
}
layer {
  name: "relu2"
  type: "ReLU"
  bottom: "conv2"
  top: "conv2"
}
layer {
  name: "fc3"
  type: "InnerProduct"
  bottom: "conv2"
  top: "fc3"
  inner_product_param {
    num_output: 3
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "fc3"
  bottom: "label"
}

"solver.prototxt" выглядит следующим образом:

net: "very_simple_one.prototxt"
type: "SGD"
test_iter: 15
test_interval: 100
base_lr: 0.05
lr_policy: "step"
gamma: 0.9999
stepsize: 100
display: 20
max_iter: 50000
snapshot: 2000
momentum: 0.9
weight_decay: 0.00000000000
solver_mode: GPU

Также попробовал AdaGrad, прокомментировав «импульс» и изменив «тип» на AdaGrad.Обучите эту сеть командой:

....../caffe/build/tools/caffe train -solver solver.prototxt

Все не смогли обучиться.Я имею в виду, что потеря просто не уменьшается.Потеря колеблется в очень очень небольшом интервале, но никогда не уменьшается.

Просто удивляйтесь, не определен ли набор данных для обучения или что-то не так с моими конфигурационными файлами, перечисленными выше?

Я также изменил сеть в соответствии с тем, что сказал Ибрагим Юсуф, заменив объединяющий слой в качестве сверточного слоя следующим образом:

name: "very_simple_one"
layer {
  ##name: "input"
  name: "data"
  ##type: "Input"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mean_file: "images/train_valid_lmdb_mean.binaryproto"
  }
  data_param {
    source: "images/train_valid_lmdb"
    batch_size: 1000
    backend: LMDB
  }
  input_param {
    shape {
      dim: 1
      dim: 3
      dim: 200
      dim: 200
    }
  }
}
layer {
  ##name: "input"
  name: "data"
  ##type: "Input"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mean_file: "images/train_valid_lmdb_mean.binaryproto"
  }
  data_param {
    source: "images/test_lmdb"
    batch_size: 100
    backend: LMDB
  }
  input_param {
    shape {
      dim: 1
      dim: 3
      dim: 200
      dim: 200
    }
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  convolution_param {
    num_output: 50
    kernel_size: 5
    ##stride: 5
    stride: 2
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
layer {
  name: "conv1.5"
  type: "Convolution"
  bottom: "conv1"
  top: "conv1.5"
  convolution_param {
    num_output: 10
    kernel_size: 5
    stride: 2
  }
}
layer {
  name: "relu1.5"
  type: "ReLU"
  bottom: "conv1.5"
  top: "conv1.5"
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "conv1.5"
  top: "conv2"
  convolution_param {
    num_output: 3
    kernel_size: 8
    stride: 4
  }
}
layer {
  name: "relu2"
  type: "ReLU"
  bottom: "conv2"
  top: "conv2"
}
layer {
  name: "fc3"
  type: "InnerProduct"
  bottom: "conv2"
  top: "fc3"
  inner_product_param {
    num_output: 3
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "fc3"
  bottom: "label"
}

Но потери все равно не уменьшаются.Должен ли я подтвердить, что причиной является мой набор данных?И мой набор данных действительно очень маленький, и если кто-нибудь может мне помочь, я могу загрузить его куда-нибудь на сетевой диск, чтобы загрузить его для тестирования.

1 Ответ

0 голосов
/ 11 мая 2019

решаемая.Метки для классификации должны начинаться с нуля, а не с одного, например 0, 1, 2 для трех задач классификации, а не 1, 2, 3.

...