Autoencoding ile Kirlenmiş Dokümanları Temizleme

Bir yapay sinir ağı yöntemi olan Autoencoding’ı biraz daha detaylı inceleme fırsatım oldu. Öğrendiklerimi sırasıyla paylaşmaya çalışayım.

Autoencoding nedir?

Bahsettiğim gibi bir yönü olan yapay sinir ağı çeşididir. “Unsupervised”dır yani kullandığı veriler için bir etikete ihtiyaç duymaz. Temelinde bir veri sıkıştırma algoritmasıdır, diğer algoritmalardan farklı olarak;

+ Sıkıştırma algoritması üzerinde birilerinin çalışması gerekmez, yeni veri ile sürekli kendini geliştirebilir, tabi ağ üzerinde iyileştirmeler ama bu standart veri sıkıştırma çalışmalarının yanında küçük kalacaktır.

– Veriyi nasıl sıkıştıracağını veri setinden öğrenmesi gerekir.

– Eğitildiği veri setine benzer verileri sıkıştırabilir. Örneğin araba görselleri ile eğitildiğinde kedi görsellerini sıkıştırması yüksek hata içeren sonuçlar çıkaracaktır.

– Kayıp kaçınılmazdır.

Son derece spesifik alanda veri sıkıştırabiliyor olması kullanımını çok kısıtladığı için sıkıştırma problemlerinde kullanılması pratik olmuyor. Veri görselleştirmede verinin boyutlarını azaltmak ve veri parazitlerini gidermek(data denoising) için kullanılabilir. Birazdan yapacağım örnekte de üzerinde leke olan(parazit) görsellerin üzerindeki yazıları Autoencoding ile okumaya çalışacağız.

Ağın temel çalışma prensibi şu şekildedir. Giriş ve çıkış düğümleri(node) aynı sayıdadır ve çıkış düğümünün amacı bir tahmin yapmak değil, giriş düğümünü taklit edebilmektir. Diğer yöntemlerden öne çıkan farkı bu bence.

Giriş düğümleri, kendisinden daha az sayıda saklı düğüme(hidden layer) belirli ağırlık katsayıları(weight) ile yeniden düzenlenerek aktarılır(encode). Veri sıkıştırma becerisi bu adımda ortaya çıkıyor çünkü elimizdeki verilerden daha az sayıda veri düğümlerine sahibiz ve eğer uygun ağırlık katsayılarını bulabilirsek bu işlemi geri çevirerek giriş verimize yakın bir veri elde edebiliriz(decode).

https://probablydance.com/2016/04/30/neural-networks-are-impressively-good-at-compression/

Ağırlık katsayılarının hesaplanabilmesi için çıkış değerleri ile giriş değerleri arasındaki fark ölçülür ve öğrenme hızına(learning rate) göre ağırlıklar güncellenip tekrar çıkış verileri ve hata hesaplanır. Tabi bütün bunları Keras-Tensorflow ikilisi bizim için yapıyor olacak.

Peki bu hem sıkıştırma algoritmalarının hem de diğer öğrenme tekniklerinin gerisinde kalan Autoencoding nasıl uygulanabilir. Şurada ödülsüz bir Kaggle yarışması var. Sanal da olsa bir şekilde kirletilmiş olan içerisinde yazı bulunan görselleri bizden temizlememizi istiyor. Asıl amaç burada görselden yazıya çevirmek ama bu yazının konusu dışında olduğu için o kısmı daha sonra araştıracağım, şimdilik temizleme kısmı ile ilgileniyorum.

Toplam 3 veri var yarışmada; test, train ve train_cleaned. Bir kaç denemeden sonra şu şekilde ilerlemeye karar verdim; temiz olan train görselleri ile geçici bir veri seti oluşturup daha sonra buradaki görselleri 8 piksellik kareler halinde bölerek yeni, daha kullanışlı ve daha çok elemanlı bir veri seti elde etmek.

Kod üzerinde açıklamalar yapmaya çalıştım. Ayrıca şu Kaggle Notebookununda da bulabilirsiniz. Çıkan sonuçları gönderdiğimde ~0.17(RMS) hata verdi, optimize edilmemiş olmasına rağmen fena değil.

test_img = np.array(test_dirty_raw[np.random.randint(len(test_dirty_raw))]) / 255

d0_batch = math.ceil(test_img.shape[0] / img_batch_size)
d1_batch = math.ceil(test_img.shape[1] / img_batch_size)

test_img_p = np.ones(test_img.shape)

# aldığımız görseli parçalara bölüp
# modelimizden geçirip
# test_img_p üzerinde tekrar birleştirelim
for d0_i in range(d0_batch):
    for d1_i in range(d1_batch):
        img_batch = test_img[d0_i*img_batch_size: (d0_i + 1)*img_batch_size,
                             d1_i*img_batch_size: (d1_i + 1)*img_batch_size]

        if img_batch.size == img_batch_size*img_batch_size:
            img_batch = np.array(img_batch.reshape(1,img_batch.size))

            img_batch_p = autoencoder.predict(img_batch)
            img_batch_p = img_batch_p.reshape((img_batch_size,img_batch_size))

            test_img_p[d0_i*img_batch_size: (d0_i + 1)*img_batch_size,
                       d1_i*img_batch_size:(d1_i + 1)*img_batch_size] = img_batch_p

img_batch = d0_batch = d1_batch = d0_i = d1_i = None

# görselmize bakalım
plt.figure(figsize=(10, 10))

ax = plt.subplot(2, 1, 1)
plt.imshow(test_img * 255)
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)

ax = plt.subplot(2, 1, 2)
plt.imshow(test_img_p * 255)
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)

plt.show()

Detaylı bilgi için yararlandığım diğer kaynaklar;
https://probablydance.com/2016/04/30/neural-networks-are-impressively-good-at-compression/
https://en.wikipedia.org/wiki/Autoencoder
https://blog.keras.io/building-autoencoders-in-keras.html


Yayımlandı

kategorisi

yazarı:

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir