我有 4 個特征,2 個連續的,形式為
[1,2,3,4,1,1,...]
和 2 類別的形式
[["A"],["A","B"],["A","B","C"], ["A", "C"]]
我的標簽采用與連續特征相同的形式,從 0 到 8 用于多分類。我的目標是根據 4 個特征預測標簽類別。
我將資料從 json 檔案中提取到 Pandas 資料框中,如下所示:
f1 f2 f3 f4 label
0 1 3 [R] [None] 1
1 2 2 [U, W] [Flying] 2
2 1 4 [None] [None] 2
3 1 2 [B] [Flying] 0
.. ... ... ... ... ...
根據我對參差不齊的張量檔案的理解,我可以將所有這些特征直接輸入到我的模型中,如下所示:
import tensorflow as tf
f1 = tf.keras.Input(shape=(1,),dtype=tf.dtypes.int32)
f2 = tf.keras.Input(shape=(1,),dtype=tf.dtypes.int32)
f3 = tf.keras.Input(shape=(None,),dtype=tf.dtypes.string, ragged=True)
f4 = tf.keras.Input(shape=(None,),dtype=tf.dtypes.string, ragged=True)
之后,我對 f1 和 f2 進行規范化,并對 f3 和 f4 使用 StringLookup、Embedding 和 Flatten 層。然后我將它們連接起來并輸入幾個密集層,然后使用 softmax 輸入最后一個密集層。
我的模型成功構建。
但是,當我將資料框傳遞給我的訓練函式時,如下所示:
features = ["f1","f2","f3","f4"]
model.fit(x=[training_set[feature] for feature in features],
y=training_set[label],
validation_split=0.1)
我收到以下錯誤
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).
接下來,我嘗試手動將我的資料框轉換為具有正確型別的 NumPy 陣列:
import numpy as np
f1 = np.asarray(training_set["f1"]).astype(np.int32)
f2 = np.asarray(training_set["f2"]).astype(np.int32)
f3 = np.asarray(training_set["f3"]).astype(object)
f4 = np.asarray(training_set["f4"]).astype(object)
l = np.asarray(training_set["label"]).astype(np.int32)
model.fit(x=[f1,f2,f3,f4],
y=l,
validation_split=0.1)
這會產生相同的錯誤:
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).
在我看來,我應該將資料轉換為張量并將其輸入 fit 方法,而不是 Numpy 陣列。如果我正確解釋tf.Data 檔案,這應該是可能的嗎?
在嘗試這樣做時,我陷入了使尺寸正確的問題,例如:
f1 = tf.stack([tf.convert_to_tensor(i) for i in training_set["f1"].values],axis=0)
# Is shape (622,) afaik I need shape(1,)?
f3 = tf.ragged.stack(data["colors"])
# Is shape (622, None) afaik needs to be shape (None,)
我究竟做錯了什么?
uj5u.com熱心網友回復:
用模型展平參差不齊的張量是相當復雜的Keras,但是您可以做的是使用LSTM層GlobalMaxPool1D或GlobalAveragePooling1D等來處理和展平張量。只需確保 2D 張量以某種方式轉換為 1D 張量。這是一個有兩層的作業示例GlobalMaxPool1D:
資料準備:
import tensorflow as tf
import pandas as pd
d = {'f1': [1, 2, 1, 1],
'f2': [3, 2, 4, 2],
'f3':[['R'] , ['U', 'W'], [None], ['B']],
'f4':[[None] , ['Flying'], [None], ['Flying']],
'label': [1, 2, 2, 0]}
df = pd.DataFrame(data=d)
df['f3'] = df['f3'].apply(lambda x: ['[UNK]' if i == None else i for i in x ])
df['f4'] = df['f4'].apply(lambda x: ['[UNK]' if i == None else i for i in x])
data_f1 = df[["f1"]].to_numpy()
data_f2 = df[["f2"]].to_numpy()
labels = df[["label"]].to_numpy()
data_f3 = tf.ragged.constant([df['f3'].to_list()])
data_f4 = tf.ragged.constant([df['f4'].to_list()])
型號:
look_up_layer = tf.keras.layers.StringLookup()
look_up_layer.adapt(tf.ragged.stack([data_f3, data_f4]))
data_f3 = tf.squeeze(data_f3, axis=0)
data_f4 = tf.squeeze(data_f4, axis=0)
f1 = tf.keras.Input(shape=(1,),dtype=tf.dtypes.int32)
f2 = tf.keras.Input(shape=(1,),dtype=tf.dtypes.int32)
f3 = tf.keras.Input(shape=(None,),dtype=tf.dtypes.string, ragged=True)
f4 = tf.keras.Input(shape=(None,),dtype=tf.dtypes.string, ragged=True)
f1_dense = tf.keras.layers.Dense(5, activation='relu')(f1)
f2_dense = tf.keras.layers.Dense(5, activation='relu')(f2)
f3_lookup = look_up_layer(f3)
f4_lookup = look_up_layer(f4)
embedding_layer = tf.keras.layers.Embedding(len(look_up_layer.get_vocabulary()), 10, input_length=1)
embedd_f3 = embedding_layer(f3_lookup)
embedd_f4 = embedding_layer(f4_lookup)
embedd_f3 = tf.keras.layers.GlobalMaxPool1D()(embedd_f3)
embedd_f4 = tf.keras.layers.GlobalMaxPool1D()(embedd_f4)
output = tf.keras.layers.Concatenate(axis=-1)([f1_dense, f2_dense, embedd_f3, embedd_f4])
output = tf.keras.layers.Dense(3, 'softmax')(output)
model = tf.keras.Model([f1, f2, f3, f4], output)
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy())
model.fit([data_f1, data_f2, data_f3, data_f4], labels, batch_size=1, epochs=2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/411598.html
標籤:
