使用元数据而不是图像训练模型

时间:2021-05-06 17:30:19

标签: python tensorflow keras

我想做一个只有元数据(年龄、性别)作为输入的多层感知器。经过一些研究,我决定使用一个包含 500 个神经元的全连接层,然后是一个大小为 8 的 softmax 层(有 8 个类别)。

我使用一种热编码将元数据排列在数组中。一个数组的大小为 6。前两列与性别相关,其他 4 列与年龄相关。下面是一个例子:

Metadata_Array=
[[0  1  0  0  1  0 ],   #female, age 15
 [1  0  0  0  0  1 ],   #male, age 20
 [0  1  1  0  0  0]]    #female, age 5

这是我的代码:

#creating the metadata model
model= Sequential()
model.add(FClayer(neurons=500, activation="linear"))
model.add(tf.keras.layers.Dense(units=8, activation="softmax")))

如何仅使用 metadata_array 训练我的模型,即不使用图像? 如果我要使用图像,我可以使用 fit,但它如何处理非图像“适合”?

1 个答案:

答案 0 :(得分:1)

fit() 是一种通用方法,您可以在大多数机器学习库(Keras/Tensorflow、scikit-learn 等)中找到。这意味着训练你的模型,它不依赖于输入数据是图像。该名称来自于“拟合”模型的输出以匹配目标(如果您将模型的输出想象为 X 和 Y 坐标的简单图形,则您正在拟合曲线以匹配数据)。

不过,您滥用了一种热编码。在一个热编码中,只有一个元素可以是非零的。哪个元素不为零告诉您样本属于哪个类别。例如,你说的有 8 个类别,这意味着你想要一个 8 元素的数组,而不是一个 6 元素的数组。

只是为了说明,让我们对一周中的几天(周一、周二、周三等)进行热编码:

[1, 0, 0, 0, 0, 0, 0] == monday
[0, 1, 0, 0, 0, 0, 0] == tuesday
[0, 0, 1, 0, 0, 0, 0] == wednesday
[0, 0, 0, 1, 0, 0, 0] == thursday
[0, 0, 0, 0, 1, 0, 0] == friday
[0, 0, 0, 0, 0, 1, 0] == saturday
[0, 0, 0, 0, 0, 0, 1] == sunday

现在假设您想跟踪一天中的小时,而不仅仅是一周中的哪一天:那么您每天需要 24 个元素(每小时一个),乘以 7 天每个星期。每天的每一小时都属于它自己的类别。

因此,您尝试对“女性,15 岁”和“女性,5 岁”进行编码的方式行不通。您需要为每个类别设置一个类别,并为所有其他可能的年龄设置一个类别(请注意,有比这更好的设置问题的方法)。