【发布时间】:2021-04-22 10:48:02
【问题描述】:
我有一个类似的模型
inputA = tf.keras.layers.Input(shape=(40,40))
inputB = tf.keras.layers.Input(shape=6)
a = tf.keras.layers.Conv2D(...)(inputA)
...
b = tf.keras.layers.Dense(...)(inputB)
combined = tf.keras.layers.concatenate([a, b])
....
它有 2 个输入、一个预处理图像和一些额外信息。
我的问题是一次训练多个实例。我有这个火车功能:
def train_step(observations, actions, rewards):
with tf.GradientTape() as tape:
logits = my_model(observations)
loss = self.compute_loss(logits, actions, rewards)
....
在logits = my_model(observations) 行中,如果我只给出 1 个样本,它可以工作,但如果我发送一个列表,它会给出错误“层模型需要 2 个输入,但它接收到 34 个输入张量”。
我怀疑我没有正确传递参数(它曾经在我有 1 个输入模型时工作)。
我应该如何将一批观察结果传递给这个模型?
澄清一下:
-
observations是一个 numpy 数组列表。 -
my_model(observations)抛出错误“层模型需要...” -
my_model([observations[0][0], observations[0][1]])工作 -
my_model([[observations[0][0], observations[0][1]],[observations[1][0], observations[1][1]]])抛出错误Layer model expects 2 input(s), but it received 4 input tensors。
我可以在循环中使用对my_model([observations[i][0], observations[i][1]]) 的调用进行训练(其中i 是我在这批中的第n 个观察结果。但我认为与仅发送相比,如果我这样做会出现性能问题调用中的所有训练批次。
编辑
为了更清楚。我可以:
input_a = np.random.randint(0, 255, size=(1, 40, 40, 3)).astype("int8")
input_b = np.random.randint(0, 1, size=(1, 6)).astype("int8")
logits = my_model([input_a, input_b])
这很好用。
但是如果我在一批中有多个观察,我不知道如何传递参数:
input_a0 = np.random.randint(0, 255, size=(1, 40, 40, 3)).astype("int8")
input_b0 = np.random.randint(0, 1, size=(1, 6)).astype("int8")
input_a1 = np.random.randint(0, 255, size=(1, 40, 40, 3)).astype("int8")
input_b1 = np.random.randint(0, 1, size=(1, 6)).astype("int8")
logits = my_model([[input_a0, input_a0], [input_a1, input_a1]])
投掷:
ValueError: Layer model expects 2 input(s), but it received 4 input tensors. Inputs received: ...
【问题讨论】:
标签: python tensorflow machine-learning keras deep-learning