使用卷积层时错误:消息:新的形状长度不匹配原始长度
Friedemann
委员,大学教授职位:27大学教授
在帮助
你好,
我试图设置一个简单的深度学习过程,使用深度学习扩展和MNIST数据集作为Kaggle灰色值的csv。如果我只是在深度学习操作符中使用两个完全连接的层,一切都可以正常工作,但一旦我添加了卷积层和池化层,应用模型步骤就会失败,并发出错误消息:
例外:org.nd4j.linalg.exception.ND4JIllegalStateException
信息:新的形状长度不匹配原始长度:[0]vs[6584816]。原形状:[8399,784]新形状:[33601,0,784]
测试数据集是分割算子的结果,其中80%(33601条记录)的数据作为训练数据,20%(8399条记录)的数据作为测试数据。
我做错了什么?任何帮助都非常感激
Friedemann
标记:
0
最佳答案
-
伴侣 员工,成员职位:14RM团队成员好吧,我从来没有使用过一个数据集,其中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行中的多通道图像。0
答案
作为第一个建议,我想说,看看我们的教程过程之一,因为它也处理MNIST用例。
“添加卷积层—>教程过程—> MNIST分类”
(当然我们没有提供数据,但你已经有了,这对你来说没有问题)
错误的发生是由于一个完全连接的层被馈送到一个卷积层。
我的直觉告诉我,这甚至不应该自动实现,因为cnn的工作是多维数据,对吧?
因此,为了使潜在的自动转换成为可能,我们至少应该配置如何塑造给定全连接层的一维输出,从而使它对即将到来的卷积层易于理解,不是吗?
至少我是这么认为的。
+我很确定,我们不提供这种功能,我猜它也会有点奇怪和不寻常,至少基于我在其他CNN模型中看到的情况(在“导入现有模型”的帮助下,你可以查看许多著名模型的架构)。
亲切的问候,
伴侣
不过,我不确定训练是否有效。当你在训练时,你能在你的日志窗口看到训练分数吗?有时,你只会得到警告,告诉你网络不能在给定的时间内训练,而不是立即出现错误。
我的回答暗示你的网络不会工作,不管你的数据的“格式”是什么:
将稠密层放在卷积层前面是有问题的.这正是我想指出来的。
从每个类中获取100张图像,从而创建了一个1000张图像的大型、不同的数据集,分别用于训练和测试。
因为我也使用CPU进行训练,所以我不想处理60.000张图像。
当我这样做时,教程过程实现了~ 89%的准确率训练只需要1分20秒(我用的是笔记本电脑)。
即使我把这个模型应用到整个测试数据集(约10,000张图像),它达到了90%的准确率.我想说这个模型非常成功地学会了如何区分这些数字(当然,它仍然可以变得更健壮、更好,我认为LeNet达到了97%左右,如果我没记错的话)。
伴侣
(见附件)
CNN使用1D输入(784 + 1列)。
介意输入形状设置为深度学习模型运算符。
你的回答已经回答了这个问题。在之前的回复中,我被告知CNN确实需要二维数据,但如果使用“手动输入形状规范”,似乎会调用DL4J包的1D版本。
更新:
我把“卷积平化”的解释读了好几遍。我想我的理解是错误的。解释说,四维输入转换为二维。需要什么样的四维输入?CSV输入是二维的(label, pixel_values)。我需要数据像在下一个问题(标签,图像,pixel_values_of_line)和2D内核将被调用吗?
我想我需要选择“卷积”形状选项,但哪种格式的示例集是预期的?
然而,当涉及到多维信号时,比如图像和视频,2D和3D卷积就占了上风。
我想这就是我说的,你需要多维数据,如果你要用卷积层进行图像处理。
现在,在我的上述过程中二维卷积层正在使用,这是我以前也在寻找的,但被文档弄糊涂了。因此“配置如何塑造给定全连接层的一维输出,从而使其易于为即将到来的卷积层消化”.除了现在我删除了全连接/密集层,只需要使一维数据可以直接被卷积数据消化。
我基本上告诉DL4j,“嘿,这是一个数组中的784个元素,但我希望它是28x28。我只是在卷积层使用数据之前重新塑造了数据。在这种情况下,它通过使用预处理器来工作:FeedForwardToCnnPreProcessor.
我认为对于涉及卷积层的多元时间序列我们不一定有一个教程过程,但这当然是可能的,特别是选择正确的输入形状.不过,在这种情况下,我肯定会用复发性选项。
亲切的问候,
伴侣
Friedemann
我不确定我是否理解了你问题的其余部分,但这里有一个在背景中发生的例子:
原始数据,一个行集合(~数组的数组,这对应于一个单行的ExampleSet):
现在所述的预处理器将上述数据和重塑它变成这样:
假设上面的“图像”代表数字1.
通道数量/深度设置为1(在我的示例过程中也是如此),因为我们的数据是灰度的。
现在这种格式可以直接由卷积层处理。