我現在正在構建一個神經網路,我面臨著添加另一個輸入層的任務(因為現在我只需要一個)。特別是,這是之前的代碼:
###...
if(self.net_embedding==0):
l_input = Input(shape=self.win_size, dtype='int32', name='input_act')
emb_input = Embedding(output_dim=params["output_dim_embedding"], input_dim=unique_events 1, input_length=self.win_size)(l_input)
toBePassed=emb_input
elif(self.net_embedding==1):
self.getWord2VecEmbeddings(params['word2vec_size'])
X_train=self.encodePrefixes(params['word2vec_size'],X_train)
l_input = Input(shape = (self.win_size, params['word2vec_size']), name = 'input_act')
toBePassed=l_input
l1 = LSTM(params["shared_lstm_size"],return_sequences=True, kernel_initializer='glorot_uniform',dropout=params['dropout'])(toBePassed)
l1 = BatchNormalization()(l1)
#and so on with the rest of the layers...
模型 (X_train) 的輸入只是一個整數陣列(大小 = self.win_size)(例如 [[0 1 2 3] [1 2 3 4]...],如果 self.win_size = 4) ,其中整數表示分類元素。
正如你所看到的,我也有兩種型別的輸入嵌入:
- 嵌入層
- Word2Vec 編碼
現在,我需要向網路添加另一個輸入,它也是一個整數陣列(再次使用 size = self.win_size)(例如 [[0 123 334 2212][123 334 2212 4888]... ],但這次我不需要應用任何嵌入(我認為),因為這里的元素不是分類的(它們以秒為單位表示經過的時間)。
我嘗試通過簡單地將網路更改為:
#...
if(self.net_embedding==0):
l_input = Input(shape=self.win_size, dtype='int32', name='input_act')
emb_input = Embedding(output_dim=params["output_dim_embedding"], input_dim=unique_events 1, input_length=self.win_size)(l_input)
toBePassed=emb_input
elif(self.net_embedding==1):
self.getWord2VecEmbeddings(params['word2vec_size'])
X_train=self.encodePrefixes(params['word2vec_size'],X_train)
l_input = Input(shape = (self.win_size, params['word2vec_size']), name = 'input_act')
toBePassed=l_input
elapsed_time_input = Input(shape=self.win_size, name='input_time')
input_concat = Concatenate(axis=1)([toBePassed, elapsed_time_input])
l1 = LSTM(params["shared_lstm_size"],return_sequences=True, kernel_initializer='glorot_uniform',dropout=params['dropout'])(input_concat)
l1 = BatchNormalization()(l1)
#and so on with other layers...
但我得到了錯誤:
ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concatenation axis. Received: input_shape=[(None, 4, 12), (None, 4)]
請問您對此有什么解決辦法嗎?任何形式的幫助都將不勝感激,因為我有幾天的最后期限,而且我現在已經為此苦苦掙扎了這么久!謝謝 :)
uj5u.com熱心網友回復:
你的方法有兩個問題。
首先,LSTM 的輸入應該是 形狀(batch_size, num_steps, num_feats),而你的elapsed_time_input形狀應該是(None, 4)。您需要擴大其尺寸以獲得正確的形狀(None, 4, 1)。
elapsed_time_input = tf.keras.layers.Reshape((-1, 1))(elapsed_time_input)
or
elapsed_time_input = tf.expand_dims(elapsed_time_input, axis=-1)
有了這個,“以秒為單位的經過時間”將被視為時間步長的另一個特征。
其次,您需要連接特征維度(而不是時間步長維度)中的兩個輸入。
input_concat = Concatenate(axis=-1)([toBePassed, elapsed_time_input])
or
input_concat = Concatenate(axis=2)([toBePassed, elapsed_time_input])
在此之后,您將得到一個形狀為 的 keras 張量(None, 4, 13)。它代表一批時間序列,每個時間序列有 4 個時間步長,每步 13 個特征(12 個原始特征 每步經過的時間,以秒為單位)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487684.html
