Python tf.keras.models.Sequential模型无法与输入类型tf.Tensor匹配
我已经编写了一个简单的tf.keras.models.Sequential模型。当我尝试用数据和标签来拟合tf.Tensor时,它会给我一些错误。但是,我可以将它与具有完全相同底层数据的numpy数组配合使用。为什么 我使用的是只有CPU的tensorflow 1.13。我检查了tf.keras.models.Sequential的函数,但它说tf.Tensor和numpy数组都可以用作数据和标签,只要它们的类型匹配Python tf.keras.models.Sequential模型无法与输入类型tf.Tensor匹配,python,tensorflow,Python,Tensorflow,我已经编写了一个简单的tf.keras.models.Sequential模型。当我尝试用数据和标签来拟合tf.Tensor时,它会给我一些错误。但是,我可以将它与具有完全相同底层数据的numpy数组配合使用。为什么 我使用的是只有CPU的tensorflow 1.13。我检查了tf.keras.models.Sequential的函数,但它说tf.Tensor和numpy数组都可以用作数据和标签,只要它们的类型匹配 将tensorflow导入为tf tf.enable_eager_execut
将tensorflow导入为tf
tf.enable_eager_execution()
#非常简单的keras序列模型
模型=tf.keras.Sequential([
tf.keras.layers.Dense(3,活化='relu'),
tf.keras.layers.Dense(3,activation='softmax'))
编译(优化器=tf.train.AdamOptimizer(0.001),
损失class='classifical_crossentropy',
指标=[‘准确度’])
#使用tf.Tensor作为数据和标签
数据=tf.常数([[0,0,1],[0,1,0],[1,0,0])
label=tf.常数([[0,0,1],[0,1,0],[1,0,0]])
#这会引发以下错误
#InvalidArgumentError:使用输入dim 2索引超出范围;输入只有2个dims[Op:Straddslice]名称:Straded_slice/
model.fit(数据、标签、时代=10)
#使用具有相同基础数据和标签的numpy数组
data=data.numpy()
label=label.numpy()
#这很有效
model.fit(数据、标签、时代=10)
第一次拟合不起作用,并引发以下错误。但第二种方法有效。这很有趣,因为它们有着完全相同的底层数据好的,看起来您可能正在使用tensorflow 2.0,因为调用了
.numpy()
,我认为这在1.13上不存在(也许您已经意识到,但您可以使用tf.\uuuu version\uuuuu
)
如果您打算使用1.13,则需要进行2次更改,以允许对fit
的调用无误地执行
steps\u
参数model = tf.keras.Sequential([
tf.keras.layers.Dense(3, activation='relu'),
tf.keras.layers.Dense(3, activation='softmax')])
model.compile(optimizer=tf.train.AdamOptimizer(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
data = tf.constant([[0,0,1],[0,1,0],[1,0,0]], dtype=tf.float32)
label = tf.constant([[0,0,1],[0,1,0],[1,0,0]], dtype=tf.float32)
model.fit(data, label, epochs=10, steps_per_epoch=2)
1.有趣的是,我的tensorflow是1.13.1,不确定这是否是Tensor.numpy()存在的原因。2.解决方案确实有效。但是我可以理解为什么我以前的代码不起作用吗?看起来tensorflow文档没有禁止使用tf.Tensor作为输入,没有指定每个历元的步骤。我不确定我能否回答“为什么”这个问题。我在没有
步骤的情况下运行了它,并出现了一条错误消息,告诉我添加它。我添加了它,它工作了。因此,上面的答案是:-)后来我发现在导入tensorflow之后,我忘了放置tf.enable_eager_execution()(这实际上是在我本地运行的代码中),这是一个棘手的部分。如果没有这句话,就不能在tf.Tensor上调用numpy(),我会得到同样的提示,要求我像你的例子一样,在每个历元上放置步数。启用enable_eager_execution后,我将得到在代码中显示为注释的错误消息,它会给出一些意外的输出和错误消息,在这种情况下使调试更加困难。我的代码中有两个问题:1。tf.enable_eager_执行已打开。这样做的好处是允许在tf.Tensor上调用numpy(),但在模型拟合时给出不清楚的错误消息。它并没有告诉我将steps\u per\u epoch作为一个参数添加到fit调用中,而是将我在代码中显示为注释的错误消息打印出来。我学到的一个教训是在执行时要小心。2.在tf.Tensor上拟合模型时,应将每个历元的步长作为参数添加。