Использование слоев LSTM в сочетании с CNN - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь повысить точность классификатора ЭЭГ. В настоящее время я классифицирую только со слоями конвона и полностью связанными. В литературе я нашел людей, использующих слои LSTM в своей модели CNN. Я хотел бы попробовать это, но я получаю следующую ошибку.

Данные, которые я использую, представляют собой временные ряды данных ЭЭГ 64 канала x 325 выборок (с частотой дискретизации 500 Гц и 650 мс). Х = (1923,63,325,1) и у = (1923,)

model = Sequential()

model.add(TimeDistributed(Conv2D(64, (1, 3), input_shape=X.shape[1:])))
model.add(Activation('relu'))

model.add(TimeDistributed(Conv2D(64, (1, 3))))
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(1, 2)))

model.add(TimeDistributed(Conv2D(64, (1, 3))))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(1, 2)))

model.add(TimeDistributed(Flatten()))

model.add(LSTM(128,return_sequences=True))

model.add(LSTM(128,return_sequences=True))

model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dropout(0.3)) 

model.add(Dense(2))
model.add(Activation('softmax'))

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

Ошибка, которую я получаю:

IndexError: list index out of range

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

Редактировать: выдается ошибка

  File "<ipython-input-8-0b3d7307ea53>", line 1, in <module>
    runfile('D:/ AA TestPrograms/LALALAL/ModelV20.py', wdir='D:/ AA TestPrograms/LALALAL')

  File "d:\anaconda\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
    execfile(filename, namespace)

  File "d:\anaconda\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "D:/ AA TestPrograms/LALALAL/ModelV20.py", line 115, in <module>
    history = train_model(model, xtrain, ytrain, xval, yval)

  File "D:/ AA TestPrograms/LALALAL/ModelV20.py", line 94, in train_model
    shuffle=True

  File "d:\anaconda\lib\site-packages\keras\engine\training.py", line 950, in fit
    batch_size=batch_size)

  File "d:\anaconda\lib\site-packages\keras\engine\training.py", line 671, in _standardize_user_data
    self._set_inputs(x)

  File "d:\anaconda\lib\site-packages\keras\engine\training.py", line 577, in _set_inputs
    self.build(input_shape=(None,) + inputs.shape[1:])

  File "d:\anaconda\lib\site-packages\keras\engine\sequential.py", line 225, in build
    x = layer(x)

  File "d:\anaconda\lib\site-packages\keras\engine\base_layer.py", line 457, in __call__
    output = self.call(inputs, **kwargs)

  File "d:\anaconda\lib\site-packages\keras\layers\wrappers.py", line 248, in call
    y = self.layer.call(inputs, **kwargs)

  File "d:\anaconda\lib\site-packages\keras\layers\convolutional.py", line 168, in call
    dilation_rate=self.dilation_rate)

  File "d:\anaconda\lib\site-packages\keras\backend\tensorflow_backend.py", line 3565, in conv2d
    data_format=tf_data_format)

  File "d:\anaconda\lib\site-packages\tensorflow\python\ops\nn_ops.py", line 779, in convolution
    data_format=data_format)

  File "d:\anaconda\lib\site-packages\tensorflow\python\ops\nn_ops.py", line 828, in __init__
    input_channels_dim = input_shape[num_spatial_dims + 1]

  File "d:\anaconda\lib\site-packages\tensorflow\python\framework\tensor_shape.py", line 615, in __getitem__
    return self._dims[key]

IndexError: list index out of range

Я новичок, когда дело доходит до Python и Tensorflow, но я думаю, что это последняя строка, где он проверяет размеры? Если я посмотрю в tenor_shape.py, я не смогу найти IndexError.

Спасибо за помощь!

1 Ответ

0 голосов
/ 02 ноября 2018

Я попытался воспроизвести его и получил эту ошибку после замены model.add(TimeDistributed(Conv2D(64, (1, 3), input_shape=X.shape[1:]))) с этим model.add(TimeDistributed(Conv2D(64, (1, 3)), input_shape=X.shape[1:])), где X - случайный массив формы (1923, 63, 325, 1). Ошибка возникает из-за того, что размерность массива должна равняться 4, чтобы применять Conv2D последовательно для каждого образца (или без размера пакета). Другими словами, X должен иметь форму (размер партии, временной размер, размер строки, размер столбца, размер канала).

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