Нейронная сеть Train с более чем 2 входными функциями - PullRequest
0 голосов
/ 19 июня 2019

Я уже ссылался на руководство keras по использованию нескольких входов .Тем не менее, я все еще в замешательстве, так как я новичок в RNN и CNN.Я работаю с Keras, чтобы обучить классификатор нейронной сети.В моем CSV-файле у меня есть 3 функции.

  • Предложение
  • Вероятность
  • Цель

Каждое предложение представляет собой предложение, содержащее ровно 5 слов, и существует 1860 таких предложений.Вероятность представляет собой значение с плавающей запятой в диапазоне [0,1], а целью является поле, которое необходимо предсказать (0 или 1).

Сначала я случайным образом начинаю предложения с вложениями, как показано ниже.

import string
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
import numpy as np
import gensim
import pandas as pd
import os
from tensorflow.python.keras.preprocessing.text import Tokenizer
from tensorflow.python.keras.preprocessing.sequence import pad_sequences
from gensim.models import Word2Vec, KeyedVectors
from keras.models import Sequential
from keras.layers import Dense, Embedding, LSTM, GRU
from keras.layers.embeddings import Embedding
from keras.initializers import Constant
from sklearn.metrics import precision_recall_fscore_support
from sklearn.model_selection import train_test_split
from termcolor import colored
from keras.utils import to_categorical
import tensorflow as tf

import warnings
warnings.filterwarnings("ignore")

nltk.download('stopwords')
# one hot encode

seed = 42
np.random.seed(seed)
tf.set_random_seed(seed)


df = pd.DataFrame()
df = pd.read_csv('../../data/sentence_with_stv.csv')
sentence_lines = list()
lines = df['sentence'].values.tolist()
stv = df['stv'].values.tolist()

for line in lines:
    tokens = word_tokenize(line)
    tokens = [w.lower() for w in tokens]
    table = str.maketrans('','',string.punctuation)
    stripped = [w.translate(table) for w in tokens]
    words = [word for word in stripped if word.isalpha()]
    stop_words = set(stopwords.words('english'))
    words = [w for w in words if not w in stop_words]
    sentence_lines.append(words)

print('Number of lines', len(sentence_lines)))
EMBEDDING_DIM = 200

#Vectorize the text samples into a S2 integer tensor
tokenizer_obj = Tokenizer()
tokenizer_obj.fit_on_texts(sentence_lines)
sequences = tokenizer_obj.texts_to_sequences(sentence_lines)

print(colored(sequences,'green'))

Это дает мне вывод, такой как,

Number of lines: 1860
[[2, 77, 20, 17, 81], 
 [12, 21, 17, 82], 
 [2, 83, 20, 17, 82], 
 [2, 20, 17, 43], 
 [12, 21, 17, 81], 
 ...

Теперь мне нужно добавить вероятность к каждой из этих строк так, чтобы новая последовательность была похожа на следующую.

[[2, 77, 20, 17, 81, 0.456736827], 
 [12, 21, 17, 82, 0.765142873], 
 [2, 83, 20, 17, 82, 0.335627635], 
 [2, 20, 17, 43, 0.5453652], 
 [12, 21, 17, 81, 0.446739202],
 ...

Я попытался взять каждую строку последовательности и добавить вероятность как

sequence[x] = np.append(sequence[x], probability[x], axis=1)

, где вероятность - это массив того же размера, 1860, состоящий только иззначения вероятности.Сделав это для всех строк, я печатаю одну строку, чтобы проверить, добавлено ли значение.Но я получаю вывод, как показано ниже.

[2.     77.     20.     17.     81.     0.456736827]

Любые предложения в этом отношении будут высоко оценены.

1 Ответ

0 голосов
/ 19 июня 2019

Вы должны использовать индексы слов в качестве входных данных для нейронной сети. Каждый индекс соответствует разным словам, а индексирование не имеет семантики чисел. (10 вдвое больше, чем 5, для категориальных переменных ничего подобного не имеет места.) Если добавить к числам число с плавающей точкой, индексы конвертируются в числа с плавающей точкой.

Правильное решение использует слой внедрения для ввода слова. Слой встраивания назначает обучаемый вектор каждому элементу в вашем словаре. За встраиваниями обычно следует RNN или CNN, чтобы получить один вектор, или вы можете просто объединить вложения.

В любом случае, вы не можете легко объединить входные данные в numpy, вам нужно сделать это TensorFlow. Сначала вставьте слова, и если у вас есть тензор непрерывных значений, только тогда вы можете добавить числовые элементы.

...