我从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个观测值。
解决方案是简单地提供x
和y
作为张量或数组,而不是张量列表:
x = np.array(sizes)
(或者tf.constant
也可以(。
y
也是如此。然后,Keras将输入解释为x
的6个变量的4个观测值,以及y
的4个变量的四个观测值。