Keras 卷积层维数不匹配

2023-12-14

我正在尝试使用 Keras 来构建我的第一个神经网络。我的经验为零,我似乎无法弄清楚为什么我的维度不正确。我无法从他们的文档中弄清楚这个错误在抱怨什么,甚至是哪个层导致了它。

我的模型接受 32 字节的数字数组,并应该在另一侧给出一个布尔值。我想要对输入字节数组进行一维卷积。

arr1 是 32 字节数组,arr2 是布尔数组。

inputData = np.array(arr1)
inputData = np.expand_dims(inputData, axis = 2)

labelData = np.array(arr2)

print inputData.shape
print labelData.shape

model = k.models.Sequential()
model.add(k.layers.convolutional.Convolution1D(32,2, input_shape = (32, 1)))
model.add(k.layers.Activation('relu'))

model.add(k.layers.convolutional.Convolution1D(32,2))
model.add(k.layers.Activation('relu'))

model.add(k.layers.convolutional.Convolution1D(32,2))
model.add(k.layers.Activation('relu'))

model.add(k.layers.convolutional.Convolution1D(32,2))
model.add(k.layers.Activation('relu'))

model.add(k.layers.core.Dense(32))
model.add(k.layers.Activation('sigmoid'))

model.compile(loss = 'binary_crossentropy',
              optimizer = 'rmsprop',
              metrics=['accuracy'])
model.fit(
    inputData,labelData
)

形状打印的输出是 (1000, 32, 1) 和 (1000,)

我收到的错误是:

回溯(最近一次调用最后一次):文件“cnn/init.py”,行 50、在 inputData,labelData 文件“/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/models.py”, 第 863 行,适合 initial_epoch=initial_epoch) 文件“/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/engine/training.py”, 第 1358 行,适合 batch_size=batch_size)文件“/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/engine/training.py”, 第 1238 行,在 _standardize_user_data 中 exception_prefix ='target')文件“/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/engine/training.py”, 第 128 行,在 _standardize_input_data 中 str(array.shape)) ValueError:检查目标时出错:预期activation_5具有3个维度,但得到形状为(1000, 1)的数组


嗯,在我看来,你需要更多地谷歌一下卷积网络:-)

您在每个步骤中在序列上应用 32 个长度为 2 的过滤器。因此,如果我们遵循每层之后张量的维度:

尺寸:(无、32、1)

model.add(k.layers.convolutional.Convolution1D(32,2, input_shape = (32, 1)))
model.add(k.layers.Activation('relu'))

尺寸:(无、31、32)(长度为 2 的过滤器会遍历整个序列,因此序列现在的长度为 31)

model.add(k.layers.convolutional.Convolution1D(32,2))
model.add(k.layers.Activation('relu'))

尺寸:(无、30、32)(由于长度为 2 的过滤器,您再次丢失了一个值,但仍然有 32 个)

model.add(k.layers.convolutional.Convolution1D(32,2))
model.add(k.layers.Activation('relu'))

尺寸:(无、29、32)(相同的...)

model.add(k.layers.convolutional.Convolution1D(32,2))
model.add(k.layers.Activation('relu'))

尺寸:(无、28、32)

现在您想在其之上使用 Dense 层...问题是 Dense 层将在您的 3D 输入上按如下方式工作:

model.add(k.layers.core.Dense(32))
model.add(k.layers.Activation('sigmoid'))

尺寸:(无、28、32)

这是你的输出。我觉得奇怪的第一件事是你想要从你的密集层输出 32 个输出......你应该放 1 而不是 32。但即使这样也不能解决你的问题。看看如果我们改变最后一层会发生什么:

model.add(k.layers.core.Dense(1))
model.add(k.layers.Activation('sigmoid'))

尺寸:(无、28、1)

发生这种情况是因为您将密集层应用于“2D”张量。如果您将密集(1)层应用于输入 [28, 32],它会生成形状为 (32,1) 的权重矩阵,并将其应用于 28 个向量,以便您发现自己有 28 个输出尺寸为 1。

我建议解决这个问题的方法是更改​​最后两层,如下所示:

model = k.models.Sequential()
model.add(k.layers.convolutional.Convolution1D(32,2, input_shape = (32, 1)))
model.add(k.layers.Activation('relu'))

model.add(k.layers.convolutional.Convolution1D(32,2))
model.add(k.layers.Activation('relu'))

model.add(k.layers.convolutional.Convolution1D(32,2))
model.add(k.layers.Activation('relu'))

# Only use one filter so that the output will be a sequence of 28 values, not a matrix.
model.add(k.layers.convolutional.Convolution1D(1,2))
model.add(k.layers.Activation('relu'))

# Change the shape from (None, 28, 1) to (None, 28)
model.add(k.layers.core.Flatten())

# Only one neuron as output to get the binary target.
model.add(k.layers.core.Dense(1))
model.add(k.layers.Activation('sigmoid'))

现在最后两步将从中获取你的张量

(无, 29, 32) -> (无, 28, 1) -> (无, 28) -> (无, 1)

我希望这可以帮助你。

附注如果您想知道 None 是什么,它是批次的维度,您不会一次喂入 1000 个样本,而是逐批次喂入它,并且由于该值取决于所选择的内容,按照惯例,我们设置 None。

EDIT :

进一步解释为什么序列长度在每一步都会丢失一个值。

假设你有一个包含 4 个值的序列[x1 x2 x3 x4],您想使用长度为 2 的过滤器[f1 f2]对序列进行卷积。第一个值将由下式给出y1 = [f1 f2] * [x1 x2],第二个将是y2 = [f1 f2] * [x2 x3],第三个将是y3 = [f1 f2] * [x3 x4]。然后你就到达了序列的末尾,无法再继续下去了。结果你有一个序列[y1 y2 y3].

这是由于滤波器长度和序列边界的影响造成的。有多个选项,有些用 0 填充序列以获得完全相同的输出长度...您可以使用参数选择该选项'padding'。你可以在这里阅读更多相关信息并找到不同的可能的值padding争论在这里。我鼓励您阅读最后一个链接,它提供了有关输入和输出形状的信息......

来自文档:

填充:“有效”或“相同”之一(不区分大小写)。 “有效”意味着“无填充”。 “same”会填充输入,使输出与原始输入具有相同的长度。

默认值为“有效”,因此您无需在示例中填充。

我还建议您将 keras 版本升级到最新。 Convolution1D 现在是 Conv1D,因此您可能会发现文档和教程令人困惑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keras 卷积层维数不匹配 的相关文章

随机推荐

  • Intent不设置相机参数

    我正在打开相机应用程序作为我的应用程序的外部意图 我使用以下代码来调用相机 以下是我的条件 它应该打开前置摄像头 最高的图像质量 闪光灯必须打开 以下是我的代码 Intent action new Intent android media
  • JQplot 在 IE 上的打印问题

    我正在尝试打印我的图表 它可以通过 Firefox 和 Chrome 正确打印 但如果我尝试用 IE 打印它 它会向我显示图表后面的图表画布 HTML 标签 正如你在图片中看到的那样 并且它还将图表轴文本放置在整个图表上 我尝试了下面的解决
  • 如何在C#中处理枚举0(CA1008讨论)

    Rule CA1008指定所有枚举都应该有一个0应该命名的值Unknown 我们不在这里讨论标志 我理解您想要防止未初始化的值自动获得含义的原因 假设我定义以下枚举 enum Gender Male Female class Person
  • 在反应中从另一个钩子调用钩子

    我对反应还很陌生 并试图简化一些开发 我有这个自定义挂钩useApi import useState from react import PetsApiFactory from petstore axios api import useKe
  • 每次调用方法时创建对象的新实例

    Messenger Default Register
  • ASP.net - 按钮 - Javascript 确认对话框 - 执行一些服务器端代码?

    我有一个简单的 ASP net 页面 用户可以在其中编辑有关自己的信息 单击 编辑 按钮时 表单进入编辑模式 并显示 保存 和 取消 按钮 其行为符合预期 我想做的是这样的 单击 保存 后 将显示一个 Javascript 确认对话框 询问
  • 对“DTLS_client_method”的未定义引用

    我目前正在尝试在 android 上实现 DTLS 以加密 UDP 数据报 为此 我构建了 openssl android 项目可以在这里找到 由此我得到了两个共享库 libssl so 和 libcrypto so 我将它们重命名为 li
  • Boost是如何实现这样的语法的呢?

    http www boost org doc libs 1 58 0 doc html program options tutorial html Declare the supported options desc add options
  • 从字符串中提取图像 src

    我试图将所有图像元素匹配为字符串 这是我的正则表达式 html match
  • 将闪亮与facet_grid结合起来

    我正在开展一个学校项目 其中有一些 dyplr 查询 我需要使用 Shiny 库使它们交互 现在我在 dyplr 中有一个查询 在那里我可以看到印度外卖餐厅每个国家的收入 我有以下查询 df gt group by Origin Jaar
  • Node 提供的 ejs 文件可以使用离线引导吗?

    我是节点和全栈开发的新手 希望我正确地提出这个问题 而不是粗心或冒犯您的特定理解水平 我的开发环境已连接互联网 但生产环境不会连接 我想将 bootstrap css 与节点一起使用 Apache httpd 不是生产环境中的一个选项 本地
  • 使用 MySQL Connector for .net 打开 MySQL 连接非常慢

    我正在尝试解决使用 MySQL Connector for net 打开连接时 MySQL 响应时间过长的问题 我已经使用 skip name resolve 安装了在 Azure VM Server 2008 上运行的 MySQL 5 5
  • 查找每个部门的最高薪水 - 是否有更有效的查询?

    我有一个有效的查询 但我怀疑我这样做效率低下 是否有更优雅的方法来查找每个部门的最高薪水以及赚取该薪水的员工 我正在做一个 cte 来查找每个部门 ID 的最高工资 然后通过匹配工资和部门 ID 将其与员工数据结合起来 我有下面的代码来构建
  • Slick2D 矩形碰撞检测

    我遇到一个问题 显示一个矩形与另一个矩形发生碰撞 所以我的问题是 如何获得相交方法来检查碰撞 或者说有其他方法来处理这种情况下的碰撞吗 我正在创建一款回合制战斗游戏 类似于 最终幻想 或 龙骑兵传奇 其中玩家的角色位于屏幕的右侧 敌人位于屏
  • 当我执行“git diff”时,如何获得并排差异?

    当我打字时git diff 我想看到并排的差异 就像diff y 或者喜欢在交互式差异工具中显示差异 例如kdiff3 如何才能做到这一点 尝试 git difftool Use git difftool代替git diff 你永远不会回去
  • MYSQL REGEXP 在 JSON 字符串中搜索

    我是 regexp 的初学者 我尝试在 json 格式的文本中搜索 但我无法使其正常工作 SELECT DISTINCT tag body FROM pages WHERE body REGEXP BINARY listeListeOuiN
  • 动态绘图在 IDLE 中有效,但在 Jupyter Notebook 中无效

    下面的代码在空闲状态下运行时工作正常 Python 3 6 空闲状态 import matplotlib pyplot as plt import time import random matplotlib inline ysample r
  • 让柱形图在图表控件中重叠

    我有以下问题 我需要在图表控件中显示多个列 一个图表区域中大约有七个系列 现在 当我有一个 列 类型的图表时 所有七列都会并排显示 我想做的就是将它们重叠 这可能吗 以下两个解决方案对我没有帮助 绘制重叠柱形图或条形图 图表控制两个数据集条
  • 当前无法从软件更新服务器获取 Xcode

    更新到 OS X 10 9 后 我的 macport 出现问题 我尝试遵循本手册https trac macports org wiki Migration修复它们 但是当我安装命令行工具时 xcode 选择 安装 我收到消息 无法安装该软
  • Keras 卷积层维数不匹配

    我正在尝试使用 Keras 来构建我的第一个神经网络 我的经验为零 我似乎无法弄清楚为什么我的维度不正确 我无法从他们的文档中弄清楚这个错误在抱怨什么 甚至是哪个层导致了它 我的模型接受 32 字节的数字数组 并应该在另一侧给出一个布尔值