gpt4 book ai didi

python - 卷积层不匹配中的 Keras 维度

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:14 27 4
gpt4 key购买 nike

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

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

arr1 是 32 字节数组,arr2 是 bool 数组。

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,)

我收到的错误是:

Traceback (most recent call last): File "cnn/init.py", line 50, in inputData,labelData File "/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/models.py", line 863, in fit initial_epoch=initial_epoch) File "/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/engine/training.py", line 1358, in fit batch_size=batch_size) File "/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/engine/training.py", line 1238, in _standardize_user_data exception_prefix='target') File "/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/engine/training.py", line 128, in _standardize_input_data str(array.shape)) ValueError: Error when checking target: expected activation_5 to have 3 dimensions, but got array with shape (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”张量。如果您将 dense(1) 层应用于输入 [28, 32],它会产生一个形状为 (32,1) 的权重矩阵,并将其应用于 28 个向量,这样您会发现自己有 28 个输出大小为 1。

我建议解决此问题的方法是像这样更改最后 2 层:

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。

编辑:

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

假设您有一个包含 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' 选择该选项。你可以read more about this here并找到不同的 values possible for the padding argument here .我鼓励您阅读最后一个链接,它提供了有关输入和输出形状的信息...

来自文档:

padding: One of "valid" or "same" (case-insensitive). "valid" means "no padding". "same" results in padding the input such that the output has the same length as the original input.

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

我还建议您将 keras 版本升级到最新版本。 Convolution1D 现在更名为 Conv1D,因此您可能会对文档和教程感到困惑。

关于python - 卷积层不匹配中的 Keras 维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45120429/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com