【发布时间】:2017-12-24 03:26:38
【问题描述】:
我有一个按如下定义的顺序模型:
model = Sequential([
BatchNormalization(axis=1,input_shape=(2,4)),
Flatten(),
Dense(256, activation='relu'),
BatchNormalization(),
Dropout(0.1),
Dense(2, activation='softmax')
])
我想更改此模型以获取可变形状的输入。具体来说,第一个维度需要是可变的。 阅读specifying the input shape 上的 Keras 文档,我发现您可以在 input_shape 元组中使用 None 条目,其中 None 表示可能需要任何正整数。
使用我现有的模型,如果我将 input_shape 从 (2,4) 更改为 (None,4),我会收到以下错误:
---> Dense(2, activation='softmax')
TypeError: an integer is required
我不肯定,但我不相信当模型包含 Flatten() 层时可以指定可变输入形状。我读过 Flatten() 需要知道输入形状,因此可变输入形状与 Flatten() 不兼容。 如果我删除 Flatten() 层,我会收到与上面相同的错误。我不希望这个模型在没有 Flatten() 层的情况下也能工作,因为我认为输入在传递到 Dense 层之前必须被展平。
鉴于此,谁能解释我如何能够利用可变输入形状?如果这里的问题是 Flatten() 层,那么考虑到输入应该在传递到密集层之前被展平,有什么方法可以解决这个问题?
提前感谢您的任何建议。
编辑: 举一个潜在训练集的例子—— 对于上面显示的 input_shape=(2,4) 模型,训练集可能如下所示,其中集合中的每个二维数组的形状为 (2,4):
x_train = np.array([
[[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99]],
[[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99]],
[[1.01 ,1, 1.2, 1.2], [1.3, 1.2, 0.89, 0.98]]
])
对于 input_shape = (None,4) 的数据,其中每个数据点的第一个维度的形状可以变化,第二个维度固定为 4,训练集可能如下所示:
x_train = np.array([
[[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99], [1.1, 1.2, 0.91, 0.99]],
[[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99]],
[[1,1,1,1], [1.3, 1.2, 0.89, 0.98], [1,1,1,1], [1,1,1,1]]
])
【问题讨论】:
-
你能解释一下你的数据形状吗?为什么会有变数?您是在谈论可以变化的样本数量吗?还是功能会有所不同?
-
@VivekKumar 我说的是功能可能会有所不同。例如,在上面的模型中,我传递了形状为 (2,4) 的输入。示例:[[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99]] 但我需要模型能够接受输入可变的第一维。因此,某些输入可能具有形状 (2,4),例如,就像上面示例中所示的那样,而其他输入可能具有形状 (3,4) 或 (4,4) 或 (5,4),等形状 (3,4) 的示例输入:[[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99], [1.3, 1.2, 0.89, 0.98]]。
-
是的,这就是我要问的。在二维数据数组中,第一维代表样本,而不是特征。这意味着您的样本正在发生变化并且功能是相同的。您应该指定
input_shape=(4)。 -
感谢@VivekKumar,但我认为这不正确。在 input_shape=(4) 的情况下,模型期望每个数据点都是长度为 4 的单个一维数组。情况并非如此。我的整个数据集不是包含长度为 4 的子一维数组的二维数组。该集中的每个数据点都是一个二维数组,其中可能有 2,3,4,5,...,该二维数组中的 n 个长度为 4 的一维数组。 x_train = np.array([ [[1,1,1,1], [1,2,3,9], [1,1,1,1]], [[1,2,2,2], [1,1,1,7]], [[1,1,1,1],[1,1,5,2],[1,2,1,1],[1,2,2,2 ]] ])
-
对原始帖子添加了一个编辑,以更好地显示示例训练集。
标签: python neural-network deep-learning keras theano