Ошибки измерений в нейронной сети в Керасе - PullRequest
2 голосов
/ 15 марта 2019

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

ValueError: Все входные массивы (x) должны иметь одинаковое количество выборок.Получил формы массива: [(1, 100, 60, 4500), (100, 4500)]

У меня есть два разных ввода:

  1. изображение (размеры: 1100, 60, 400), где 1 - канал, 100: # выборки, 60 * 4500 (размер моего изображения).Это относится к моей нейронной сети свертки

  2. позиции (размеры: 100,4500): где 100 относится к образцам.

Размер для моего вывода равен 100,2.

Код для моей нейронной сети:

###Convolution neural network
b1 = Sequential()
b1.add(Conv2D(128*2, kernel_size=3,activation='relu',data_format='channels_first',
              input_shape=(100,60,4500)))
b1.add(Conv2D(128*2, kernel_size=3, activation='relu'))
b1.add(Dropout(0.2))

b1.add(Conv2D(128*2, kernel_size=4, activation='relu'))
b1.add(Dropout(0.2))


b1.add(Flatten())
b1.summary()

###Fully connected feed forward neural network
b2 = Sequential()
b2.add(Dense(64, input_shape = (4500,), activation='relu'))
b2.add(Dropout(0.1))
b2.summary()

model = Sequential()

###Concatenating the two networks
concat = concatenate([b1.output, b2.output], axis=-1)

x = Dense(256, activation='relu', kernel_initializer='normal')(concat)
x = Dropout(0.25)(x)
output = Dense(2, activation='softmax')(x)

model = Model([b1.input, b2.input], [output])

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adam(),
              metrics=['accuracy'])

history = model.fit([image, positions], Ytest, batch_size=10,
              epochs=1,
              verbose=1)

Кроме того, причина, по которой мой массив 'image' является 4-мерным, заключается в том, чтов начале это было просто (100,60,4500), но потом я столкнулся со следующей ошибкой:

ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_10_input имеет 4 измерения, но получил массив с формой (100, 60, 4500)

И после поиска в Google я обнаружил, что он также ожидает # каналов в качестве входа.И после того, как я добавил # канала, эта ошибка ушла, но затем я столкнулся с другой ошибкой, о которой я упоминал в начале.

Так может кто-нибудь сказать мне, как найти ошибку (ту, которую я указал в начале)?Помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Смешивать Sequential и Functional API.

не рекомендуется.

i1 = Input(shape=(1, 60, 4500))

c1 = Conv2D(128*2, kernel_size=3,activation='relu',data_format='channels_first')(i1)
c1 = Conv2D(128*2, kernel_size=3, activation='relu')(c1)
c1 = Dropout(0.2)(c1)
c1 = Conv2D(128*2, kernel_size=4, activation='relu')(c1)
c1 = Dropout(0.2)(c1)
c1 = Flatten()(c1)

i2 = Input(shape=(4500, ))
c2 = Dense(64, input_shape = (4500,), activation='relu')(i2)
c2 = Dropout(0.2)(c2)

c = concatenate([c1, c2])

x = Dense(256, activation='relu', kernel_initializer='normal')(c)
x = Dropout(0.25)(x)
output = Dense(2, activation='softmax')(x)

model = Model([i1, i2], [output])

model.summary()

Обратите внимание, что форма i1 есть shape=(1, 60, 4500).Вы установили data_format='channels_first' в слое Conv2D, поэтому вам нужно 1 в начале.

Скомпилировать модель следующим образом

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

Заполнители данных

import numpy as np

X_img = np.zeros((100, 1, 60, 4500))
X_pos = np.ones((100, 4500))
Y = np.zeros((100, 2))

Тренировка

history = model.fit([X_img, X_pos], Y, batch_size=1,
              epochs=1,
              verbose=1)
1 голос
/ 15 марта 2019

Количество образцов (размер партии) всегда должно быть первым измерением. Итак, ваши данные должны иметь форму (100, 1, 60, 4500) для изображения и (100, 4500) для позиций. Аргумент channels_first для слоя Conv2D означает, что каналы - это первое не пакетное измерение.

Вам также необходимо изменить форму ввода на (1, 60, 4500) в первом слое Conv2D.

...