Я пытаюсь объединить текстовые и категориальные переменные, используя функциональный API Keras.
Модель компилируется, но когда я пытаюсь обучить модель с использованием "соответствия", она выдает мне ошибку.Похоже, то, как я поставил данные, неверно.Кто-нибудь когда-нибудь делал что-то подобное и знает, как заставить это работать?
Код для построения модели:
all_inputs = []
cat_embeddings = []
text_input = Input(shape=(MAX_SEQUENCE_LENGTH, ),name='text_input')
all_inputs.append(text_input)
x = Embedding(embedding_matrix.shape[0], # or len(word_index) + 1
embedding_matrix.shape[1], # or EMBEDDING_DIM,
weights=[embedding_matrix],
input_length=MAX_SEQUENCE_LENGTH,
trainable=True)(text_input)
x = SpatialDropout1D(0.2)(x)
x = Bidirectional(GRU(128, return_sequences=True,dropout=0.1,recurrent_dropout=0.1))(x)
x = Conv1D(64, kernel_size = 3, padding = "valid", kernel_initializer = "glorot_uniform")(x)
x = GlobalMaxPooling1D()(x)
x = Dense(128, activation='relu')(x)
for cat in Categorical_Features:
cat_input = Input(shape=(1,), name=cat)
no_of_unique_cat = X_train[cat].nunique()
embedding_size = np.ceil((no_of_unique_cat)/2)
embedding_size = int(embedding_size)
cat_embedding = Embedding(no_of_unique_cat+1, embedding_size, input_length = 1)(cat_input)
cat_embedding = Reshape(target_shape=(embedding_size,))(cat_embedding)
all_inputs.append(cat_input)
cat_embeddings.append(cat_embedding)
conc = Concatenate()(cat_embeddings)
x = concatenate([conc, x])
x = Dense(128, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(128, activation='relu')(x)
preds = Dense(93, activation="sigmoid")(x)
model = Model(inputs=all_inputs, outputs=preds)
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=1e-3), metrics=['accuracy'])
Затем я пытаюсь представить данные следующим образом:
model.fit([X_train_seq,
X_train['Categorical_Features_1'],
X_train['Categorical_Features_2'],
X_train['Categorical_Features_3'],
X_train['Categorical_Features_4'],
X_train['Categorical_Features_5'],
X_train['Categorical_Features_6']]
,
y_train,
validation_split=0.2,
class_weight = d_class_weights,
epochs=5,
batch_size=512)
Тогда я получаю эту ошибку:
InvalidArgumentError: indices[460,0] = 421 is not in [0, 406)
[[{{node embedding_18/GatherV2}} = GatherV2[Taxis=DT_INT32, Tindices=DT_INT32, Tparams=DT_FLOAT, _class=["loc:@training_8/Adam/gradients/embedding_18/GatherV2_grad/Reshape"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](embedding_18/embeddings/read, embedding_18/Cast, embedding_17/GatherV2/axis)]]
Этот код основан на коде в этом конкурсе Kaggle:
https://www.kaggle.com/aquatic/entity-embedding-neural-net
и бумаге«Вложения сущностей категориальных переменных»:
https://arxiv.org/abs/1604.06737