如何在Tensorflow 2中正确训练和预测



我从Tensorflow开始,并试图为一个简单的分类问题,但我无法正确匹配输入和输出形状,当我这样做时,我无法调用"预测";在Keras模型上。

比方说,我想根据虚拟的尺寸/测量来识别人。

问题似乎是我无法获得输入和输出形状匹配正确,当我匹配时,我不能调用";预测";在Keras模型上。到目前为止,我拥有的是:

#!python
import tensorflow as tf
print("TensorFlow version:", tf.__version__)

TensorFlow版本:2.6.0

这是我想要训练模型的有限数据集(我知道它需要要大得多,但首先让我们编译它(";

# The names of people I want to identify
names = sorted({"Jack", "John", "Peter", "X"})
# The fictive sizes for each:
sizes = [
[0.0, 0.5, 0.6, 0.7, 0.8, 0.3], # Jack's sizes
[0.2, 0.6, 0.7, 0.8, 0.5, 0.2], # John's sizes
[0.0, 0.1, 0.1, 0.4, 0.8, 0.9], # Peter's sizes
[0.3, 0.9, 0.2, 0.1, 0.0, 0.8]  # X's sizes
]

然后,我创建了一个Keras Sequential模型,其中有6个输入,每个大小一个4个输出,每个名称一个概率。中间层可能更好但我正在努力消除这里可能出现的所有问题:

model = tf.keras.models.Sequential([
tf.keras.layers.Dense(name="inputs",  units=len(sizes[0]), activation='relu'),
tf.keras.layers.Dense(name="outputs", units=len(names), activation='relu')
])

据我所知,这被称为";一热";,其中每个输出生成该分类(名称(的概率;热";,测量值接近1.0。这就是我用来编译模型的东西:

model.compile(
optimizer='adam',
loss=tf.keras.losses.CategoricalCrossentropy(), # one-hot
metrics=['accuracy']
)

下一步是训练模型。据我所知,model.fit()可以处理两个数组,X和Y,其中X包含输入张量并且Y包含期望的输出张量(因此X[0]应该产生Y[0]等(。这似乎是最简单的设置,所以我做了:

x = [tf.constant(s) for s in sizes] # Stack size Tensors for all names
y = [tf.constant(i) for i in [ # Stack categorization probabilities for each x -> y
[1.0, 0.0, 0.0, 0.0], # Jack's index
[0.0, 1.0, 0.0, 0.0], # John's index
[0.0, 0.0, 1.0, 0.0], # Peter's index
[0.0, 0.0, 0.0, 1.0]  # X's index
]]

当我呼叫时

model.fit(x, y, epochs=5)

我得到以下错误:

ValueError: Data cardinality is ambiguous:
x sizes: 6, 6, 6, 6
y sizes: 4, 4, 4, 4
Make sure all arrays contain the same number of samples.

这很奇怪,因为我的X和Y数据集大小完全相同,每个张量X中包含模型的6个输入的6个值,Y中的每个张量包含模型中输出的4个值。

请帮我理解我在这里做错了什么。我希望能够训练模型,然后在其上调用model.predict([0.0, 0.5, 0.6, 0.7, 0.8, 0.3])然后得到概率,表明这很可能是Jack的测量结果。

问题在于向model.fit提供输入的方式。如果x或y是张量/数组的列表,则该列表的每个元素被解释为"x";"单独输入";,即不同变量的观测值。在您的情况下,模型为x获得4个不同的变量,每个变量有6个观测值,为y获得4个不相同的变量,每一个变量有4个观测值。

解决方案是简单地提供xy作为张量或数组,而不是张量列表:

x = np.array(sizes)(或者tf.constant也可以(。

y也是如此。然后,Keras将输入解释为x的6个变量的4个观测值,以及y的4个变量的四个观测值。

相关内容

  • 没有找到相关文章

最新更新