![](/img/trans.png)
[英]Training a single model jointly over multiple datasets in tensorflow
[英]Input multiple datasets to tensorflow model
您好我正在尝试在 model 中输入多个数据集。 这是我的问题的一个例子,但是在我的例子中,我的一个模型有 2 个输入参数,而另一个有一个。 我遇到的错误是:
Failed to find data adapter that can handle input: (<class 'list'> containing values of types {"<class 'tensorflow.python.data.ops.dataset_ops.BatchDataset'>", "<class 'tensorflow.python.data.ops.dataset_ops.TakeDataset'>"}), <class 'NoneType'>
代码:
import tensorflow as tf
# Create first model
model1 = tf.keras.Sequential()
model1.add(tf.keras.layers.Dense(1))
model1.compile()
model1.build([None,3])
# Create second model
model2 = tf.keras.Sequential()
model2.add(tf.keras.layers.Dense(1))
model2.compile()
model2.build([None,3])
# Concatenate
fusion_model = tf.keras.layers.Concatenate()([model1.output, model2.output])
t = tf.keras.layers.Dense(1, activation='tanh')(fusion_model)
model = tf.keras.models.Model(inputs=[model1.input, model2.input], outputs=t)
model.compile()
#Datasets
ds1 = tf.data.Dataset.from_tensors(([1,2,3],1))
ds2 = tf.data.Dataset.from_tensors(([1,2,3], 2))
print(ds1)
print(ds2)
# Fit
model.fit([ds1,ds2])
运行此示例代码会产生:
Failed to find data adapter that can handle input: (<class 'list'> containing values of types {"<class 'tensorflow.python.data.ops.dataset_ops.TensorDataset'>"}), <class 'NoneType'>
我需要使用数据集模块,因为它们提供内置的数据延迟加载。
嗨,我正在尝试在模型中输入多个数据集。 这是我的问题的一个例子,但是在我的情况下,我的一个模型有 2 个输入参数,而另一个有一个。 我遇到的错误是:
Failed to find data adapter that can handle input: (<class 'list'> containing values of types {"<class 'tensorflow.python.data.ops.dataset_ops.BatchDataset'>", "<class 'tensorflow.python.data.ops.dataset_ops.TakeDataset'>"}), <class 'NoneType'>
代码:
import tensorflow as tf
# Create first model
model1 = tf.keras.Sequential()
model1.add(tf.keras.layers.Dense(1))
model1.compile()
model1.build([None,3])
# Create second model
model2 = tf.keras.Sequential()
model2.add(tf.keras.layers.Dense(1))
model2.compile()
model2.build([None,3])
# Concatenate
fusion_model = tf.keras.layers.Concatenate()([model1.output, model2.output])
t = tf.keras.layers.Dense(1, activation='tanh')(fusion_model)
model = tf.keras.models.Model(inputs=[model1.input, model2.input], outputs=t)
model.compile()
#Datasets
ds1 = tf.data.Dataset.from_tensors(([1,2,3],1))
ds2 = tf.data.Dataset.from_tensors(([1,2,3], 2))
print(ds1)
print(ds2)
# Fit
model.fit([ds1,ds2])
运行此示例代码会产生:
Failed to find data adapter that can handle input: (<class 'list'> containing values of types {"<class 'tensorflow.python.data.ops.dataset_ops.TensorDataset'>"}), <class 'NoneType'>
我需要使用数据集模块,因为它们提供内置的数据延迟加载。
当我尝试使用使用 text_dataset_from_directory function 构建的两个数据集时,我遇到了同样的问题。 对我来说,连接数据集并不是一个解决方案,因为每个数据集都可能通过不同的 Keras 层。 所以我所做的是构建一个自定义的“fit_generator”。 这会将 Dataset 对象转换为 Keras 支持多输入的 arrays。
def fit_generator(dataset, batch_size):
X = []
y = []
for string_, int_ in dataset.batch(1):
for i in range(0, len(int_[0])):
X.append(string_[0][i].numpy())
y.append(int_[0][i].numpy())
X_ret = pd.DataFrame(X).to_numpy()
y_ret = pd.DataFrame(y).to_numpy()
return X_ret, y_ret
然后你可以解构数据集
train_X1, train_y1 = fit_generator(train_ds_1, batch_size)
train_X2, train_y2 = fit_generator(train_ds_2, batch_size)
val_X1, val_y1 = fit_generator(val_ds_1, batch_size)
val_X2, val_y2 = fit_generator(val_ds_2, batch_size)
然后你可以用命名输入制作字典
train_X = {'Input1': train_X1, 'Input2': train_X2}
train_y = {'Input1': train_y1, 'Input2': train_y2}
val_X = {'Input1': val_X1, 'Input2': val_X2}
val_y = {'Input1': val_y1, 'Input2': val_y2}
然后你可以像这样调用 fit 方法
model.fit(x=train_X, y=train_y1, validation_data=[val_X,val_y1], batch_size=batch_size, epochs=10)
如果您有兴趣,还可以使用 tf.data.Dataset.zip() 和字典解决多输入问题。 我最近遇到了一个类似的问题,我需要将图像和值向量输入到单个 model 中,它们将在其中连接中间模型。
我从这里使用tfdata_unzip()
function 从最初使用image_dataset_from_directory()
ZC1C425268E683894D1AB457A 创建的 label 张量中解压缩我的图像张量。 然后,我使用tf.data.Dataset.zip()
将数据集重新压缩在一起。
在定义 model 时,我使用了功能 API 并为每个输入层分配了一个名称:
import tensorflow as tf
from tensorflow.keras.layers import *
# create input image layer
in_image = Input(shape=(1305,2457,3), name='input_image')
# create input vector layer
in_vector = Input(shape=(1,), name='input_vector')
我的完整工作流程类似于以下内容:
# use tfdata_unzip() to separate input images from labels
input_images, input_labels = tfdata_unzip(input_dat)
# input vector was created using tf.data.Dataset.from_tensor_slices()
# using [1,2,3,4] as a placeholder for my original vector of values
in_vector = tf.data.Dataset.from_tensor_slices([1,2,3,4])
# create a new input Dataset using .zip()
# data is structured as (1) a dictionary of inputs (input_images,in_vector) and (2) their associated labels (input_labels)
model_inputs = tf.data.Dataset.zip(({"input_image":input_images, "input_vector":in_vector}, input_labels))
# if you then wanted to batch, cache, and/or prefetch the dataset you could do so using the following
batchsize = 32
model_inputs = model_inputs.batch(batchsize).cache().prefetch(buffer_size=tf.data.AUTOTUNE)
然后,model 可以通过调用类似的东西来拟合:
model.fit(inputs=model_inputs, outputs=predicted_class)
因为model_inputs
是一个带有标签的数据集,所以您不需要在 model.fit() 调用中定义y=input_labels
。
我还应该提到,我对验证数据进行了相同的数据重组,并通过添加validation_data=model_validation_data
将其传递给 model.fit() function,其中“model_validation_data”类似于 model_inputs 结构。
这就是我如何能够解决多输入到 TF 多模式 model 的问题。 很高兴讨论出现的任何问题或其他解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.