Я пытаюсь создать авто-кодер с керасом, и форма моих данных выглядит следующим образом:
(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")