Может ли модель Sequential Keras получить многомерный вход (например, изображение), который не будет сплющен (т.е. форма ввода будет MxN пикселей на изображение)? - PullRequest
0 голосов
/ 16 мая 2019

Я новичок в Keras и пытаюсь создать самый простой из возможных автоэнкодер.Он состоит из трех уровней: входного уровня, уровня кодированного представления и выходного уровня.Мои данные (обучающие и проверочные изображения) представляют собой единое целое, где каждое изображение имеет размер 214x214x3 (пиксели x пиксели x каналы RGB).Я думал, что мог бы просто использовать форму ввода изображений в слое Input, но я каким-то образом продолжаю сталкиваться с ошибками.

Я попытался сгладить данные, и это прекрасно работает.Я, конечно, могу просто сделать это и изменить форму вывода, но мне любопытно, почему это не работает.

# Shape and size of single image
input_shape = x_tr.shape[1:] # --> (214, 214, 3)
input_size = x_tr[0].size

# Size of encoded representation
encoding_dim = 32
compression_factor = float(input_size / encoding_dim)

# Build model
autoencoder = Sequential()
autoencoder.add(Dense(encoding_dim, input_shape=input_shape, 
    activation='relu'))
autoencoder.add(Dense(input_shape, activation='softmax'))

input_img = Input(shape=(input_shape,))
encoder_layer = autoencoder.layers[0]
encoder = Model(input_img, encoder_layer(input_img))

autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')
autoencoder.fit(x_tr, x_tr,
                epochs=50,
                batch_size=32,
                shuffle=True,
                verbose=1,
                validation_data=(x_va, x_va),
                callbacks=[TensorBoard(log_dir='/tmp/autoencoder2')])

Я получаю эту ошибку:

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

Я понялчто форма ввода не будет выглядеть так, но я не уверен, как исправить ее, чтобы она принимала входные данные в форме 214x214x3, а не вектор длиной 137388.

1 Ответ

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

Плотный Принимает целое число в качестве входных данных (количество нейронов), вы предоставили кортеж Попробуйте:

output_dim = 214 * 214 * 3
autoencoder.add(Dense(output_dim, activation='softmax'))

Вам необходимо сгладить ваши входы / выходы, полностью подключенный плотный слой ожидает одномерный ввод / вывод.

...