我是tensorflow的新手。正在尝试开发一个具有多个输入和单一输出的简单模型。如果有人能帮助我,我将不胜感激。我找到了以下可能有效的代码,但它不起作用。另外,在这种情况下,我应该如何传递预测参数?
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
评分。供参考,您可以从以下链接找到tensorflow中r2评分的实现,或者使用tfa.metrics.RSquare。
让我们构建一个模型,它将对两个整数输入进行简单的求和。为此,我们首先创建一个虚拟数据集。
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.]))
模型
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/30094/94 - 0s - loss: 10816206.0000 - mae: 2846.8416Epoch 2/30094/94 - 0s - loss: 7110172.5000 - mae: 2301.0493Epoch 3/30094/94 - 0s - loss: 3619359.5000 - mae: 1633.6898........Epoch 298/30094/94 - 0s - loss: 9.3060e-07 - mae: 7.4665e-04Epoch 299/30094/94 - 0s - loss: 9.3867e-07 - mae: 7.5240e-04Epoch 300/30094/94 - 0s - loss: 7.2407e-07 - mae: 6.6270e-04
推理
模型期望两个输入形状为(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)