簡體   English   中英

tf.keras - 僅將特定層應用於特定特征

[英]tf.keras - Apply specific layers only to specific features

我會更好地解釋:我想將 model 中的一些層應用於某些特征,在其他特征上使用其他層,最后在一些最終層上使用這兩個層的輸出。

特別是:我有一個包含一些分類特征的數據集,我有一個熱編碼,然后是代表 10 年的 50 個其他數字列(每個具有相同的 5 個特征)。

我想做的是:

  1. 在一些 Dense 層上運行分類(及其交互)的假人;
  2. 在數字年度特征上運行LSTM以預測第 11 年;
  3. 最后將 1. 和 2. 的輸出混合到一些最終的 Dense 層中,然后將它們傳遞給最終的 Dense(1),這將是我回歸的 output。

我的問題是:*如何將 go 的某些特定功能放入某些特定層,以及如何將這些層的 output(以及其他分析其他功能)引導到一些最終層,這些層應該收集從以前的?

我希望我足夠清楚。 非常感謝那些會回答的人。

編輯:


這是我到目前為止所做的,請告訴我您是否可以提出如何改進它的建議。

附言。 輸入數據是 100% 的正確形狀。

cat_in = k.layers.Input(shape=(X_train_p3.shape[1],), name='cat_in')
num_in = k.layers.Input(shape=(X_train_m.shape[1], X_train_m.shape[2]), name='num_in')
ovr_in = k.layers.Input(shape=(X_train_f.shape[1],), name='ovr_in')

a = k.layers.Dense(128, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(cat_in)
a = k.layers.Dropout(.2)(a)
a = k.layers.Dense(64, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(a)
a = k.layers.Dropout(.2)(a)
a = k.layers.Dense(64, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(a)


b = k.layers.LSTM(128, activation='tanh', return_sequences=True, kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='glorot_uniform')(num_in) #original --> needs changes?
b = k.layers.Dropout(.15)(b)
b = k.layers.LSTM(64, activation='tanh', return_sequences=True, kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(b)
b = k.layers.Dropout(.15)(b)
b = k.layers.LSTM(64, activation='tanh', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(b)
b = k.layers.Dropout(.15)(b)
b = k.layers.Dense(64, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(b)
b = k.layers.Dropout(.15)(b)
b = k.layers.Dense(64, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(b)


c = k.layers.Dense(128, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(ovr_in)
c = k.layers.Dropout(.2)(c)
c = k.layers.Dense(64, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(c)
c = k.layers.Dropout(.2)(c)
c = k.layers.Dense(64, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(c)


d = k.layers.concatenate([a, b, c])
d = k.layers.Dense(192, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(d)
d = k.layers.Dropout(.2)(d)
d = k.layers.Dense(64, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(d)
d = k.layers.Dropout(.2)(d)
d = k.layers.Dense(64, activation='relu', kernel_regularizer=l1(.1),
                   bias_regularizer=l1(.1), kernel_initializer='he_uniform')(d)
out = k.layers.Dense(1)(d)


model = k.models.Model(inputs=[cat_in, num_in, ovr_in], outputs=out)

model.compile(optimizer=k.optimizers.Adam(learning_rate=.001, beta_1=.999, beta_2=.9999),
              loss='mse',
              metrics=['mae'])

early_stop = k.callbacks.EarlyStopping(monitor='val_mae', patience=100, restore_best_weights=True)
lr_callback = k.callbacks.ReduceLROnPlateau(monitor='val_mae', factor=.1**.5, patience=20, min_lr=1e-9)

Pps:增加神經元的數量並不會帶來改善。

我想為您提供一個虛擬示例

n_sample = 100
cat_feat = 30
dense_feat = 50
lstm_timestep = 20


X_cat = np.random.randint(0,2, (n_sample,cat_feat)) 
X_dense = np.random.uniform(0,1, (n_sample, lstm_timestep, dense_feat))
y = np.random.uniform(0,1, n_sample)
print(X_cat.shape, X_dense.shape)

inp_cat = Input((cat_feat))
x_cat = Dense(64, activation='relu')(inp_cat)


inp_dense = Input((lstm_timestep, dense_feat))
x_dense = LSTM(32, activation='relu')(inp_dense)

concat = Concatenate()([x_cat, x_dense])
x = Dense(32, activation='relu')(concat)
out = Dense(1)(x)

model = Model([inp_cat,inp_dense], out)
model.compile('adam', 'mse')
model.fit([X_cat,X_dense],y, epochs=10)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM