使用卷积层时错误:消息:新的形状长度不匹配原始长度

FriedemannFriedemann 委员,大学教授职位:27大学教授
你好,

我试图设置一个简单的深度学习过程,使用深度学习扩展和MNIST数据集作为Kaggle灰色值的csv。如果我只是在深度学习操作符中使用两个完全连接的层,一切都可以正常工作,但一旦我添加了卷积层和池化层,应用模型步骤就会失败,并发出错误消息:

例外:org.nd4j.linalg.exception.ND4JIllegalStateException
信息:新的形状长度不匹配原始长度:[0]vs[6584816]。原形状:[8399,784]新形状:[33601,0,784]

测试数据集是分割算子的结果,其中80%(33601条记录)的数据作为训练数据,20%(8399条记录)的数据作为测试数据。

我做错了什么?任何帮助都非常感激
Friedemann

最佳答案

  • 伴侣伴侣 员工,成员职位:14RM团队成员
    2021年4月编辑 解决方案接受
    好吧,我从来没有使用过一个数据集,其中3通道(例如:RGB)图像被放在一个数组中,但我现在确实进行了一个小测试:

    这是一个MNIST图像减少到4x4,并转换为3通道图像(我停止了这个过程,直接查看数据,这些MNIST png图像看起来像在引擎盖下,所以这现在不是ExampleSet用例,而是我们处理实际图像文件的教程过程):

    这意味着,张量是4D的,因为我们总是在谈论一个样本的集合(在这种情况下是一个图像),其中的3D张量将包含每个通道/深度的2D矩阵。
    这意味着,如果我将手动数据集转换为3通道数据集,这就是我想要的格式,就像我在前面的消息中对1通道数据集所做的那样。

    3通道:
    [[0,1.0000, 0,0,1.0000, 0,0,1.0000, 0,0,2 .0000, 0,0,2 .0000, 0,0,2 .0000, 0,0,3. .0000, 0,0,3. .0000, 0,0,3. .0000, 0]]

    就变成了

    [[[[0,1.0000, 0),
    [0,1.0000, 0),
    [0,1.0000, 0]],

    [[0,2 .0000, 0),
    [0,2 .0000, 0),
    [0,2 .0000, 0]],

    [[0,3. .0000, 0),
    [0,3. .0000, 0),
    [0,3. .0000, 0]]]]

    这是一个3x3x3的图像(高:3,宽:3,深度/通道:3)。

    如您所见,如果您将数据按正确的顺序(第一个通道,第二个通道,第三个通道)放在一行中,并设置正确的输入形状参数,您甚至可以处理位于单个ExampleSet行中的多通道图像。

答案

  • FriedemannFriedemann 委员,大学教授职位:27大学教授

  • 伴侣伴侣 员工,成员职位:14RM团队成员
    2021年3月编辑
    嗨Friedemann,

    作为第一个建议,我想说,看看我们的教程过程之一,因为它也处理MNIST用例。
    “添加卷积层—>教程过程—> MNIST分类”
    (当然我们没有提供数据,但你已经有了,这对你来说没有问题)

    错误的发生是由于一个完全连接的层被馈送到一个卷积层。
    我的直觉告诉我,这甚至不应该自动实现,因为cnn的工作是多维数据,对吧?
    因此,为了使潜在的自动转换成为可能,我们至少应该配置如何塑造给定全连接层的一维输出,从而使它对即将到来的卷积层易于理解,不是吗?
    至少我是这么认为的。
    +我很确定,我们不提供这种功能,我猜它也会有点奇怪和不寻常,至少基于我在其他CNN模型中看到的情况(在“导入现有模型”的帮助下,你可以查看许多著名模型的架构)。

    亲切的问候,
    伴侣
  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    我想我并没有完全理解他们的反应。但无论如何,让我一步一步地回答:
    教程过程是基于深度学习的张量版本,老实说,我不知道如何创建张量数据(这不是教程的一部分)。
    此外,我想知道为什么模型的训练工作,但应用失败。如果CNN需要二维数据,我预计在训练阶段会出现错误。
    最后,您的回答暗示使用MNIST数据的csv格式将不适用于教程过程,需要一种不同的表示形式。你能告诉我正确的输入格式吗?
  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    关于上一篇文章的后续:我现在明白了,为了运行深度学习教程过程,您需要图像扩展。图像扩展从一个图像目录生成张量格式,子目录的名称用作标签。我已经下载了图片的jpg版本,并创建了文件夹结构,我目前正在进行培训。
  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    第二次跟进:45分钟后教程过程成功结束(CUDA还不能工作)。我使用图像的训练集进行训练和测试,总体准确率为9.97%,基本上所有图像都被归类为“9”。
  • 伴侣伴侣 员工,成员职位:14RM团队成员
    2021年4月编辑
    好吧,让我谈谈这三篇文章:

    1. 是的,教程过程使用了不同的“格式”(正如您在后续回复中也得出的结论,所以我原始答案的这一部分变得无关紧要,因为您正在使用CSV格式,或者至少您正在使用它)。

      不过,我不确定训练是否有效。当你在训练时,你能在你的日志窗口看到训练分数吗?有时,你只会得到警告,告诉你网络不能在给定的时间内训练,而不是立即出现错误。

      我的回答暗示你的网络不会工作,不管你的数据的“格式”是什么:
      将稠密层放在卷积层前面是有问题的.这正是我想指出来的。

    2. 您可以坚持使用原始的数据格式(单张图像的1D, 28x28列/属性/特征),但需要正确地设计网络。

    3. 我跟你说实话,我只在一个缩减集上训练和测试。
      从每个类中获取100张图像,从而创建了一个1000张图像的大型、不同的数据集,分别用于训练和测试。
      因为我也使用CPU进行训练,所以我不想处理60.000张图像。
      当我这样做时,教程过程实现了~ 89%的准确率训练只需要1分20秒(我用的是笔记本电脑)。
      即使我把这个模型应用到整个测试数据集(约10,000张图像),它达到了90%的准确率.我想说这个模型非常成功地学会了如何区分这些数字(当然,它仍然可以变得更健壮、更好,我认为LeNet达到了97%左右,如果我没记错的话)。

    亲切的问候,
    伴侣
  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    2021年4月编辑
    谢谢你的最新消息。那么,你是如何根据图像进行采样的呢?

    顺便说一下,我确实使用了csv格式和一个由三个完全连接的层组成的深度学习网络,并实现了大约的整体准确性。97%(使用分割算子和20%的测试数据)。

    作为一名研究人员,我想在图像识别的情况下映射一个非图像问题。然而,在能够使用CNN层之前,我需要首先从数据中创建“图像”,对吗?
  • pschlunderpschlunder 员工,RapidMiner认证分析师,RapidMiner认证专家,RMResearcher,会员职位:96RM研究
    采样的一种方法是使用“读取图像元数据”操作符,后面跟着一个采样操作符。第一个只读取图像的路径,所以你可以分层采样,每个类获得大约100张图像,就像附上的演示过程一样。当使用“Pre-process images”操作符将其归一化并转换为一个张量时,实际的图像将在加载之后。

    如果你想在非图像数据上应用卷积网络或类似的东西,你也可以使用其他张量转换算子之一。例如,你可以使用“ExampleSet to Tensor”操作符。它需要两列来指定要创建的张量对象的id。这样,您就可以使用所有RapidMiner操作符将数据修改为ExampleSets,然后将其转换为张量对象。不过,目前对张量对象的直接改变是不可能的。

    此外,请看看我们的文档的页面部分的数据,也许它有助于澄清一些事情https://docs.www.turtlecreekpls.com/latest/studio/installation/deep-learning-extension.html#data

    我希望这有帮助,
    菲利普






  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    2021年4月编辑
    嗨,菲利普,

    感谢您对图像采样的讲解。明白了!

    它尝试使用张量操作符的示例集,但CNN层抱怨张量格式(它为时间序列数据生成张量,而不是CNN层期望的格式)。似乎“CNN数据”的选项不见了。
    你曾经成功地使用过CNN层的操作符吗?

    干杯
    Friedemann
  • 伴侣伴侣 员工,成员职位:14RM团队成员
    2021年4月编辑
    嘿,刚刚尝试了这个过程,似乎是训练和得分(虽然,相当糟糕的当前设置):
    (见附件)


    CNN使用1D输入(784 + 1列)。
    介意输入形状设置为深度学习模型运算符。

    CSV_MNIST.rmp 13.3 k
  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    2021年4月编辑
    嗨,伙伴,
    非常感谢你的回复。现在我们混淆了两个方面:
    • 其中一个问题是如何使用csv版本的MNIST数据的cnn。
      你的回答已经回答了这个问题。在之前的回复中,我被告知CNN确实需要二维数据,但如果使用“手动输入形状规范”,似乎会调用DL4J包的1D版本。
      更新:
      我把“卷积平化”的解释读了好几遍。我想我的理解是错误的。解释说,四维输入转换为二维。需要什么样的四维输入?CSV输入是二维的(label, pixel_values)。我需要数据像在下一个问题(标签,图像,pixel_values_of_line)和2D内核将被调用吗?
    • 这个线程中的实际问题是如何从包含数据的示例集中准备一个张量,例如用于“常规”2-D cnn(标签,图像,pixel_values_of_line)的连续模式?
      我想我需要选择“卷积”形状选项,但哪种格式的示例集是预期的?
    干杯
    Friedemann
  • 伴侣伴侣 员工,成员职位:14RM团队成员
    因为,我刚才也搞糊涂了可能是我把你们搞糊涂了,现在我试着弥补一下。

    • 当我写的时候cnn的多维数据研究,我可能有点错了,因为这并不完全准确。在信号处理的情况下(我相信这是卷积的原始数学概念),1D卷积是可能的/可用的,即使对于DL4J和btw,我们也支持,如果你选择复发性输入类型(年代)。

      然而,当涉及到多维信号时,比如图像和视频,2D和3D卷积就占了上风。
      我想这就是我说的,你需要多维数据,如果你要用卷积层进行图像处理。

      现在,在我的上述过程中二维卷积层正在使用,这是我以前也在寻找的,但被文档弄糊涂了。因此“配置如何塑造给定全连接层的一维输出,从而使其易于为即将到来的卷积层消化”.除了现在我删除了全连接/密集层,只需要使一维数据可以直接被卷积数据消化。
      我基本上告诉DL4j,“嘿,这是一个数组中的784个元素,但我希望它是28x28。我只是在卷积层使用数据之前重新塑造了数据。在这种情况下,它通过使用预处理器来工作:FeedForwardToCnnPreProcessor

    • 如果你想处理顺序数据,那就有点不同了。
      我认为对于涉及卷积层的多元时间序列我们不一定有一个教程过程,但这当然是可能的,特别是选择正确的输入形状.不过,在这种情况下,我肯定会用复发性选项。

    亲切的问候,
    伴侣
  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    嗨,伙伴,

    这是很大的进步!所以,你说的是784个像素值被转换成一个28x28的2d矩阵。这正是我所寻找的(并且我希望这种转换是模型的一部分,并将在应用模型时使用)。但是,我不确定输入数据的格式必须是怎样的。转换是否假设二维矩阵是按行或按列“平化”的?
    后续问题:
    我可以使用值对的数据“点”,而不是仅仅通过设置深度值为2的单一值?
    是否有机会支持输入矩阵每行一行的输入格式?

    干杯
    Friedemann
  • 伴侣伴侣 员工,成员职位:14RM团队成员
    2021年4月编辑
    是的,它(我提到的预处理器)是体系结构/模型的一部分。
    我不确定我是否理解了你问题的其余部分,但这里有一个在背景中发生的例子:

    原始数据,一个行集合(~数组的数组,这对应于一个单行的ExampleSet):
    [[0, 1.0000, 0, 0, 1.0000, 0, 0, 1.0000, 0]]

    现在所述的预处理器将上述数据和重塑它变成这样:
    [[[[0, 1.0000, 0],
    [0, 1.0000, 0],
    [0, 1.0000, 0]]]]

    假设上面的“图像”代表数字1
    通道数量/深度设置为1(在我的示例过程中也是如此),因为我们的数据是灰度的。

    现在这种格式可以直接由卷积层处理。
  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    因此,数据是逐行解释的。前三个值表示第一行,值4到6表示第二行,依此类推。

    现在,我的问题是,如果每个“像素”有一对值会发生什么。或者,一般来说,深度参数表示什么,以及它如何影响示例集的解释。

  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    完美!非常感谢你的澄清。实际的问题已经有了答案。
    如果我有对每个“像素”的值,我将处理它类似于一个颜色通道,每个通道只是在像素值的序列。
    只是出于好奇,因为这种格式会在csv文件中导致很长的行,因此很难被人类阅读:有没有计划支持基于属性分组概念的张量的进一步“文本格式”?

  • FriedemannFriedemann 委员,大学教授职位:27大学教授
    现在来看看现实:
    当使用CUDA后端使用手动输入形状设置运行MNIST示例(CSV版本)时,我得到一个错误消息:未能从主机内存分配1,685,712,896字节。

    当使用CPU后端运行时,我的机器会耗尽内存并开始交换内存(JVM内存限制为10,000 MB,后端内存限制为10G)。

    我猜是出了什么问题FeedForwardToCnnPreProcessor。



登录注册置评。