我正在尝试使用TensorFlow构建一个神经网络,并使用tf.layers.dense接口。我想弄清楚如何让TensorFlow将所有特征视为特征集。
一个例子:
将一组人分类为好/坏的篮球队(0-坏,1-好)。每个人都有自己的特征(性别、年龄、身高、体重、打篮球的年数)。要将整个团队分类为好或坏,神经网络必须看到5个人的特征,输出应为0或1。
现在在这个例子中,我如何让网络看到与不同人相关的所有不同特征,并输出一个单一的分类数字?
我认为这与输入张量的形状有关,我尝试将张量形状设为[batch_size, number_of_players, number_of_features],看起来像这样:
[ [[gender, age, height, weight, years_playing_basketball], [gender, age, height, weight, years_playing_basketball], [gender, age, height, weight, years_playing_basketball], //team1 [gender, age, height, weight, years_playing_basketball], [gender, age, height, weight, years_playing_basketball]], [[gender, age, height, weight, years_playing_basketball], [gender, age, height, weight, years_playing_basketball], [gender, age, height, weight, years_playing_basketball], //team2 [gender, age, height, weight, years_playing_basketball], [gender, age, height, weight, years_playing_basketball]]]
自然地,在通过几个tf.layers.dense层后,输出也将是一个3D张量,而我只需要一个单一的数字作为输出。另一方面,如果我将所有团队特征放入一个单一的数组中,我认为网络将无法知道这些实际上是5个不同人的特征。感谢您的帮助!
回答:
自然地,在通过几个tf.layers.dense层后,输出也将是一个3D张量,而我只需要一个单一的数字作为输出。
您需要一个包含batch_size
个不同输出的1D张量,对吗?每个完整团队在批次中有一个输出。
另一方面,如果我将所有团队特征放入一个单一的数组中,我认为网络将无法知道这些实际上是5个不同人的特征。
这是最常见的解决方案,可能也是最好的方案。绝对是最简单的。这个解决方案只有在您确定每个团队总是有5个人时才有效,我认为这是一个安全的假设?
这种解决方案通常被称为“展平”(在许多框架中,您可以使用名为flatten
的函数将(number_of_players, number_of_features)
张量转换为(number_of_players * number_of_features)
张量)。是的,您的看法是正确的,神经网络无法“知道”团队成员X的年龄特征与团队成员Y的年龄特征同样重要,或者“知道”团队成员X的年龄和性别特征彼此之间的关系比团队成员X的年龄特征与团队成员Y的性别特征之间的关系更密切…但这通常没问题。如果学习这些关系变得重要,它仍然可以做到。
另外一个提示:如果同一团队中不同人的出现顺序无关紧要(例如,如果没有某种重要且一致的基于位置的排序),我建议通过将您已有的团队的洗牌版本也包含到数据中来增强您的数据。例如,如果您的数据包含一个团队[P1, P2, P3, P4, P5](其中每个P是一组对应一个人的特征),我会通过添加团队[P2, P1, P3, P4, P5]和团队[P3, P1, P2, P4, P5]等来增强数据集。您基本上可以添加所有可能的排列组合。