Проблема с входной формой CNN (переменные формы входных образцов из обучающих / тестовых наборов) - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть некоторые проблемы с формой ввода моего CNN. Например, у меня есть N образцов различной формы (L, 20) Я хочу использовать этот набор данных в CNN и не понимаю, как передать этот набор данных в CNN, если для этого требуется конкретная форма с глубиной, например (20, 20, 1), но у меня есть (L, 20, 1) и N выборок, таких как список, который не возвращает форму в приемлемый формат. Первая идея очень проста: найдите max (L) и добавьте нули к другим образцам, и я получу хорошие формы, такие как (N, max(L), 20, 1), но я не думаю, что это будет хорошо, в любом случае, я думаю, что я попробую. Я прочитал о (None, None, 1) форме ввода, но я не понимаю, как она работает. Также у меня есть идея о пакетировании, но, как я понимаю, она мне тоже не подходит.

Предположим, у меня есть 4 образца для поезда с таким размером

0 (223, 24) 1 (272, 24) 2 (223, 24) 3 (93, 24)

И он содержится в train, который является списком с размером (4,)

Простой пример моего набора CNN из набора MNIST

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='linear',padding='same',
                 input_shape=(None, None, 1)))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling2D((2, 2),padding='same')) 2
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='linear',padding='same'))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3, 3), activation='linear',padding='same'))
model.add(LeakyReLU(alpha=0.1))                  
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Dropout(0.4))
model.add(Flatten())
model.add(Dense(128, activation='linear'))
model.add(LeakyReLU(alpha=0.1))           
model.add(Dropout(0.3))
model.add(Dense(num_classes, activation='softmax'))

Скомпилируйте и попробуйте потренироваться

model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adam(),metrics=['accuracy'])
model.fit(train, target, batch_size=batch_size,epochs=epochs,verbose=1)

И ожидаемая ошибка, если я попытаюсь обучить ее

ValueError: Ошибка при проверке входных данных модели: список массивов Numpy, передаваемых в вашу модель, отличается от ожидаемого размера модели. Ожидается увидеть 1 массив (ов), но вместо этого получен следующий список из 4 массивов: [массив ([[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 1, 0, 0], [0, 0, 0, ..., 0, 0, 1], ..., [1, 0, 0, ..., 0, 1, 1], [0, 0, 0, ..., 0, 0, 1], [0, 0, 0, ..., 0, 0, ...

Если есть какие-нибудь хитрости, чтобы это работало?

...