Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tf.keras.models.Sequential模型无法与输入类型tf.Tensor匹配_Python_Tensorflow - Fatal编程技术网

Python tf.keras.models.Sequential模型无法与输入类型tf.Tensor匹配

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

我已经编写了一个简单的tf.keras.models.Sequential模型。当我尝试用数据和标签来拟合tf.Tensor时,它会给我一些错误。但是,我可以将它与具有完全相同底层数据的numpy数组配合使用。为什么

我使用的是只有CPU的tensorflow 1.13。我检查了tf.keras.models.Sequential的函数,但它说tf.Tensor和numpy数组都可以用作数据和标签,只要它们的类型匹配

将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
的调用无误地执行

  • 必须将输入张量转换为float32类型
  • 必须为每个历元传递一个
    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上拟合模型时,应将每个历元的步长作为参数添加。