Могу ли я использовать различную длину входных данных в нейронных сетях? - PullRequest
0 голосов
/ 21 мая 2018

Я хотел бы закодировать мои входные буквы строк для методов машинного обучения.На данный момент мои данные поезда выглядят так:

  score     text
    1   show photos
    1   show photos
    2   who are you

Как видите, все тексты имеют одинаковую длину.Внизу мой исходный код.Интересно, можно ли использовать разную длину векторов?Например:

  score     text
    1   show my photos
    1   show me my photos
    2   can you tell me who are you?

Исходный код:

train_set = pd.read_csv("train3.tsv", sep="\t", header = None, names=['score', 'text'], skip_blank_lines=False, quoting=csv.QUOTE_NONE, error_bad_lines=False)
test_set = pd.read_csv("test.tsv", sep="\t", header = None, names=['text'], skip_blank_lines=False, quoting=csv.QUOTE_NONE, error_bad_lines=False)

dictionary = {}
i=0

for index, row in train_set.iterrows():

    list2 = list(row.text.lower())

    for n, key in enumerate(list2):

        if key in dictionary:

            list2[n] = dictionary[key]

        else:

            dictionary[key] = i
            list2[n] = i
            i += 1

    train_set.set_value(index,'text', list2)


for index, row in test_set.iterrows():

    list2 = list(row.text.lower())

    for n, key in enumerate(list2):

        if key in dictionary:

            list2[n] = dictionary[key]

        else:

            dictionary[key] = i
            list2[n] = i
            i += 1

    test_set.set_value(index,'text', list2)

# Create first network with Keras

score = np.array([np.array(xi) for xi in train_set.score.values.tolist()])

text = np.array([np.array(xi) for xi in train_set.text.values.tolist()])

test = np.array([np.array(xi) for xi in test_set.text.values.tolist()])

# create model
model = Sequential()
model.add(Dense(12, input_dim=11, init='uniform'))
model.add(Dense(11, init='uniform'))
model.add(Dense(1, init='uniform'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(text, score, epochs=150, batch_size=10,  verbose=2)
# calculate predictions
predictions = model.predict(test)
print(predictions)

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Да, вы можете иметь разную длину;однако вам нужен слой, который может обрабатывать различные длины.Например, вы можете использовать LSTM для обработки предложений различной длины, установив input_shape=(None, vocab_size), где None обозначает неизвестное количество слов.

Вам все еще нужно pad последовательностина ту же длину, используя pad_sequences в утилит.Затем вам нужно использовать слой Masking, чтобы сообщить LSTM, что эти записи должны быть пропущены.Если вы просто установите -1 и не будете маскировать, то вы введете смещение, основанное на длине предложений в обучающем наборе.

0 голосов
/ 21 мая 2018

Ваш вход должен иметь одинаковый размер все время.Итак, что вы можете сделать, это вставить значение в конце меньших входных данных (скажем, -1).Тогда нейронная сеть выяснит это и разберется с этим.

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