Как я могу исправить ошибку 'instance of class Layer', создав LSTM с несколькими входами? - PullRequest
0 голосов
/ 24 мая 2019

Я создаю модель LSTM с несколькими категориальными входами. У меня 169,856 сэмплов, максимум 105 временных шагов на сэмпл (поэтому я использовал отступы) и 2 категориальных свойства. У меня есть одна метка на последовательность. Поскольку категориальные входы должны быть закодированы, я создал для каждого слоя внедрения, и после этого я объединяю их все. Но когда я пытаюсь добавить этот сцепленный слой в мою последовательную модель, я получаю ошибку.

Я уже пытался поместить входные данные как массивы, вместо X_train я использовал [act, des], но когда я это делаю, проверка не работает должным образом. Я также попытался сначала создать LSTM для каждого, а затем объединить LSTM.

#padDataAct and PadDataDes are like:
array([[0, 0, 0, ..., 5, 5, 6],
       [0, 0, 0, ..., 4, 5, 6],
       [0, 0, 0, ..., 2, 5, 6],
       ...,
       [0, 0, 0, ..., 4, 5, 6],
       [0, 0, 0, ..., 4, 5, 6],
       [0, 0, 0, ..., 2, 2, 4]])

dataY = dataY
dataX = {'act': padDataAct, 'des': padDataDes}
num_act = len(data.action.unique())+1
num_des = len(data.DESCRIPTION.unique())+1
embedding_matrix_act = np.random.rand(num_act, 4)
embedding_matrix_des = np.random.rand(num_des, 4)
X_train = {'act': padDataAct[:traintestsplit], 'des': padDataDes[:traintestsplit]}
y_train = dataY[:traintestsplit]
X_valid = {'act': padDataAct[traintestsplit:], 'des': padDataDes[traintestsplit:]}
y_valid = dataY[traintestsplit:]

in_act=Input(shape=[105], name='act')
emb_act=Embedding(num_act, embedding_dim_act, mask_zero=True, weights = [embedding_matrix_act], input_length = 105, trainable = False)(in_act)
in_des=Input(shape=[105], name='des')
emb_des=Embedding(num_des, embedding_dim_des, mask_zero=True, weights = [embedding_matrix_des], input_length = 105, trainable = False)(in_des)

fe = concatenate([(emb_act), (emb_des)])
model = Sequential()
model.add(fe)
model.add(LSTM(36))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='rmsprop',
              loss='mean_squared_error',
              metrics=['acc'])
history = model.fit(X_train, y_train,
                    epochs=100,
                    batch_size=36,
                    validation_data=(X_valid, y_valid))

Произошла ошибка:

Добавленный слой должен быть экземпляром класса Layer. Найдено: Тензор ("concatenate_40 / concat: 0", shape = (?, 105, 4), dtype = float32)

Кто-нибудь знает, как решить эту проблему или что я делаю неправильно в своем коде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...