下午好,
我有一个 Keras 模型,该模型有两个输入。输入通过编码层进行处理,然后在下一层中连接输出。
对于 .fit 方法,有一个名为"shuffle"的参数,我通常将其保留在 True 上,但在这种情况下我有点不确定。
输入相互依赖。事实上,第二个输入是特定特征中第一个输入的补充。在这种情况下设置 shuffle=True 会是一个坏主意吗?
假设我关注的功能具有"真"或"假"值。如果 Input1 对于此功能的值为"True",我希望输入 Input2 的值为"False"。
如果我将shuffle设置为True,我最终会得到"True"-"True"作为网络的输入吗?
随机参数的答案
洗牌不会对这种特殊情况产生不良影响。数组将被洗牌在一起。例如,假设您有以下两个阵列连接到网络。
x1 = np.array([19, 0, 17, 15, 9, 15, 10, 4, 18, 3, 18, 8, 12, 11, 8, 12, 10,
9, 11, 8])
x2 = np.array([18, 13, 2, 17, 14, 0, 9, 15, 1, 1, 5, 7, 14, 1, 13, 10, 12,
12, 9, 16])
这两个数组可以一起洗牌,首先生成洗牌索引,然后按洗牌索引为每个数组编制索引。
indices = np.arange(x1.shape[0])
np.random.seed(123)
x1 = x1[indices]
x2 = x2[indices]
print(x1)
# [ 8 15 9 9 18 4 8 12 19 12 10 3 8 18 15 0 10 11 17 11]
print(x2)
# [13 0 14 12 1 15 16 14 18 10 12 1 7 5 17 13 9 9 2 1]
从上面的print
输出中可以看出,数据点的相对位置被保留下来。例如 8 英寸x1
英寸和13
x 2were both at index
14 英尺。但是在洗牌之后,两者都已移至索引 0。Keras 在传递 shuffle 参数时使用相同的方法。
在 keras 中,洗牌可以在整个训练数据集或批处理级别完成。官方文件指出:
布尔值(是否在每个时期之前打乱训练数据)或 str(用于"批处理")。当 x 是生成器时,将忽略此参数。"批处理"是处理 HDF5 数据限制的特殊选项;它以批量大小的块洗牌。当steps_per_epoch不是 None 时不起作用。
关于投入依存性的讨论
前馈神经网络的输入的假设之一是它们是独立的。但是,在您的情况下,您有两个输入,其中第二个输入取决于第一个输入。这违反了独立的假设。一种可能的解决方案是使用假设输入之间存在依赖性的神经网络。例如,递归神经网络(RNN)是此类问题的不错选择。