【问题标题】:Training a Neural Network for Word Embedding训练用于词嵌入的神经网络
【发布时间】:2023-03-28 16:28:01
【问题描述】:

Attached 是实体的链接文件。我想训练一个神经网络将每个实体表示为一个向量。附上我的训练代码

import pandas as pd
import numpy as np

from numpy import array
from keras.preprocessing.text import one_hot

from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.models import Model
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers import Input


from keras.layers.embeddings import Embedding
from sklearn.model_selection import train_test_split 

file_path = '/content/drive/My Drive/Colab Notebooks/Deep Learning/NLP/Data/entities.txt'
df = pd.read_csv(file_path, delimiter = '\t', engine='python', quoting = 3, header = None)
df.columns = ['Entity']
Entity = df['Entity']

X_train, X_test = train_test_split(Entity, test_size = 0.10)
print('Total Entities: {}'.format(len(Entity)))
print('Training Entities: {}'.format(len(X_train)))
print('Test Entities: {}'.format(len(X_test)))
vocab_size = len(Entity)
X_train_encode = [one_hot(d, vocab_size,lower=True, split=' ') for d in X_train]
X_test_encode = [one_hot(d, vocab_size,lower=True, split=' ') for d in X_test]
model = Sequential()
model.add(Embedding(input_length=1,input_dim=vocab_size, output_dim=100))
model.add(Flatten())
model.add(Dense(vocab_size, activation='softmax'))

model.compile(optimizer='adam', loss='mse', metrics=['acc'])
print(model.summary())

model.fit(X_train_encode, X_train_encode, epochs=20, batch_size=1000, verbose=1)

当我尝试执行代码时遇到以下错误。

检查模型输入时出错:您传递给模型的 Numpy 数组列表不是模型预期的大小。预计会看到 1 个数组,但得到了以下 34826 个数组的列表:

【问题讨论】:

    标签: keras deep-learning nlp word-embedding


    【解决方案1】:

    您正在为 model.fit 传递 numpy 数组列表。以下代码生成 x_train_encode 和 X_test_encode 的数组列表。

    X_train_encode = [one_hot(d, vocab_size,lower=True, split=' ') for d in X_train]
    X_test_encode = [one_hot(d, vocab_size,lower=True, split=' ') for d in X_test]
    

    在传递给 model.fit 方法时将这些列表更改为 numpy 数组。

    X_train_encode = np.array(X_train_encode)
    X_test_encode = np.array(X_test_encode)
    

    而且我认为不需要对 X_train 和 X_test 进行 one_hot 编码,嵌入层需要整数(在您的情况下是单词索引)而不是单词索引的一个热编码值。因此,如果 X_train 和 X_test 是单词索引的数组,那么您可以直接将其输入 model.fit 方法。

    编辑:

    目前正在使用“mse”损失。由于最后一层是 softmax 层交叉熵损失在这里更适用。并且输出是一个类(单词)的整数值,稀疏分类应该用于损失。

    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['acc'])
    

    【讨论】:

    • 我已经编辑了您的建议,但出现此错误 检查目标时出错:预期 dense_16 具有形状 (38696,) 但得到的数组具有形状 (1,)
    • 你应该使用 sparse_categorical_crossentopy 损失。我已经编辑了答案以反映这一点。
    猜你喜欢
    • 2019-05-24
    • 2011-04-07
    • 1970-01-01
    • 2020-10-19
    • 2012-04-02
    • 2018-08-19
    • 2010-11-20
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多