[英]TensorFlow model with multiple inputs and single output
我是tensorflow的新手。 尝试开发具有多个输入和单个 output 的简单 model。 如果有人可以帮助我,我将不胜感激。 我发现以下代码可能有效,但无效。 另外,在这种情况下如何传递预测参数?
trainx1 = np.array([-1, 0, 1, 2, 3, 4], dtype=float)
trainx2 = np.array([-1, 0, 1, 2, 3, 4], dtype=float)
labely1 = np.array([-2, 0, 2, 4, 6, 8], dtype=float)
x1 = Input(shape =(1,))
x2 = Input(shape =(1,))
input_layer = concatenate([x1,x2])
hidden_layer = Dense(units=4, activation='relu')(input_layer)
prediction = Dense(1, activation='linear')(hidden_layer)
model = Model(inputs=[x1, x2], outputs=prediction)
model.compile(loss="mean_squared_error",
optimizer="adam", metrics=['accuracy'])
model.fit([trainx1, trainx2], labely1,
epochs=100, batch_size=1, verbose=2, shuffle=False)
model.summary()
首先, accuracy
指标对回归任务意义不大,更适合分类问题。 相反,可以使用回归mae
或r2
分数。 仅供参考,从以下链接中,您可以找到r2分数或tfa.metrics.RSquare的tensorflow实现。
让我们构建一个 model,它将对两个 integer 输入进行简单求和。 为此,让我们首先创建一个虚拟数据集。
import numpy as np
import tensorflow as tf
inp1 = np.array([i-1 for i in range(3000)], dtype=float)
inp2 = np.array([i-1 for i in range(3000)], dtype=float)
tar = np.array([(input[0] + input [1]) \
for input in zip(inp1, inp2)], dtype=float)
inp1.shape, tar.shape
((3000,), (3000,))
inp1[:5], tar[:5]
(array([-1., 0., 1., 2., 3.]), array([-2., 0., 2., 4., 6.]))
Model
import tensorflow as tf
from tensorflow.keras import Input
from tensorflow.keras import Model
from tensorflow.keras.layers import *
x1 = Input(shape =(1,))
x2 = Input(shape =(1,))
input_layer = concatenate([x1,x2])
hidden_layer = Dense(units=4, activation='relu')(input_layer)
prediction = Dense(1, activation='linear')(hidden_layer)
model = Model(inputs=[x1, x2], outputs=prediction)
编译并运行
model.compile(loss="mean_squared_error",
optimizer='adam',
metrics=['mae'])
model.fit([inp1, inp2], tar, epochs=300,
batch_size=32, verbose=2)
Epoch 1/300
94/94 - 0s - loss: 10816206.0000 - mae: 2846.8416
Epoch 2/300
94/94 - 0s - loss: 7110172.5000 - mae: 2301.0493
Epoch 3/300
94/94 - 0s - loss: 3619359.5000 - mae: 1633.6898
....
....
Epoch 298/300
94/94 - 0s - loss: 9.3060e-07 - mae: 7.4665e-04
Epoch 299/300
94/94 - 0s - loss: 9.3867e-07 - mae: 7.5240e-04
Epoch 300/300
94/94 - 0s - loss: 7.2407e-07 - mae: 6.6270e-04
推理
model 需要两个形状为(None, 1)
和(None, 1)
的输入。 因此,我们为每个输入扩展了一个批量维度( expand_dims
),如下所示。
model([np.expand_dims(np.array(4), 0),
np.expand_dims(np.array(4), 0)]).numpy()
array([[7.998661]], dtype=float32)
model([np.expand_dims(np.array(10), 0),
np.expand_dims(np.array(10), 0)]).numpy()
array([[19.998667]], dtype=float32)
model([np.expand_dims(np.array(50), 0),
np.expand_dims(np.array(40), 0)]).numpy()
array([[88.77226]], dtype=float32)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.