Python 模型(x)和预测模型(x)之间的差异

Python 模型(x)和预测模型(x)之间的差异,python,tensorflow,keras,Python,Tensorflow,Keras,下面是一个简单的tensorflow函数API模型 input1 = tf.keras.layers.Input(shape=(2,), dtype='float32') output1 = tf.keras.layers.Dense(2)(input1) model = tf.keras.Model(inputs=input1, outputs=output1) 在函数API的一些示例中,使用model()获得输出,但也有model.predict() 在我上面的例子中,predict起作用

下面是一个简单的tensorflow函数API模型

input1 = tf.keras.layers.Input(shape=(2,), dtype='float32')
output1 = tf.keras.layers.Dense(2)(input1)
model = tf.keras.Model(inputs=input1, outputs=output1)
在函数API的一些示例中,使用model()获得输出,但也有model.predict()

在我上面的例子中,predict起作用:

model.predict([[[1.1, 2.2]]])
>> array([[1.8761028 , 0.20520687]], dtype=float32)
但如果仅运行模型,则会出现错误:

model([[[1.1, 2.2]]])
>> ... InvalidArgumentError: In[0] is not a matrix [Op:MatMul]
区别是什么?为什么会发生错误

谢谢


Julian

错误状态
model()
需要一个矩阵作为输入,您在其中提供了一个列表

要解决此问题,只需将其转换为矩阵:

model(tf.Variable([[[1.1, 2.2]]]))


关于
model()
model.predict()之间的区别

“使用模型()获得输出”的代码:

你会问,这有什么相似之处

在代码中,通过在此
input1
对象上调用
Dense
层,在层图中创建一个新节点。
“层调用”操作就像从
input1
到您创建的层绘制一个箭头。
您将输入“传递”到稠密层,然后输出
output1

在参考代码中,他们将
模型
视为一个层,并进行“层调用”。
看到相似之处了吗

output     = Dense(input)
left_proba = model(obs[...])
反过来,这将创建执行其他操作的新节点(在后面的3行中)。
当您希望获取现有模型并将其用作组件(或“层”)以构建另一个新模型时,这非常有用


对于模型推理,您将始终通过
y=model来实现。预测(x)

请链接到“使用模型()获得输出”的示例。以下是Aurélion Géron的《使用Scikit Learn、Keras&Tensorflow进行机器学习的实践》(第二版)一书中的示例。第18章的笔记本在这里。如果你在页面上搜索“model(obs[np.newaxis]),你会看到他在哪里使用这个语句来获得网络的预测,以便计算训练梯度。我理解你的观点,即可以将模型视为一个层。我的问题是关于以这种方式使用模型时的输出与调用.predict()时的输出之间的差异。在这两种情况下,您都需要模型的结果。在我的简单示例中,为什么.predict()生成结果,而model()生成错误。如果要使用函数API将模型用作另一个网络的一部分,请使用Layer()(model)。如果你想得到模型给出的答案(它有相同的神经元,在相同的数据上具有相同的权重和偏差),你可以使用.predict()。哦,我现在明白了。正如错误所述,
model()
需要一个矩阵作为输入,您在其中提供了一个列表。要解决这个问题,只需将其转换为矩阵,即
模型(tf.变量([[[1.1,2.2]])
模型(np.数组([[1.1,2.2]])
。我也会把这个写在答案里。非常感谢。这是有道理的。我可以看到model()的输出是一个张量,如果要将其用作另一个模型的输入,则需要张量。i、 e.使用功能API。.predict()方法生成非张量结果。
left_proba = model(obs[np.newaxis])              # <--- HERE
action = (tf.random.uniform([1, 1]) > left_proba)
y_target = tf.constant([[1.]]) - tf.cast(action, tf.float32)
loss = tf.reduce_mean(loss_fn(y_target, left_proba))
output1 = tf.keras.layers.Dense(2)(input1)
output     = Dense(input)
left_proba = model(obs[...])