亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將多個數據集輸入張量流模型

將多個數據集輸入張量流模型

搖曳的薔薇 2023-08-22 15:53:57
您好,我正在嘗試在模型中輸入多個數據集。這是我的問題的一個例子,但在我的例子中,我的模型之一有 2 個輸入參數,而另一個模型有 1 個。我在我的案例中遇到的錯誤是: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 modelmodel1 = tf.keras.Sequential()model1.add(tf.keras.layers.Dense(1))model1.compile()model1.build([None,3])# Create second modelmodel2 = tf.keras.Sequential()model2.add(tf.keras.layers.Dense(1))model2.compile()model2.build([None,3])# Concatenatefusion_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()#Datasetsds1 = tf.data.Dataset.from_tensors(([1,2,3],1))ds2 = tf.data.Dataset.from_tensors(([1,2,3], 2))print(ds1)print(ds2)# Fitmodel.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'>我需要使用數據集模塊,因為它們提供內置的數據延遲加載。
查看完整描述

3 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

正如評論中所述,.fitTensorFlow 模型中的 TensorFlow 函數不支持數據集列表。


如果您確實想使用數據集,則可以使用字典作為輸入,并命名輸入層以與字典匹配。


操作方法如下:


model1 = tf.keras.Sequential(name="layer_1")

model2 = tf.keras.Sequential(name="layer_2")

model.summary()


ds1 = tf.data.Dataset.from_tensors(({"layer_1": [[1,2,3]],

                                     "layer_2": [[1,2,3]]}, [[2]]))


model.fit(ds1)


一個更簡單的選擇是簡單地使用張量而不是數據集。.fit支持張量列表作為輸入,因此只需使用它即可。


model = tf.keras.models.Model(inputs=[model1.input, model2.input], outputs=t)

model.compile(loss='mse')


model.summary()


a = tf.constant([[1, 2, 3]])

b = tf.constant([[1, 2, 3]])


c = tf.constant([[1]])


model.fit([a, b], c)


查看完整回答
反對 回復 2023-08-22
?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

如果您感興趣,您還可以使用 tf.data.Dataset.zip() 和字典解決多輸入問題。我最近遇到了一個類似的問題,我需要將圖像和值向量輸入到單個模型中,并在其中連接中間模型。

我使用這里的tfdata_unzip()函數從最初使用該函數創建的標簽張量中解壓縮我的圖像張量。然后,我使用 .rezip 將數據集重新壓縮在一起。image_dataset_from_directory()tf.data.Dataset.zip()

在定義模型時,我使用了功能 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.fit(inputs=model_inputs, outputs=predicted_class)

因為model_inputs是帶有標簽的數據集,所以您不需要y=input_labels在 model.fit() 調用中定義 a 。


我還應該提到,我對驗證數據進行了相同的數據重構,并通過添加將其傳遞給 model.fit() 函數validation_data=model_validation_data,其中“model_validation_data”類似于 model_inputs 結構。


這就是我能夠解決 TF 多模態模型的多個輸入問題的方法。樂意討論出現的任何問題或其他解決方案。


查看完整回答
反對 回復 2023-08-22
?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

當我嘗試使用使用 text_dataset_from_directory 函數構建的兩個數據集時,我遇到了同樣的問題。對我來說,連接數據集不是一個解決方案,因為每個數據集可能會通過不同的 Keras 層。所以我所做的是構建一個自定義的“fit_generator”。這會將 Dataset 對象轉換為 Keras 支持多輸入的數組。


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)



查看完整回答
反對 回復 2023-08-22
  • 3 回答
  • 0 關注
  • 1704 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號