Как ввести вложение предложения как функцию в нейронных сетях? - PullRequest
0 голосов
/ 08 января 2020

После предварительной обработки у меня есть pandas фрейм данных, как на скриншоте.

Я хочу обучить модель нейронной сети Keras для классификации векторов в намерений .

Векторы: ЛАЗЕРНЫЕ вложения предложений и в формате numpy.ndarray. При попытке ввести эти функции в модель, я получаю ошибки, касающиеся формы данных. Я думаю, что мне нужно работать либо с Embedded Layer , либо с input_shape , либо создать матрицу встраивания перед реализацией модели.

Поскольку у меня мало знаний о нейронных сетях Кераса, мне трудно понять, что именно я должен здесь делать. Может ли кто-нибудь показать мне, как я могу сформировать эти данные и использовать для обучения последовательной модели Keras, как в здесь ..

print(df.shape) gives (2500, 2)
print(df["vector"][0].shape) gives (1, 1024)
print(df.head(2).to_dict()) 

дает следующие

    {'intent': {0: '__label__all_barred_account', 1: '__label__all_barred_account'}, 'vector': {0: array([[-0.00013465,  0.0042192 , -0.00137651, ...,  0.00062024,
         0.01850433,  0.00674227]], dtype=float32), 1: array([[ 7.9819439e-03, -2.2082901e-04,  1.5223841e-05, ...,
         1.5212121e-02,  2.4543235e-03,  2.8751865e-02]], dtype=float32)}}

Я попробовал следующее, и ошибка была - ValueError: Ошибка при проверке ввода: ожидалось, что embedding_1_input будет иметь форму (50,), но получил массив с формой (1,)

df = pd.read_csv('../data/intents/sinhala_intents.csv', names=['data'])
df[['intent', 'sentence']] = df["data"].str.split(" ", 1, expand=True)
df["sentence"] = df["sentence"].str.strip("-")
df["vector"] = df["sentence"].apply(lambda x: laser.embed_sentences(x, lang='si'))
df = df.drop(columns=['data', 'sentence'])

X = df["vector"].values
y = df['intent'].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)

embedding_dim = 50

model = Sequential()
model.add(layers.Embedding(input_dim=50,
                           output_dim=embedding_dim,
                           input_length=2500))
model.add(layers.GlobalMaxPool1D())
model.add(layers.Dense(10, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])
model.summary()

history = model.fit(X_train, y_train,
                    epochs=20,
                    verbose=False,
                    validation_data=(X_test, y_test),
                    batch_size=10)
loss, accuracy = model.evaluate(X_train, y_train, verbose=False)
print("Training Accuracy: {:.4f}".format(accuracy))
loss, accuracy = model.evaluate(X_test, y_test, verbose=False)
print("Testing Accuracy:  {:.4f}".format(accuracy))

enter image description here

...