ValueError: отрицательный размер измерения, вызванный вычитанием 3 из 1 для 'conv1d_1 / convolution / Conv2D - PullRequest
0 голосов
/ 26 октября 2018

Проблема двоичной классификации: я хочу иметь один входной слой (необязательно), один слой Conv1D, а затем выходной слой из 1 нейрона, предсказывающий либо 1, либо 0.
Вот моя модель:

x_train = np.expand_dims(x_train,axis=1)
x_valid = np.expand_dims(x_valid,axis=1)
#x_train = x_train.reshape(x_train.shape[0], 1, x_train.shape[1])
#x_valid = x_train.reshape(x_valid.shape[0], 1, x_train.shape[1])

model = Sequential()

#hidden layer
model.add(Convolution1D(filters = 1, kernel_size = (3),input_shape=(1,x_train.shape[2])))
#output layer
model.add(Flatten())
model.add(Dense(1, activation = 'softmax'))

sgd = SGD(lr=0.01, nesterov=True, decay=1e-6, momentum=0.9)

model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

print('model compiled successfully')
model.fit(x_train, y_train, nb_epoch = nb_epochs, validation_data=(x_valid,y_valid), batch_size=100)

Форма ввода : x_train.shape = (5,1,133906), то есть (партия, шаги, каналы) соответственно. Шаги добавлены через expand_dims. Фактический размер (5 133 906), представляющий собой 5 выборок данных временного ряда длиной 133 906, отобранных случайным образом, иногда через 2 мс, а иногда и через 5 мс.

Сообщение об ошибке : ValueError: Отрицательный размер измерения, вызванный вычитанием 3 из 1 для 'conv1d_1 / convolution / Conv2D' (op: 'Conv2D') с входными формами: [?, 1,1,133906 ], [1,3,133906,1].

Как мне решить эту проблему? Каким должен быть размер x_train и аргумент input_size, передаваемый в Conv1D?

1 Ответ

0 голосов
/ 02 февраля 2019

Слои Convolution1D принимают входные данные в формате [пакет, шаги, каналы]

Ваша длина окна свертки (размер ядра) не может превышать количество шагов.

Поэтому, если вы хотите использовать определенную форму ввода:

x_train.shape = (5,1,133906)

вам нужно изменить размер ядра на 1

т.е. изменить строку 9 на

model.add(Convolution1D(filters = 1, kernel_size = 1,input_shape=(1,x_train.shape[2])))

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

...