Попытка создать сверточную нейронную сеть Автоэнкодера в Керасе, но она продолжает падать - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь создать авто-кодер с керасом, и форма моих данных выглядит следующим образом: (62328, 1, 40, 40)

Ошибка:

ValueError: отрицательный размерный размер, вызванный вычитанием 3 из 1 для 'conv2d / Conv2D' (op: 'Conv2D') с входными формами: [?, 1,40,40], [3,3,40,4]

и я не знаю, как это исправить. Я пытался изменить data_format на channels_last или channels_first, но все равно он не работает.

Пожалуйста, помогите

K.set_image_data_format('channels_last')
dense_layer = 0
layer_size = 4
conv_layer = 1
IMG_SIZE = 40

NAME = "AutoEncoder-{}-conv-{}-nodes-{}-dense-{}".format(conv_layer, layer_size, dense_layer, int(time.time()))

загрузка данных

pickle_in = open("X5.pickle","rb")
X = pickle.load(pickle_in)
pickle_in.close()
X=np.array(X)
print( X.shape)
X= X/255

pickle_in = open("y5.pickle","rb")
y = pickle.load(pickle_in)
pickle_in.close()
y=np.array(y)

начиная с модели в керасе

model = Sequential()
#encoding

здесь моя проблема возникает

shape=[1,IMG_SIZE,IMG_SIZE]
print (shape)
model.add(Conv2D(4, (3,3),input_shape = shape))

кодирование / декодирование данных

model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

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

model.add(Conv2D(2, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) #encoded

#decoding
model.add(UpSampling2D((2,2)))
model.add(Conv2D(2, (3,3)))
model.add(Activation('relu'))

model.add(UpSampling2D((2,2)))
model.add(Conv2D(2, (3,3)))
model.add(Activation('relu'))

model.add(UpSampling2D((2,2)))
model.add(Conv2D(4, (3,3)))
model.add(Activation('relu'))

model.add(Conv2D(1,(3,3)))
model.add(Activation('sigmoid'))
tensorboard = TensorBoard(log_dir="logs/{}".format(NAME))

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

model.summary()

model.fit(X,X,
          batch_size=32,
          epochs=10,
          validation_split=0.3,
          callbacks=[tensorboard])
model.save("64x3-CND.model")

1 Ответ

0 голосов
/ 17 апреля 2019

Это потому, что ваша форма ввода неверна, а для переменной data_format установлено значение channels_last, ожидается, что форма ввода изображений будет (HEIGHT, WIDTH, CHANNELS_NUM).

Изменение data_format на channels_first должно решить вашу проблему.

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