使用自定义维度输入 tensorflow 或 keras 神经网络

Posted

技术标签:

【中文标题】使用自定义维度输入 tensorflow 或 keras 神经网络【英文标题】:Feed tensorflow or keras neural nets input with custom dimensions 【发布时间】:2018-04-27 20:05:44 【问题描述】:

我想提供以下形状的神经网络输入: 每个训练条目都是一个尺寸为 700x10 的二维数组。共有204个培训条目。 标签只是大小为 204 的一维数组(二进制输出)

我尝试只使用密集层:

model = Sequential()
model.add(Dense(300, activation='relu', input_shape=(700, 10)))
model.add(Dense(1, activation='sigmoid'))

然后我收到以下错误(与第一层的 input_shape 无关,但在输出验证期间):

ValueError: Error when checking target: expected dense_2 to have 3 dimensions, but got array with shape (204, 1)

204 - 训练数据量。

堆栈跟踪:

    model.fit(xTrain, yTrain, epochs=4, batch_size=6)
  File "keras\models.py", line 867, in fit
    initial_epoch=initial_epoch)
  File "keras\engine\training.py", line 1522, in fit
    batch_size=batch_size)
  File "keras\engine\training.py", line 1382, in _standardize_user_data
    exception_prefix='target')
  File "keras\engine\training.py", line 132, in _standardize_input_data

我在调试 Keras 代码时发现的:

在训练前的验证期间失败。它验证输出数组。

根据神经网络结构,第一个 Dense 层以某种方式产生 700 个一维输出,然后它失败了,因为我的输出只是包含 204 的一维数组。

我该如何克服这个问题?我试图在 Dense() 层之后添加 Flatten(),但它可能会以一种不好的方式影响准确性:我想保留特定于 700 个数组分组中的一个点的信息。

【问题讨论】:

【参考方案1】:

Dense 层仅适用于最后一个维度。

如果您向其输入(700,10),它将输出(700,units)。检查您的model.summary() 以查看此内容。

一个简单的解决方案是在应用密集之前扁平化您的数据:

model.add(Flatten(input_shape=(700,10)))
model.add(Dense(300,...))
model.add(Dense(1,...))

这样,密集层将看到一个简单的(7000,) 输入。


现在,如果您确实希望您的模型能够分别理解这两个维度,您或许应该尝试更精细的结构。做什么很大程度上取决于你的数据是什么,你想做什么,你希望你的模型如何理解它等等。

【讨论】:

好的,感谢您提供 model.summary() 提示!将尝试进一步调查 Keras 及其提供的更彻底的功能 你能描述一下数据吗?例如,如果 700 个向量是时间步长,您可以使用循环网络,如 GRU 和 LSTM。如果是物理长度,使用 1D 卷积可能会很有趣。

以上是关于使用自定义维度输入 tensorflow 或 keras 神经网络的主要内容,如果未能解决你的问题,请参考以下文章

加载自定义模型时 Tensorflow keras 模型到 opencv 错误(C++)

tensorflow2.0 squeeze出错

谷歌分析核心报告 API;或使用自定义维度过滤

TensorFlow 训练在音频分类器的第一个时期的最后一步崩溃

如何在 Tensorflow 2.x Keras 自定义层中使用多个输入?

Tensorflow训练识别自定义图片