当前位置: 首页 > 知识库问答 >
问题:

准确度不变

柴飞星
2023-03-14

我试图在caffe中训练一个二元分类模型,它告诉输入图像是狗还是背景。我有8223个阳性样本,33472个阴性样本。我的验证集包含1200个样本,每个类600个。事实上,我的优点是摘自MS-COCO数据集的片段。所有的图像都被调整大小,所以比格维度不超过92,较小的维度不小于44。在使用create_imagenet.sh(resize=false)创建LMDB文件之后,我开始使用求解器进行训练,下面是train.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
    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: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.92083 S/2 iter),损失=0.673962

I1125 15:52:52.858841 2326 Solver.cpp:261]列车净输出#0:损失=0.653978(*1=0.653978损失)

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.61049 S/2 iter),损失=0.669606

I1125 15:53:00.192167 2326 Solver.cpp:261]列车净输出#0:损失=0.650559(*1=0.650559损失)

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.66123 S/2 iter),损失=0.661835

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.86319 S/2 iter),损失=0.656414

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.80943 S/2 iter),损失=0.645277

I1125 15:53:19.354404 2326 Solver.cpp:261]列车净输出#0:损失=0.747059(*1=0.747059损失)

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.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.82305 S/2 iter),损失=0.672996

I1125 15:53:41.458555 2326 SOLVER.CPP:261]列车净输出#0:损失=0.753101(*1=0.753101损失)

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

I1125 15:53:45.299737 2326 Solver.cpp:261]列车净输出#0:损失=0.634894(*1=0.634894损失)

共有1个答案

左丘嘉木
2023-03-14

一些评论:
1。您的测试集包含1200个示例,但每次只验证600个:test_iter*batch_size=600。有关详细信息,请参阅此答案。
2。创建LMDB时是否洗牌了训练数据?有关详细信息,请参阅此答案。
3。你如何初始化你的体重?prototxt文件中似乎没有调用fillers。如果未显式定义填充器,则权重将初始化为零。对新币来说,这是一个非常困难的起点。有关详细信息,请参阅此答案。
4。您是否尝试在求解器中设置debug_info:true并查看调试日志以跟踪问题的根本原因?有关更多细节,请参见此线程。

 类似资料:
  • 我使用的是320 kbps,大约1小时长的MP3文件。我正在做的项目是在MP3文件中寻找一组音乐,这样它就可以洗牌歌曲。我会给程序加上时间戳,它会搜索歌曲。如果JavaFX的seek方法不是非常不准确的话,它就可以工作了。 使用返回我们期望的持续时间。然而,如果我们听mp3文件(或者不寻找,或者在外部mp3播放器中),我们会意识到报告的时间和实际情况是非常不同的,有时甚至是几秒钟。 例如结果搜索到

  • 我注意到消息的EnqueueTimeUtc值不准确 我正在为我的系统使用ServiceBus主题和订阅者 发送方在.NET中使用“Microsoft.Azure.ServiceBus”version=“4.1.1”NuGet包编写,使用SendAsync()方法将消息发送到主题 订阅方是使用Azure.ServiceBus.Control_Client(azure-servicebus versi

  • 我正在用Java开发一个简单的2D游戏。 我正在使用JFrame类,但是我不认为宽度和高度是我指定的,或者图形不正确。 下面是我的一些代码片段: JFrame显示黑色背景。然而,根据我给fillRect函数的参数,框架底部仍然应该有一条10px高的白色长条。事实并非如此。白色的银条只有在从框架高度降低30像素后才真正开始显示。 谢谢你的帮助。

  • 编辑:我刚刚删除了其他的方法,我们已经验证是正确的,因为问题似乎有点长,这些方法似乎是无关的。 我有一个circle类,它有以下属性:中心、半径、旧位置、加速度、质量和恢复。 如果你接受向量方法的表面价值是正确的,这会有帮助,我认为它们的命名足够好,让你弄清楚它们的作用,但我也可以把它们粘贴进去。 我的主要问题是,当我运行它时,它注册了一个碰撞发生了,但是第二个圆圈的值位置没有改变。我将如何解决这

  • 我正在用C++的SFML制作一个2D游戏,我有一个冲突的问题。我有一个玩家和一张用瓷砖做的地图。不起作用的是我的碰撞检测不准确。当我将玩家向上移动然后向下移动到瓷砖上时,结果会有所不同。 我知道这个问题的根源可能是在计算球员移动时使用帧间的delta时间--所以它不是恒定的。但它平滑了运动,所以我不知道如何做它的其他方式。我试着用定速阀来使碰撞完全准确--速度必须非常低,我对此不满意。 在玩家位置

  • 问题内容: 我在这里阅读这个问题: 在SQL数据库中存储经度和纬度数据时应使用哪种数据类型? 似乎普遍的共识是使用Decimal(9,6)是可行的方法。我的问题是,我真的需要多少精度? 例如,Google的API返回如下结果: 在-122.0841430中,我需要几位数?我已经阅读了几本指南,但是我从中没有足够的道理来解决这个问题。 为了更精确地回答我的问题:如果我想在准确位置的50英尺范围内保持