用于训练多输入功能keras模型的几个x输入的格式
Format of several x inputs for training multi input functional keras model
所以我目前正在尝试了解多输入 keras 模型期望的格式,但不了解如何输入多种格式。
from tensorflow.keras.models import Model
import tensorflow.keras
import tensorflow as tf
first_input = Input(2)
second_input = Input(2)
concat_layer= Concatenate()([first_input, second_input ])
hidden= Dense(2, activation="relu")(concat_layer)
output = Dense(1, activation="sigmoid")(hidden)
model = Model(inputs=[first_input, second_input], outputs=output)
model.summary()
model.compile(loss='mean_squared_error', metrics=['mean_squared_error'], optimizer='adam')
# I managed to get the format for prediction and single training data correct
# this works
inp = [np.array([[0,2]]), np.array([[0,2]])]
model.predict(inp)
model.fit(inp,np.array([42]), epochs=3, )
# I don´t get why this isn´t working
# this doesn´t work
model.fit(np.array([inp,inp]),np.array([42, 43]), epochs=3, )´
阅读了 fit 函数的 keras 文档后,我真的不明白为什么我的版本不起作用:
x :向量、矩阵或训练数据数组(如果模型有多个输入,则为列表)。如果模型中的所有输入都已命名,您还可以传递一个将输入名称映射到数据的列表。如果从框架原生张量(例如 TensorFlow 数据张量)馈送,x 可以为 NULL(默认值)。
因为我实际上是在给它一个列表数组。
最后一行代码导致以下错误:
ValueError:图层模型需要 2 个输入,但它收到了 1 个输入张量。收到的输入:[]
感谢任何帮助。
创建模型时
model = Model(inputs=[first_input, second_input], outputs=output)
这意味着输入应该是一个列表,其中包含 2 个形状为 (2,) 的张量和一个形状为 (1,) 的输出(由最后一个 Dense 层定义)。
因此,当您用作参数时:
inp = [np.array([[0,2]]), np.array([[0,2]])]
这是一个包含 2 个形状 (1, 2) 数组的列表
和
np.array([42])
这是一个形状为 (1) 的数组
这符合您的模型定义。 [实际上输出的形状应该是 (1, 1)]
行
model.fit(np.array([inp,inp]),np.array([42, 43]))
正在尝试提供一个整体形状为 [2, 2, 1, 2] 的数组列表和一个形状为 [2] 的目标。这与模型定义不匹配。
由于很容易出错,我倾向于先构建 .fit 或 predict 调用的参数,然后显式打印它们的形状...
例如
x_train = [a, b] # where a and b are np.arrays
print([x.shape for x in x_train])
例如尝试:
x_first = np.random.rand(8, 2) # batch_size 8, feature_size 2
x_second = np.random.rand(8, 2)
x_train = [a, b]
y_true = np.random.rand(8)
model.fit(x_train, y_true)
所以我目前正在尝试了解多输入 keras 模型期望的格式,但不了解如何输入多种格式。
from tensorflow.keras.models import Model
import tensorflow.keras
import tensorflow as tf
first_input = Input(2)
second_input = Input(2)
concat_layer= Concatenate()([first_input, second_input ])
hidden= Dense(2, activation="relu")(concat_layer)
output = Dense(1, activation="sigmoid")(hidden)
model = Model(inputs=[first_input, second_input], outputs=output)
model.summary()
model.compile(loss='mean_squared_error', metrics=['mean_squared_error'], optimizer='adam')
# I managed to get the format for prediction and single training data correct
# this works
inp = [np.array([[0,2]]), np.array([[0,2]])]
model.predict(inp)
model.fit(inp,np.array([42]), epochs=3, )
# I don´t get why this isn´t working
# this doesn´t work
model.fit(np.array([inp,inp]),np.array([42, 43]), epochs=3, )´
阅读了 fit 函数的 keras 文档后,我真的不明白为什么我的版本不起作用:
x :向量、矩阵或训练数据数组(如果模型有多个输入,则为列表)。如果模型中的所有输入都已命名,您还可以传递一个将输入名称映射到数据的列表。如果从框架原生张量(例如 TensorFlow 数据张量)馈送,x 可以为 NULL(默认值)。
因为我实际上是在给它一个列表数组。
最后一行代码导致以下错误:
ValueError:图层模型需要 2 个输入,但它收到了 1 个输入张量。收到的输入:[
感谢任何帮助。
创建模型时
model = Model(inputs=[first_input, second_input], outputs=output)
这意味着输入应该是一个列表,其中包含 2 个形状为 (2,) 的张量和一个形状为 (1,) 的输出(由最后一个 Dense 层定义)。
因此,当您用作参数时:
inp = [np.array([[0,2]]), np.array([[0,2]])]
这是一个包含 2 个形状 (1, 2) 数组的列表
和
np.array([42])
这是一个形状为 (1) 的数组
这符合您的模型定义。 [实际上输出的形状应该是 (1, 1)]
行
model.fit(np.array([inp,inp]),np.array([42, 43]))
正在尝试提供一个整体形状为 [2, 2, 1, 2] 的数组列表和一个形状为 [2] 的目标。这与模型定义不匹配。
由于很容易出错,我倾向于先构建 .fit 或 predict 调用的参数,然后显式打印它们的形状...
例如
x_train = [a, b] # where a and b are np.arrays
print([x.shape for x in x_train])
例如尝试:
x_first = np.random.rand(8, 2) # batch_size 8, feature_size 2
x_second = np.random.rand(8, 2)
x_train = [a, b]
y_true = np.random.rand(8)
model.fit(x_train, y_true)