2017-03-03 4 views
0

Jetzt ist es ziemlich lange (fast zwei Monate), dass ich an FCN32 für semantische Segmentierung von Einkanalbildern arbeitete. Ich spielte mit verschiedenen Lernraten herum und fügte sogar BatchNormalization Layer hinzu. Es war mir jedoch nicht gelungen, überhaupt eine Ausgabe zu sehen. Ich hatte keine andere Wahl, als sofort um Hilfe zu bitten. Ich weiß wirklich nicht, was ich falsch mache.Was mache ich falsch mit dieser semantischen Segmentierung?

Ich sende ein Bild auf das Netzwerk als batch.This die Zug-Verlustkurve und LR=1e-9lr_policy="fixed": enter image description here

I erhöhte die Lernrate zu 1e-4 (folgenden Abbildung). Es scheint, dass der Verlust sinkt, aber die Lernkurve verhält sich nicht normal. enter image description here

I reduziert die Schichten der ursprünglichen FCN wie folgt: (1) Conv64 - relu - Conv64 - relu - MaxPool

(2) Conv128 - relu - Conv128 - relu - MaxPool

(3) Conv256 - relu - Conv256 - relu - MaxPool

(4) Conv4096 - relu - Dropout0.5

(5) Conv4096 - relu - Dropout0.5

(6) CONV2

(7) Deconv32x - Crop

(8) SoftmaxWithLoss

layer { 
    name: "data" 
    type: "Data" 
    top: "data" 
    include { 
    phase: TRAIN 
    } 
    transform_param { 
    mean_file: "/jjj/FCN32_mean.binaryproto" 
    } 

    data_param { 
    source: "/jjj/train_lmdb/" 
    batch_size: 1 
    backend: LMDB 
    } 
} 
layer { 
    name: "label" 
    type: "Data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    data_param { 
    source: "/jjj/train_label_lmdb/" 
    batch_size: 1 
    backend: LMDB 
    } 
} 
layer { 
    name: "data" 
    type: "Data" 
    top: "data" 
    include { 
    phase: TEST 
    } 
    transform_param { 
    mean_file: "/jjj/FCN32_mean.binaryproto" 
    } 
    data_param { 
    source: "/jjj/val_lmdb/" 
    batch_size: 1 
    backend: LMDB 
    } 
} 
layer { 
    name: "label" 
    type: "Data" 
    top: "label" 
    include { 
    phase: TEST 
    } 
    data_param { 
    source: "/jjj/val_label_lmdb/" 
    batch_size: 1 
    backend: LMDB 
    } 
} 

layer { 
    name: "conv1_1" 
    type: "Convolution" 
    bottom: "data" 
    top: "conv1_1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 64 
    pad: 100 
    kernel_size: 3 
    stride: 1 
    } 
} 
layer { 
    name: "relu1_1" 
    type: "ReLU" 
    bottom: "conv1_1" 
    top: "conv1_1" 
} 
layer { 
    name: "conv1_2" 
    type: "Convolution" 
    bottom: "conv1_1" 
    top: "conv1_2" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 64 
    pad: 1 
    kernel_size: 3 
    stride: 1 
    } 
} 
layer { 
    name: "relu1_2" 
    type: "ReLU" 
    bottom: "conv1_2" 
    top: "conv1_2" 
} 
layer { 
    name: "pool1" 
    type: "Pooling" 
    bottom: "conv1_2" 
    top: "pool1" 
    pooling_param { 
    pool: MAX 
    kernel_size: 2 
    stride: 2 
    } 
} 
layer { 
    name: "conv2_1" 
    type: "Convolution" 
    bottom: "pool1" 
    top: "conv2_1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 128 
    pad: 1 
    kernel_size: 3 
    stride: 1 
    } 
} 
layer { 
    name: "relu2_1" 
    type: "ReLU" 
    bottom: "conv2_1" 
    top: "conv2_1" 
} 
layer { 
    name: "conv2_2" 
    type: "Convolution" 
    bottom: "conv2_1" 
    top: "conv2_2" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 128 
    pad: 1 
    kernel_size: 3 
    stride: 1 
    } 
} 
layer { 
    name: "relu2_2" 
    type: "ReLU" 
    bottom: "conv2_2" 
    top: "conv2_2" 
} 
layer { 
    name: "pool2" 
    type: "Pooling" 
    bottom: "conv2_2" 
    top: "pool2" 
    pooling_param { 
    pool: MAX 
    kernel_size: 2 
    stride: 2 
    } 
} 
layer { 
    name: "conv3_1" 
    type: "Convolution" 
    bottom: "pool2" 
    top: "conv3_1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 256 
    pad: 1 
    kernel_size: 3 
    stride: 1 
    } 
} 
layer { 
    name: "relu3_1" 
    type: "ReLU" 
    bottom: "conv3_1" 
    top: "conv3_1" 
} 
layer { 
    name: "conv3_2" 
    type: "Convolution" 
    bottom: "conv3_1" 
    top: "conv3_2" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 256 
    pad: 1 
    kernel_size: 3 
    stride: 1 
    } 
} 
layer { 
    name: "relu3_2" 
    type: "ReLU" 
    bottom: "conv3_2" 
    top: "conv3_2" 
} 
layer { 
    name: "pool3" 
    type: "Pooling" 
    bottom: "conv3_2" 
    top: "pool3" 
    pooling_param { 
    pool: MAX 
    kernel_size: 2 
    stride: 2 
    } 
} 
layer { 
    name: "fc6" 
    type: "Convolution" 
    bottom: "pool3" 
    top: "fc6" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 4096 
    pad: 0 
    kernel_size: 7 
    stride: 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: "Convolution" 
    bottom: "fc6" 
    top: "fc7" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 4096 
    pad: 0 
    kernel_size: 1 
    stride: 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: "score_fr" 
    type: "Convolution" 
    bottom: "fc7" 
    top: "score_fr" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 5 #21 
    pad: 0 
    kernel_size: 1 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layer { 
    name: "upscore" 
    type: "Deconvolution" 
    bottom: "score_fr" 
    top: "upscore" 
    param { 
    lr_mult: 0 
    } 
    convolution_param { 
    num_output: 5 #21 
    bias_term: false 
    kernel_size: 64 
    stride: 32 
    group: 5 #2 
    weight_filler: { 
     type: "bilinear" 
    } 
    } 
} 
layer { 
    name: "score" 
    type: "Crop" 
    bottom: "upscore" 
    bottom: "data" 
    top: "score" 
    crop_param { 
    axis: 2 
    offset: 19 
    } 
} 
layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "score" 
    bottom: "label" 
    top: "accuracy" 
    include { 
    phase: TRAIN 
    } 
} 

layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "score" 
    bottom: "label" 
    top: "accuracy" 
    include { 
    phase: TEST 
    } 
} 
layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" 
    bottom: "score" 
    bottom: "label" 
    top: "loss" 
    loss_param { 
    ignore_label: 255 
    normalize: true 
    } 
} 

und dies ist die Solver-Definition:

net: "train_val.prototxt" 
#test_net: "val.prototxt" 
test_iter: 736 
# make test net, but don't invoke it from the solver itself 
test_interval: 2000 #1000000 
display: 50 
average_loss: 50 
lr_policy: "step" #"fixed" 
stepsize: 2000 #+ 
gamma: 0.1 #+ 
# lr for unnormalized softmax 
base_lr: 0.0001 
# high momentum 
momentum: 0.99 
# no gradient accumulation 
iter_size: 1 
max_iter: 10000 
weight_decay: 0.0005 
snapshot: 2000 
snapshot_prefix: "snapshot/NET1" 
test_initialization: false 
solver_mode: GPU 

Zu Beginn Der Verlust beginnt zu sinken, aber nach einigen Iterationen zeigt es kein gutes Lernverhalten: enter image description here

Ich bin ein Anfänger in Deep Learning und caffe. Ich verstehe wirklich nicht, warum das passiert. Ich schätze wirklich, wenn diejenigen, die Expertise haben, bitte sehen Sie sich die Modelldefinition an und ich werde sehr dankbar sein, wenn Sie mir helfen.

+0

Verwenden Sie vortrainierte Gewichte, um zu starten, oder trainieren Sie das Netzwerk von Grund auf (zufällige Gewichte)? –

+0

Ich trainiere eigentlich von Grund auf neu. Danke für Ihre Hilfe. –

Antwort

2

Das Problem ist, dass Sie von Grund auf neu trainieren.

die FCN paper Lesen wird Ihnen sagen, dass sie immer Netzwerke verwenden, die auf IMAGEnet vortrainierter werden, wird es NICHT Arbeit, wenn Sie es von Grund auf neu trainieren, hat es von einem vortrainierte Netzwerk finetuned werden. Das Optimierungsproblem, wenn Sie aus Zufallsgewichten trainieren, konvergiert nicht.

+0

Danke für Ihren Kommentar. Unter Bezugnahme auf diesen [link] (http://cs231n.github.io/transfer-learning/) in der Punktnummer "4" heißt es: "Der neue Datensatz ist groß und unterscheidet sich stark vom ursprünglichen Datensatz. Da der Datensatz sehr groß, können wir erwarten, dass wir es uns leisten können, ein ConvNet von Grund auf neu zu trainieren. ", und da meine Daten sich sehr vom ursprünglichen Datensatz des vortrainierten Modells unterscheiden, was wird passieren ?? Ich glaube, ich war verwirrt. Danke vielmals. –

+0

Was kann ich tun?was ist dein Vorschlag? Vielen Dank –

+0

@ S.EB Am einfachsten ist es, Ihr Netzwerk auf ein Dataset vorzubereiten, sagen Sie ImageNet für Bildklassifizierung, dann ändern Sie einen Teil der Architektur und optimieren Sie es. Wenn dies nicht möglich ist, verwenden Sie keine eigene Netzwerkarchitektur und verwenden Sie nur ein vortrainiertes Netzwerk wie VGG/ResNet. –