Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模型预测是captcha识别中所有类别中的一个类别_Python_Keras_Deep Learning - Fatal编程技术网

Python 模型预测是captcha识别中所有类别中的一个类别

Python 模型预测是captcha识别中所有类别中的一个类别,python,keras,deep-learning,Python,Keras,Deep Learning,我试图建立一个模型来预测验证码字母和数字。但是当我试图预测时,我发现所有预测只会导致所有标签=33类中的一个类。我的第一次尝试是使用学习率keras.optimizer.adam(lr=0.001)所有预测都是1 然后我尝试将学习率更改为0.01,然后所有结果都与图中的S一样 有时它会像这样给人感觉 我真的不知道那是什么原因。我查过数据了。我分裂的想法只是一个类,但在我的案例中找不到 这就是我分割数据的方式: (X_train, X_test, Y_train, Y_test) = trai

我试图建立一个模型来预测验证码字母和数字。但是当我试图预测时,我发现所有预测只会导致所有
标签=33
类中的一个类。我的第一次尝试是使用学习率
keras.optimizer.adam(lr=0.001)
所有预测都是
1
然后我尝试将学习率更改为0.01,然后所有结果都与图中的S一样

有时它会像这样给人感觉

我真的不知道那是什么原因。我查过数据了。我分裂的想法只是一个类,但在我的案例中找不到 这就是我分割数据的方式:

(X_train, X_test, Y_train, Y_test) = train_test_split(data, label, test_size=0.2, random_state=0)
lb = LabelBinarizer().fit(Y_train)
Y_train = lb.transform(Y_train)
Y_test = lb.transform(Y_test)
这是我的数据类金额检查不平衡:

(array(['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
        'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S',
        'T', 'U', 'V', 'W', 'X', 'Y', 'Z'], dtype='<U1'),
 array([8286, 6393, 6332, 6316, 6427, 6173, 6699, 6404, 6956, 6272, 6331,
        6353, 6328, 6607, 6250, 6396, 6466, 5985, 6421, 6314, 6196, 6502,
        6542, 6417, 6435, 6421, 6396, 6341, 6107, 6131, 6360, 6383, 6457]))
我在想:

分裂问题?一批代码错误? 我运行的模型取决于以下示例模型:


我在这一部分被阻止了大约一周,并且没有找到解决方案当我看到您的案例和代码时,我想到了两个问题:

  • 首先,为了在训练集中获得每个班级相同数量的样本,您是否首先平衡了数据?未经缓冲的数据可能会产生不好的结果。培训集中每个班级有多少个样本

  • 为什么不先分析整个标签列上的标签?的确,您在Y_train和Y_测试中使用了相同的labelizer,但是如果测试集中缺少类呢?(此问题与上述问题相关)

  • 执行以下操作更安全,尤其是在数据平衡之后:

    lb = LabelBinarizer()
    lb_label = lb.fit_transform(label)
    (X_train, X_test, Y_train, Y_test) = train_test_split(data, lb_label, test_size=0.2, random_state=0)
    
  • 我在您的示例中看到,
    B
    6
    S
    以及其他字符之间存在歧义。这型号似乎不太合适

  • 类不是标量而是向量,因此输出层的大小应该是二维的,可能是(1,33)

  • 在CNN架构中,您的Conv2D的大小必须越来越小,但您有
    100
    200
    200
    500
    ,修改此设置也可能有助于提高您的分数

  • 希望这能有所帮助

    更新


    你也可以在Keras中使用。

    我已经添加了上面的类的数量并编辑了这个问题。你的类不是标量而是向量。因此,最后一层的大小应为2D,而不是标量的33。也许(1,33)我也会试试这个,谢谢,我还添加了我试图用上面的模型的链接来检查这个模型。这与我使用的相同,而不是我认为的类和层的数量。您也可以尝试Keras中已有的图像分类体系结构。我更新了答案并添加了链接。我尝试了
    Inception
    ,得到了很好的结果。如果你使用它们,你就不必为这些问题烦恼,它们已经完成了。我再次更新了我的答案。我没有亲自运行您的代码,也无法访问您使用的数据,因此我的陈述只是猜测。顺便说一下,您的数据似乎相当平衡。
    lb = LabelBinarizer()
    lb_label = lb.fit_transform(label)
    (X_train, X_test, Y_train, Y_test) = train_test_split(data, lb_label, test_size=0.2, random_state=0)