Ошибка указывает на сглаженные размеры при загрузке предварительно обученной сети - PullRequest
0 голосов
/ 02 ноября 2018

Вопрос

Я пытаюсь загрузить предварительно обученную сеть и получаю следующую ошибку

F1101 23: 03: 41.857909 73 net.cpp: 757] Невозможно скопировать параметры 0 весов из слоя 'fc4'; несоответствие формы. Исходная форма параметра 512 4096 (2097152); Форма целевого параметра составляет 512 256 4 4 (2097152). Чтобы узнать это параметры слоя с нуля, а не копирование из сохраненной сети, переименуйте слой.

Я заметил, что 512 x 256 x 4 x 4 == 512 x 4096, поэтому кажется, что при сохранении и перезагрузке сетевых весов слой был как-то сплющен.

Как я могу нейтрализовать эту ошибку?

Воспроизвести

Я пытаюсь использовать предварительно обученную сеть D-CNN в этом хранилище GitHub .

Я загружаю сеть с

import caffe
net = caffe.Net('deploy_D-CNN.prototxt', 'D-CNN.caffemodel', caffe.TEST)

Файл прототипа

name: "D-CNN"
input: "data"
input_dim: 10
input_dim: 3
input_dim: 259
input_dim: 259
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  convolution_param {
    num_output: 64
    kernel_size: 5
    stride: 2
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    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"
  convolution_param {
    num_output: 128
    pad: 1
    kernel_size: 3
  }
}
layer {
  name: "relu2"
  type: "ReLU"
  bottom: "conv2"
  top: "conv2"
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "conv3"
  type: "Convolution"
  bottom: "pool2"
  top: "conv3"
  convolution_param {
    num_output: 256
    pad: 1
    kernel_size: 3
    stride: 1
  }
}
layer {
  name: "relu3"
  type: "ReLU"
  bottom: "conv3"
  top: "conv3"
}
layer {
  name: "fc4"
  type: "Convolution"
  bottom: "conv3"
  top: "fc4"
  convolution_param {
    num_output: 512
    pad: 0
    kernel_size: 4
  }
}
layer {
  name: "relu4"
  type: "ReLU"
  bottom: "fc4"
  top: "fc4"
}
layer {
  name: "drop4"
  type: "Dropout"
  bottom: "fc4"
  top: "fc4"
  dropout_param {
    dropout_ratio: 0.5
  }
}
layer { 
  name: "pool5_spm3"
  type: "Pooling"
  bottom: "fc4"
  top: "pool5_spm3"
  pooling_param {
    pool: MAX
    kernel_size: 10
    stride: 10
  }
}
layer {
  name: "pool5_spm3_flatten"
  type: "Flatten"
  bottom: "pool5_spm3"
  top: "pool5_spm3_flatten"
}
layer { 
  name: "pool5_spm2"
  type: "Pooling"
  bottom: "fc4"
  top: "pool5_spm2"
  pooling_param {
    pool: MAX
    kernel_size: 14
    stride: 14
  }
}
layer {
  name: "pool5_spm2_flatten"
  type: "Flatten"
  bottom: "pool5_spm2"
  top: "pool5_spm2_flatten"
}
layer { 
  name: "pool5_spm1"
  type: "Pooling"
  bottom: "fc4"
  top: "pool5_spm1"
  pooling_param {
    pool: MAX
    kernel_size: 29
    stride: 29
  }
}
layer {
  name: "pool5_spm1_flatten"
  type: "Flatten"
  bottom: "pool5_spm1"
  top: "pool5_spm1_flatten"
}
layer {
  name: "pool5_spm"
  type: "Concat"
  bottom: "pool5_spm1_flatten"
  bottom: "pool5_spm2_flatten"
  bottom: "pool5_spm3_flatten"
  top: "pool5_spm"
  concat_param {
    concat_dim: 1
  }
}


layer {
  name: "fc4_2"
  type: "InnerProduct"
  bottom: "pool5_spm"
  top: "fc4_2"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 512
    weight_filler {
      type: "gaussian"
      std: 0.005
    }
    bias_filler {
      type: "constant"
      value: 0.1
    }
  }
}
layer {
  name: "relu4"
  type: "ReLU"
  bottom: "fc4_2"
  top: "fc4_2"
}
layer {
  name: "drop4"
  type: "Dropout"
  bottom: "fc4_2"
  top: "fc4_2"
  dropout_param {
    dropout_ratio: 0.5
  }
}

layer {
  name: "fc5"
  type: "InnerProduct"
  bottom: "fc4_2"
  top: "fc5"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 19
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "prob"
  type: "Softmax"
  bottom: "fc5"
  top: "prob"
}

1 Ответ

0 голосов
/ 05 марта 2019

Кажется, что вы берете предварительно обученную сеть, где слой "fc4" был полностью соединенным слоем (он же type: "InnerProduct" слой), и он был "преобразован" в сверточный слой.
Поскольку как внутренний продуктовый слой, так и сверточный слой выполняют примерно одинаковую линейную операцию на входах, это изменение может быть сделано при определенных допущениях (см., Например, здесь ).
Как вы уже правильно определили, веса исходного предварительно обученного полностью связанного слоя были сохранены «выровненными» с формой, которую кафе ожидает для сверточного слоя.

Я думаю, что решением этой проблемы может быть использование share_mode: PERMISSIVE:

layer {
  name: "fc4"
  type: "Convolution"
  bottom: "conv3"
  top: "fc4"
  convolution_param {
    num_output: 512
    pad: 0
    kernel_size: 4
  }
  param {
    lr_mult: 1
    decay_mult: 1
    share_mode: PERMISSIVE  # should help caffe overcome the shape mismatch
  }
  param {
    lr_mult: 2
    decay_mult: 0
    share_mode: PERMISSIVE
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...