Как получить точный выходной кодер для кластеризации похожих изображений - PullRequest
0 голосов
/ 05 января 2019

Я ожидал, что, если бы я обучал подобные изображения в автоэнкодере, выходные данные из энкодера были бы похожими, следовательно, если бы они проходили через алгоритм кластеризации, они образовали бы кластеры вокруг одной и той же точки. Поэтому я обучил модель идентичным изображениям (в основном 60 дубликатов одного изображения). Напротив, я заметил, что значения из кодировщика выглядят по-разному, и когда они проходят через кластеризацию kmeans, точки разбрасываются, что ничего не говорит о том, насколько мои изображения связаны друг с другом.

kmeans кластеризация из 60 дублированных изображений

def autoencoderConv2D(input_shape=(228, 228, 1), filters=[32, 64, 128, 10]):
input_img = Input(shape=input_shape)
if input_shape[0] % 8 == 0:
    pad3 = 'same'
else:
    pad3 = 'valid'
x = Conv2D(filters[0], 5, strides=2, padding='same', activation='relu', name='conv1', input_shape=input_shape)(input_img)

x = Conv2D(filters[1], 5, strides=2, padding='same', activation='relu', name='conv2')(x)

x = Conv2D(filters[2], 3, strides=2, padding=pad3, activation='relu', name='conv3')(x)

x = Flatten()(x)
encoded = Dense(units=filters[3], name='embedding')(x)
x = Dense(units=filters[2]*int(input_shape[0]/8)*int(input_shape[0]/8), activation='relu')(encoded)
print (x.shape)
x = Reshape((int(input_shape[0]/8), int(input_shape[0]/8), filters[2]))(x)
print (x.shape)
x = Conv2DTranspose(filters[1], 3, strides=2, padding=pad3, activation='relu', name='deconv3')(x)

x = Conv2DTranspose(filters[0], 5, strides=2, padding='same', activation='relu', name='deconv2')(x)
print (x.shape)
decoded = Conv2DTranspose(input_shape[2], 5, strides=2, padding='same', name='deconv1')(x)
return Model(inputs=input_img, outputs=decoded, name='AE'), Model(inputs=input_img, outputs=encoded, name='encoder')


autoencoder, encoder = autoencoderConv2D()
pretrain_epochs = 50
batch_size = 2
autoencoder.compile(optimizer='adadelta', loss='mse')
autoencoder.fit(x, x, batch_size=batch_size, epochs=pretrain_epochs)

encoded = encoder.predict(x)

encoded.shape

(60, 10)

n_clusters = 1
kmeans = KMeans(n_clusters=n_clusters, n_init=20, n_jobs=4)
y_pred_kmeans = kmeans.fit_predict(encoded)

Я также попробовал это с набором данных MNIST с цифрой 2, равной 5958 выборкам, и цифрой 4, равной 50 выборкам. Используя k = 2, кластеризация дает результат в виде рисунка ниже, который не показывает различий между двумя цифрами. Есть ли что-то, что я не делаю правильно, поскольку я пытаюсь применить эту технику для фильтрации изображений, когда разнородные изображения различаются и отфильтровываются от похожих.

MNIST dataset clustering of 6008 samples - 5958 digit-2 and 50 digit-4

...