Проблема размерности в многослойной классификации Keras с вложением слов - PullRequest
0 голосов
/ 27 октября 2018

В настоящее время я решаю упражнение, которое включает в себя чтение в выступлениях на TED, маркировку их в соответствии с темами, о которых они говорят, и тренировку NN Feed Forward в Керасе, которая может соответствующим образом маркировать новые разговоры, используя предварительно обученные вложения слов.

В зависимости от того, о чем идет речь (технология, образование или дизайн или несколько из этих тем), он может иметь одну из следующих меток:

labels_dict = {
'txx': 0, 'xex': 1, 'xxd': 2, 'tex': 3, 'txd': 4, 'xed': 5, 'ted': 6, 'xxx': 7
}

Я загружаю доклады так:

def load_talks(path):
tree = et.parse(path)
root = tree.getroot()
for file in root:
    label = ''
    keywords = file.find('head').find('keywords').text.lower()
    if 'technology' in keywords:
        label += 't'
    else:
        label += 'x'

    if 'education' in keywords:
        label += 'e'
    else:
        label += 'x'

    if 'design' in keywords:
        label += 'd'
    else:
        label += 'x'

    talk = file.find('content').text
    talk = process_text(talk)
    texts.append(talk)
    labels.append(labels_dict[label])

Затем я вычисляю баллы TF-IDF для токенов в текстах:

tf_idf_vect = TfidfVectorizer()
tf_idf_vect.fit_transform(texts)
tf_idf_vectorizer_tokens = tf_idf_vect.get_feature_names()

Затем я использую токенизатор для назначения токенов в текстах индексам:

t = Tokenizer()
t.fit_on_texts(texts)

vocab_size = len(t.word_index) + 1
encoded_texts = t.texts_to_sequences(texts)

print('Padding the docs')
# pad documents to a max length of 4 words
max_length = max(len(d) for d in encoded_texts)
padded_docs = pad_sequences(encoded_texts, maxlen=max_length, padding='post')

Затем я вычисляю матрицу встраивания:

def compute_embedding_matrix(word_index, embedding_dim):
embedding_matrix = np.zeros((len(word_index) + 1, embedding_dim))
for word, i in word_index.items():
    embedding_vector = word_embeddings.get(word)
    if embedding_vector is not None and get_tf_idf_score(word) > TF_IDF_THRESHOLD:
        # words not found in embedding index and with a too low tf-idf score will be all-zeros.
        embedding_matrix[i] = embedding_vector
return embedding_matrix

embedding_dim = load_word_embeddings('word_embeddings/de/de.tsv') + 1
embedding_matrix = compute_embedding_matrix(t.word_index, embedding_dim)

Затем я подготавливаю метки и разбиваю данные в процессе обучения и тестирования:

labels = to_categorical(np.array(labels))

X_train, X_test, y_train, y_test = train_test_split(padded_docs, labels, test_size=0.1, random_state=0)

Следующие отпечатки выводят это:

print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)

(1647, 6204)
(184, 6204)
(1647, 8)
(184, 8)

Затем я готовлю свою модель следующим образом:

e = Embedding(input_dim=vocab_size,
              weights=[embedding_matrix],
              input_length=max_length,
              output_dim=embedding_dim,
              trainable=False)

print('Preparing the network')
model = models.Sequential()
model.add(e)
model.add(layers.Flatten())
model.add(layers.Dense(units=100, input_dim=embedding_dim, activation='relu'))
model.add(layers.Dense(len(labels), activation='softmax'))
# compile the model
model.compile(loss='binary_crossentropy', metrics=['acc'])
# summarize the model
print(model.summary())
# fit the model
print('Fitting the model')
model.fit(X_train, y_train, epochs=10, verbose=0, batch_size=500)
# evaluate the model
loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
print('Accuracy: %f' % (accuracy*100))

Это приводит к следующей ошибке:

embedding_1 (Embedding)      (None, 6204, 301)         47951106  
_________________________________________________________________
flatten_1 (Flatten)          (None, 1867404)           0         
_________________________________________________________________
dense_1 (Dense)              (None, 100)               186740500 
_________________________________________________________________
dense_2 (Dense)              (None, 1831)              184931    
=================================================================
Total params: 234,876,537
Trainable params: 186,925,431
Non-trainable params: 47,951,106
_________________________________________________________________
None
Fitting the model
    batch_size=batch_size)
  File "/Users/tim/anaconda3/lib/python3.6/site-packages/keras/engine/training.py", line 789, in _standardize_user_data
    exception_prefix='target')
  File "/Users/tim/anaconda3/lib/python3.6/site-packages/keras/engine/training_utils.py", line 138, in standardize_input_data
    str(data_shape))
ValueError: Error when checking target: expected dense_2 to have shape (1831,) but got array with shape (8,)

Process finished with exit code 1

Может ли кто-нибудь указать мне правильное направлениео том, как идтиВы подходите размеры этой модели?

1 Ответ

0 голосов
/ 27 октября 2018

Я обнаружил проблему:

В последнем плотном слое должно быть 8 единиц, а у меня 8 ярлыков.

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