【问题标题】:Accuracy does not change精度不变
【发布时间】:2018-05-09 07:35:00
【问题描述】:

我正在尝试在 caffe 中训练一个二元分类模型,以判断输入图像是狗还是背景。我有 8223 个正样本和 33472 个负样本。我的验证集包含 1200 个样本,每个类 600 个。事实上,我的肯定是取自 MS-COCO 数据集的 sn-ps。所有图像都已调整大小,因此较大的尺寸不超过 92,较小的尺寸不小于 44。使用 create_imagenet.sh (resize=false) 创建 LMDB 文件后,我开始使用求解器进行训练,并在下面训练 .prototxt 文件。问题是我得到了一个恒定的精度(0.513333 或 0.486667),这表明网络没有学习任何东西。 我希望有人能够提供帮助 提前谢谢你

求解器文件:

    iter_size: 32
    test_iter: 600
    test_interval: 20
    base_lr: 0.001
    display: 2
    max_iter: 20000
    lr_policy: "step"
    gamma: 0.99
    stepsize: 700
    momentum: 0.9
    weight_decay: 0.0001
    snapshot: 40
    snapshot_prefix: "/media/DATA/classifiers_data/dog_object/models/"
    solver_mode: GPU
    net: "/media/DATA/classifiers_data/dog_object/net.prototxt"
    solver_type: ADAM

train.prototxt:

    layer {
      name: "train-data"
      type: "Data"
      top: "data"
      top: "label"
      include {
        phase: TRAIN
      }

      data_param {
        source: "/media/DATA/classifiers_data/dog_object/ilsvrc12_train_lmdb"
        batch_size: 1
        backend: LMDB
      }
    }
    layer {
      name: "val-data"
      type: "Data"
      top: "data"
      top: "label"
      include {
        phase: TEST
      }
      data_param {
        source: "/media/DATA/classifiers_data/dog_object/ilsvrc12_val_lmdb"
        batch_size: 1
        backend: LMDB
      }
    }

    layer {
      name: "scale"
      type: "Power"
      bottom: "data"
      top: "scale"
      power_param {
        scale: 0.00390625

      }
    }

    layer {
      bottom: "scale"
      top: "conv1_1"
      name: "conv1_1"
      type: "Convolution"
      convolution_param {
        num_output: 64
        pad: 1
        kernel_size: 3
      }
      param {
        lr_mult: 1
      }
      param {
        lr_mult: 1
      }
    }
    layer {
      bottom: "conv1_1"
      top: "conv1_1"
      name: "relu1_1"
      type: "ReLU"
    }
    layer {
      bottom: "conv1_1"
      top: "conv1_2"
      name: "conv1_2"
      type: "Convolution"
      convolution_param {
        num_output: 64
        pad: 1
        kernel_size: 3
      }
      param {
        lr_mult: 1
      }
      param {
        lr_mult: 1
      }
    }

    layer {
      bottom: "conv1_2"
      top: "conv1_2"
      name: "relu1_2"
      type: "ReLU"
    }
    layer {
      name: "spatial_pyramid_pooling"
      type: "SPP"
      bottom: "conv1_2"
      top: "spatial_pyramid_pooling"
      spp_param {
        pool: MAX
        pyramid_height : 4
      }
    }
    layer {
      bottom: "spatial_pyramid_pooling"
      top: "fc6"
      name: "fc6"
      type: "InnerProduct"
      inner_product_param {
        num_output: 64
      }
      param {
        lr_mult: 1
      }
      param {
        lr_mult: 1
      }
    }
    layer {
      bottom: "fc6"
      top: "fc6"
      name: "relu6"
      type: "ReLU"
    }
    layer {
      bottom: "fc6"
      top: "fc6"
      name: "drop6"
      type: "Dropout"
      dropout_param {
        dropout_ratio: 0.5
      }
    }
    layer {
      bottom: "fc6"
      top: "fc7"
      name: "fc7"
      type: "InnerProduct"
      inner_product_param {
        num_output: 2
      }
      param {
        lr_mult: 1
      }
      param {
        lr_mult: 1
      }
    }
    layer {
      name: "loss"
      type: "SoftmaxWithLoss"
      bottom: "fc7"
      bottom: "label"
      top: "loss"
    }
    layer {
      name: "accuracy/top1"
      type: "Accuracy"
      bottom: "fc7"
      bottom: "label"
      top: "accuracy"
      include: { phase: TEST }

    }

部分训练日志:

I1125 15:52:36.604038 2326 solver.cpp:362] 迭代 40,测试网 (#0)

I1125 15:52:36.604071 2326 net.cpp:723] 忽略源层训练数据

I1125 15:52:47.127979 2326 solver.cpp:429] 测试网络输出 #0:准确度 = 0.486667

I1125 15:52:47.128067 2326 solver.cpp:429] 测试网络输出 #1:损失 = 0.694894(* 1 = 0.694894 损失)

I1125 15:52:48.937928 2326 solver.cpp:242] 迭代 40 (0.141947 iter/s, 14.0897s/2 iter), loss = 0.67717

I1125 15:52:48.938014 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.655692(* 1 = 0.655692 损失)

I1125 15:52:48.938040 2326 sgd_solver.cpp:106] 迭代 40,lr = 0.001

I1125 15:52:52.858757 2326 solver.cpp:242] 迭代 42 (0.510097 iter/s, 3.92083s/2 iter), loss = 0.673962

I1125 15:52:52.858841 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.653978(* 1 = 0.653978 损失)

I1125 15:52:52.858875 2326 sgd_solver.cpp:106] 迭代 42,lr = 0.001

I1125 15:52:56.581573 2326 solver.cpp:242] 迭代 44 (0.53723 iter/s, 3.7228s/2 iter), loss = 0.673144

I1125 15:52:56.581656 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.652269(* 1 = 0.652269 损失)

I1125 15:52:56.581689 2326 sgd_solver.cpp:106] 迭代 44,lr = 0.001

I1125 15:53:00.192082 2326 solver.cpp:242] 迭代 46 (0.553941 iter/s, 3.61049s/2 iter), loss = 0.669606

I1125 15:53:00.192167 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.650559(* 1 = 0.650559 损失)

I1125 15:53:00.192200 2326 sgd_solver.cpp:106] 迭代 46,lr = 0.001

I1125 15:53:04.195417 2326 solver.cpp:242] 迭代 48 (0.499585 iter/s, 4.00332s/2 iter), loss = 0.674327

I1125 15:53:04.195691 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.648808(* 1 = 0.648808 损失)

I1125 15:53:04.195736 2326 sgd_solver.cpp:106] 迭代 48,lr = 0.001

I1125 15:53:07.856842 2326 solver.cpp:242] 迭代 50 (0.546265 iter/s, 3.66123s/2 iter), loss = 0.661835

I1125 15:53:07.856925 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.647097(* 1 = 0.647097 损失)

I1125 15:53:07.856957 2326 sgd_solver.cpp:106] 迭代 50,lr = 0.001

I1125 15:53:11.681635 2326 solver.cpp:242] 迭代 52 (0.522906 iter/s, 3.82478s/2 iter), loss = 0.66071

I1125 15:53:11.681720 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.743264(* 1 = 0.743264 损失)

I1125 15:53:11.681754 2326 sgd_solver.cpp:106] 迭代 52,lr = 0.001

I1125 15:53:15.544859 2326 solver.cpp:242] 迭代 54 (0.517707 iter/s, 3.86319s/2 iter), loss = 0.656414

I1125 15:53:15.544950 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.643741(* 1 = 0.643741 损失)

I1125 15:53:15.544986 2326 sgd_solver.cpp:106] 迭代 54,lr = 0.001

I1125 15:53:19.354320 2326 solver.cpp:242] 迭代 56 (0.525012 iter/s, 3.80943s/2 iter), loss = 0.645277

I1125 15:53:19.354404 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.747059(* 1 = 0.747059 损失)

I1125 15:53:19.354431 2326 sgd_solver.cpp:106] 迭代 56,lr = 0.001

I1125 15:53:23.195466 2326 solver.cpp:242] 迭代 58 (0.520681 iter/s, 3.84112s/2 iter), loss = 0.677604

I1125 15:53:23.195549 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.640145(* 1 = 0.640145 损失)

I1125 15:53:23.195575 2326 sgd_solver.cpp:106] 迭代 58,lr = 0.001

I1125 15:53:25.140920 2326 solver.cpp:362] 迭代 60,测试网 (#0)

I1125 15:53:25.140965 2326 net.cpp:723] 忽略源层训练数据

I1125 15:53:35.672775 2326 solver.cpp:429] 测试网络输出 #0:准确度 = 0.513333

I1125 15:53:35.672937 2326 solver.cpp:429] 测试网络输出 #1:损失 = 0.69323(* 1 = 0.69323 损失)

I1125 15:53:37.635395 2326 solver.cpp:242] 迭代 60 (0.138503 iter/s, 14.4401s/2 iter), loss = 0.655983

I1125 15:53:37.635478 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.638368(* 1 = 0.638368 损失)

I1125 15:53:37.635512 2326 sgd_solver.cpp:106] 迭代 60,lr = 0.001

I1125 15:53:41.458472 2326 solver.cpp:242] 迭代 62 (0.523143 iter/s, 3.82305s/2 iter), loss = 0.672996

I1125 15:53:41.458555 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.753101(* 1 = 0.753101 损失)

I1125 15:53:41.458588 2326 sgd_solver.cpp:106] 迭代 62,lr = 0.001

I1125 15:53:45.299643 2326 solver.cpp:242] 迭代 64 (0.520679 iter/s, 3.84114s/2 iter), loss = 0.668675

I1125 15:53:45.299737 2326 solver.cpp:261] 训练净输出 #0:损失 = 0.634894(* 1 = 0.634894 损失)

【问题讨论】:

    标签: neural-network deep-learning classification caffe digits


    【解决方案1】:

    几个厘米:
    1. 您的测试集包含 1200 个样本,但您每次仅验证 600 个:test_iter*batch_size=600。详情请见this answer
    2. 您在创建 lmdb 时是否对训练数据进行了洗牌?有关详细信息,请参阅this answer
    3. 你如何初始化你的权重?在您的 prototxt 文件中似乎没有调用 fillers。如果您没有明确定义fillers,您的权重会初始化为零。对于 SGD 来说,这是一个非常困难的起点。有关详细信息,请参阅this answer
    4. 您是否尝试在求解器中设置debug_info: true 并查看调试日志以追踪问题的根本原因?详情请见this thread

    【讨论】:

    • 非常感谢,感谢您的帮助 1. 为了速度,我使用了 'test_iter: 600'。现在,我已将验证集增加到 1800 个样本并更改了“test_iter:1800”2。我的训练数据被很好地打乱了 3。我尝试了具有不同标准的“xavier”和“高斯”,但结果没有改变 4。我尝试了答案中提到的'debug_info:true'。我没有找到任何 nan 或零差异。我不确定,但 L2 值似乎没问题。 5. 我尝试了不同的求解器类型和学习率,但没有帮助。我希望我可以显示我的日志,但它太长了。
    • 可能是我使用的数据集不平衡(8223 个阳性到 33472 个阴性)?
    • @MoMo 我还有两个担忧:(1)您已经注意到的数据不平衡。 (2) batch_size: 1 看起来很小。您是否尝试过增加批量大小?
    • 你能人为地“平衡”数据吗?那是在列出所有示例的文本文件中(convert_imageset 的输入),您能否复制正例的行,使正例的数量与负例的数量相匹配?
    • 我将平衡数据集并评论结果。关于'batch_size:1',我在求解器文件中有'iter_size:32'。 AFAIK,它从 32 个样本中累积梯度并根据平均值更新权重。
    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2018-04-11
    • 1970-01-01
    • 2013-09-06
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多