Почему последний полностью связанный / плотный слой в нейронной сети keras будет иметь 2 dim, даже если его вход имеет больше измерений? - PullRequest
0 голосов
/ 17 мая 2019

Я пробую нейронные сети с кератами в первый раз, и я немного запутался с ожидаемыми размерами.Я уверен, что мои данные X_train и y_train имеют одинаковое измерение, и что данные X_test и y_test также имеют одинаковое измерение, но я получаю эту ошибку от keras:

Ошибка при проверкевходные данные: ожидается, что dens_38_input имеет 2 измерения, но получил массив с формой (1, 512, 512, 186, 1)

Я попытался изменить наборы данных обучения и проверки с помощью (-1,2) соответствовать 2 измерениям, которые он ожидает, но это не работает, и я не уверен, почему.

Вот тренировочная модель, которую я пробую

num_classes = 2

input_shape = (512, 512, 186, 1)

model = Sequential()
model.add(Conv3D(32, kernel_size=(5, 5, 5), strides=(1, 1, 1),
                 activation='relu',
                 input_shape=input_shape))
model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2)))
model.add(Conv3D(64, (5, 5, 5), 
                 activation='relu'))
model.add(MaxPooling3D(pool_size=(2, 2, 2)))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

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

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Я уверен, что мои данные X_train и y_train имеют одинаковое измерение

Если ваш y размерно изометричен вашим данным X, то ваша выходная форма будет иметьбыть таким же, как ваша форма ввода.Я предполагаю, что вы хотите, чтобы выходная форма была указана в вашем последнем слое: выходной прогноз между двумя классами.В этом случае ваша y форма должна иметь размеры (num_samples, 2).

Для наглядности:

+---+------------------+------------------+-------------------------+
|   |  Dataframe shape | Data-point shape | Shape to assign network |
+---+------------------+------------------+-------------------------+
| X | (1000,244,244,3) |   (1,244,244,3)  |    input: (244,244,3)   |
+---+------------------+------------------+-------------------------+
| y |     (1000,2)     |       (1,2)      |       output: (2)       |
+---+------------------+------------------+-------------------------+
0 голосов
/ 17 мая 2019

Вместо:

model.add(Flatten())

используйте это:

model.add(GlobalAveragePooling3D())

В основном model.add(Desnse()), ожидалось бы 2 затемнения, т.е.(batch_size, channel), который совпадает с выводом GlobalAveragePooling3D().

...