我已经编写了一个简单的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)
第一次拟合不起作用,并引发以下错误。但是第二个作品。这很有趣,因为它们具有完全相同的基础数据
答案 0 :(得分:1)
好吧,看来您正在使用tensorflow 2.0是因为对.numpy()
的调用,我相信它在1.13上不存在(也许您已经意识到,但是您可以使用tf.__version__
检查版本)
如果您打算使用1.13,则需要进行2处更改,以允许对fit
的调用正确执行。
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)