Индексы вне диапазона, модель LSTM работает на данных последовательности - PullRequest
0 голосов
/ 09 июня 2018

Я новичок в Keras и нейронных сетях.Мне нужно реализовать и модель LSTM на моем наборе данных.

Мой набор данных состоит из следующих последовательностей:

52 53 54 55 66 67 58 59 60 68 69 70 58 59 60 68 711 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 5051 1 2 3 4 5 6 7 1 2 72 73 5 6 7 74 75 10 11 12 13 14

... У меня есть 467 файлов ".txt", которые содержат последовательности, подобные этой.Каждый файл имеет вариант номера последовательности.Имя файла - это метка для всех последовательностей (например, для имени файла «100026» метка для каждой отдельной последовательности - 100026).

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

import numpy as np
import glob
import os
#import numpy.ma as ma
#from keras import layers
from keras.preprocessing.sequence import pad_sequences
from keras.layers import LSTM
from keras.models import Sequential
from keras.layers import Dense, Embedding, Masking
from keras.utils import np_utils
from keras.utils import to_categorical


nb_classes =467

def load_data():
    path = r'I:\NEDA\GNOME\Converted to ID'
    max_len= -1
    data =[]
    data_labels =[]
    for filename in os.listdir(path):
        lbl = 0 # to convert the labels to integers starting from 0
        with open(os.path.join(path, filename)) as f:
            lbl+=1
            for line in f:
                data.append(line.split())
                data_labels.append(lbl) #filename.split(".")[0]
                if max_len < len(line.split()):
                    max_len = len(line.split())

                #print(filename.split(".")[0])
    percent = int(len(data)*0.7) # 70% for training and 30% for testing
    data = np.array(data)
    nb_features= len(np.unique(data)) # extracting number of available features( functioons)

    #*data = pad_sequences(data, maxlen=max_len) ### np.expand_dim

    #data_labels=np.array(data_labels)
    #print(data.shape)
    train_data = data[0:percent]
    train_labels = data_labels[0:percent]    
    test_data = data[percent:]
    test_labels = data_labels[percent:]
    #print(train_set.shape) # + " " + train_labels.shape)
    return (np.array(train_data), np.array(train_labels), np.array(test_data), np.array(test_labels) , nb_features , max_len)

train_data, train_labels, test_data, test_labels, nb_features, max_len = load_data()
train_data = pad_sequences(train_data, maxlen = max_len) # ADDED 
test_data = pad_sequences(test_data, maxlen= max_len) # added

#*train_data = np.reshape(train_data, (train_data.shape[0], train_data.shape[1], 1))
#*test_data = np.reshape(test_data, (test_data.shape[0], test_data.shape[1], 1)) 

train_labels = to_categorical(train_labels, nb_classes )# ADDED
test_labels = to_categorical(test_labels, nb_classes )# ADDED

model = Sequential()
model.add(Embedding(nb_features, 128))
model.add(LSTM(128, dropout =0.2, recurrent_dropout =0.2))
model.add(Dense(1, activation = 'sgd'))
model.add(Dense(nb_classes, activation='softmax'))

'''model.add(Masking(mask_value=0, input_shape=(max_len, nb_features)))#train_datalen(train_data)
model.add(LSTM(12, return_sequences=True, kernel_initializer="one")) #train_data#train_data.values.shape[1]#input_shape=(max_len,1)
model.add(Dense(1, activation='sigmoid', kernel_initializer="one"))
#model.add(Dense(nb_classes, activation='softmax'))
#model.compile(loss='binary_crossentropy', optimizer='sgd')
'''
model.summary()
#RMSprop() 'sparse_categorical_crossentropy'
model.compile(loss='categorical_crossentropy',
              optimizer= 'adam',
              metrics=['accuracy'])
# fit model


model.fit(train_data, train_labels, epochs=2, batch_size=16, validation_data=(test_data, test_labels)) #validation_data=(x_test, y_test) 
score = model.evaluate(test_data, test_labels,batch_size=16 ) # verbose=0
print('Test score:', score[0])
print('Test accuracy:', score[1])

Этот код работает близко к последним последовательностям, но перестает отображать эту ошибку:

indexes [2,219] = 5849 отсутствует в [0, 5849)

[[Узел: embedding_1 / GatherV2 = GatherV2 [Taxis = DT_INT32, Tindices = DT_INT32, Tparams = DT_FLOAT, _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0"] (embedding_1 /embeddings / read, embedding_1 / Cast, lstm_1 / TensorArrayUnstack / range / start)]]

Вызывается операцией 'embedding_1 / GatherV2', определенной в:

File "C: \ Program Files ((x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ Extensions \ Microsoft \ Python Tools для Visual Studio \ 2.2 \ visualstudio_py_launcher.py ", строка 78, в

vspd.debug(filename, port_num, debug_id, debug_options, run_as)

Файл" C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ Extensions \ Microsoft \ Python Tools для Visual Studio \ 2.2 \ visualstudio_py_debugger.py ", строка 2483, в отладочном файле

exec_file(file, globals_obj)

Файл" C: \ Program Files(x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ Extensions \ Microsoft \ Инструменты Python для Visual Studio \ 2.2 \ visualstudio_py_util.py ", строка 111, в exec_file

exec_code(code, file, global_variables)

Файл" C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ Extensions \ Microsoft \ Python Tools for Visual Studio \ 2.2\ visualstudio_py_util.py ", строка 87, в exec_code

exec(code_obj, global_variables)

Файл" C: \ Users \ umroot \ Documents \ Visual Studio 2015 \ Projects \ deepLearning \ deepLearning \ deepLearning.py ", строка 58, в

model.add(Embedding(nb_features, 128))

Файл "C: \ Users \ umroot \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ models.py", строка 497, в добавлении

layer(x)

Файл "C: \ Users \ umroot \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ topology.py", строка 619, в вызов

output = self.call(inputs, **kwargs)

Файл "C: \ Users \ umroot \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ layer \ embeddings.py", строка 138, в вызове

out = K.gather(self.embeddings, inputs)

Файл "C: \ Users \ umroot \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ backend \ tenorflow_backend.py", строка 1215, в сборке

return tf.gather(reference, indices)

Файл "C: \ Users \ umroot \ AppDat"a \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ tenorflow \ python \ ops \ array_ops.py ", строка 2736, в сборе

return gen_array_ops.gather_v2(params, indices, axis, name=name)

Файл" C: \ Users \ umroot \ "AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ tenorflow \ python \ ops \ gen_array_ops.py ", строка 3668, в collect_v2

"GatherV2", params=params, indices=indices, axis=axis, name=name)

Файл" C: \ Users \ umroot \ "AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ tenorflow \ python \ framework \ op_def_library.py ", строка 787, в _apply_op_helper

op_def=op_def)

Файл" C: \ Users \ umroot \ "AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ tenorflow \ python \ framework \ ops.py ", строка 3392, в create_op

op_def=op_def)

Файл" C: \ Users \ umroot \ "AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ tenorflow \ python \ framework \ ops.py ", строка 1718, в init

self._traceback = self._graph._extract_stack()  # pylint: disable=protected-access

InvalidArgumentError (см.выше для отслеживания): индексы [2,219] = 5849 не в [0, 5849)

[[Узел: embedding_1 / GatherV2 = GatherV2 [Такси = DT_INT32, Tindices = DT_INT32, Tparams = DT_FLOAT, _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0"] (embedding_1/ embeddings / read, embedding_1 / Cast, lstm_1 / TensorArrayUnstack / range / start)]]

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Проблема в том, что целые числа в последовательностях должны отображаться в последовательно упорядоченные.Например, последовательность «10 12 1 9 5 1 9» имеет 5 уникальных целых чисел.Но для слоя «Внедрение» эта последовательность должна быть изменена на что-то вроде «1 2 3 4 5 3 4», чтобы быть совместимым с вводом (размер слов / функции).

Путем преобразования последовательностей в моем наборе данных и предоставленияМаксимально отображая целое число как nb_features, я решил свою проблему

0 голосов
/ 09 июня 2018

Вы почти на месте, просто вы пробуете любую комбинацию, пока не сработает, не задумываясь о том, что это за значения.Вот 2 изменения, которые помогут вашей проблеме:

  1. Это должно быть Embedding(nb_features+1, ..., input_length=max_len), потому что вы подсчитываете количество уникальных индексов, но не учитываете заполнение, которое также является символом.Таким образом, вы пытаетесь индексировать 5849 тензор размера 5849, который является ошибкой.Из документации , "максимальный целочисленный индекс + 1" для input_dim.
  2. Упрощение, которое вы можете сделать, чтобы избежать вызова to_categorical, это просто изменить loss='sparse_categorical_crossentropy', который ожидает целочисленные меткии выполняет горячее кодирование для вас.
...