tf.keras.models.Sequential模型不适合输入类型tf.Tensor

时间:2019-05-11 07:46:25

标签: python tensorflow

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

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

import tensorflow as tf
tf.enable_eager_execution()

# very simple keras Sequential model
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'])

# use tf.Tensor as data and label
data = tf.constant([[0,0,1],[0,1,0],[1,0,0]])
label = tf.constant([[0,0,1],[0,1,0],[1,0,0]])
# This throws the following error
# InvalidArgumentError: Index out of range using input dim 2; input has only 2 dims [Op:StridedSlice] name: strided_slice/
model.fit(data, label, epochs=10)

# use numpy array with the same underlying data and label
data = data.numpy()
label = label.numpy()
# This works
model.fit(data, label, epochs=10)


第一次拟合不起作用,并引发以下错误。但是第二个作品。这很有趣,因为它们具有完全相同的基础数据

1 个答案:

答案 0 :(得分:1)

好吧,看来您正在使用tensorflow 2.0是因为对.numpy()的调用,我相信它在1.13上不存在(也许您已经意识到,但是您可以使用tf.__version__检查版本)

如果您打算使用1.13,则需要进行2处更改,以允许对fit的调用正确执行。

  1. 您必须将输入张量转换为类型float32
  2. 您必须传递一个steps_per_epoch参数

例如,此代码不会引发任何错误:

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)