Tensorflow ile AUTOENCODERS

Onuryilmaz
Google Developer Student Clubs
5 min readMar 29, 2021

AutoEncoder Nedir ?

AutoEncoder, Çok boyutlu olan verilerimizi önce Encoder ile sıkıştıran daha sonra da decoder dediğimiz yapı ile datamızı reconstruct ettiğimiz bir unsupervised yöntemdir.

AutoEncoders yönteminde sinir ağımızın Input Layer’ındaki node’lar ile Output Layer’ında ki node’ların sayısı birbirine eşittir (Boyutlar birbirine eşit) . Kırmızı alanda gördüğümüz Encoder ile verimizi sıkıştırdıktan sonra Mavi bölge içerisindeki Decoder verimizi tekrardan aynı boyuta getiririz.

AutoEncoders’ı üç farklı alanda kullanabiliyoruz. Bunların birincisi verilerimizde bulunan temel (önemli) özellikleri çıkarmaktır(keşfetmek). İkinci kullanım alanı ise görüntü denoising dediğimiz datamızda bulunan ve onları bozan gürültüleri temizlemektir. Karşımıza çıkan son kullanım alanı ise Anomali algılamadır. Şimdi bunları sırayla açıklarken aynı zamanda kod üzerinde de pratik yaparak uygulayacağız.

Kütüphaneleri ve Veri Kümesini Ekleme

Fashon MNIST veri kümesini kullanarak AutoEncodersları açıklayacağız. Bu veri setindeki görüntülerimiz 28x28 piksele sahiptir. Siyah Beyaz olduğundan dolayı kanal sayısı 1'dir.

1. Özellik Çıkarımı :

Veri Kümemizde bulunan görsellerimizde ki özelliklerin tespiti için AutoEncoder kullanacağız. Bunun için ilk önce görsellerdeki bilgileri bir vektöre sıkıştıran encoder tanımlayacağız. Daha sonradan sıkıştırılmış vektörden tekrardan görüntü oluşturan decoder oluşturacağız.

Modelimizi oluşturduktan sonra eğitmek için girdi ve hedef verilerini vereceğiz. Burada hem input hem de hedef değişken olarak x_train kullanacağız. Bunun sebebi modelimiz ilk önce veri setini sıkıştırmayı öğrenecek daha sonra decoder orijinal görüntüleri tekrardan oluşturmayı öğrenecek.

Modelimizi oluştururken Keras’ın Alt Sınıflandırma API’sını kullandık. Daha sonradan modelimizi derleyip eğittik. Artık modelimiz eğitildiğine göre test setimiz üzerinden deneme gerçekleştirelim. Bakalım özellik çıkarımını öğrenebilmiş mi ?

Test verilerimiz üzerinde yaptığımız denemenin çıktıları yukarıda görülmektedir. Görüneceği üzere modelimiz gayet iyi şekilde orijinal haline çok yakın çıktılar oluşturmuş. Bu da modelimiz özellikleri öğrenme kısmında iyi iş çıkardığını göstermektedir.

2. Görüntü Denoising :

AutoEncoders’ın en çok kullanıldığı alanlardan biriside görüntülerde bulunan gürültülerin temizlenmesidir. Görüntülerde bulunan bu gürültüler modelimizin öğrenme aşamasında eksik öğrenme, yanlış öğrenme gibi kötü sonuçlara yol açabilmektedirler. Bundan dolayı bir eğitime başlamadan önce gürültüleri temizlemek daha iyi bir model oluşturmamıza yardımcı olacaktır.

Bu örneğimizi açıklarken de aynı veri seti üzerinden ilerleyeceğiz.

Fashion Mnist veri kümemizde ki görsellerde çok fazla gürültü yoktur. Temiz sayılabilecek resimler içerir. Bu yüzden manuel olarak kendimiz resimlere gürültü ekleyeceğiz. Bunun sebebi Autoencoders kullandıktan sonraki farkı daha iyi görmek istememizdir.

Kod üzerinden de görebileceğimiz üzere ilk önce görsellerimize random bir şekilde gürültü ekledik. Daha sonra tf.clip_by_value ile tensörlerimizi parametre olarak verdiğimiz min-max aralığına dönüştürdük. Bu işlemi Normalizasyon gibi görebiliriz. Daha sonrada oluşan gürültülü görüntülerimizi ekrana yazdırdık. oluşan çıktılar şu şekilde :

Gördüğünüz gibi normal veri setimize göre daha gürültülü (bozuk) görsellerimiz mevcut. O zaman veri setimizi istediğimiz şekle getirdiğimize göre şimdi AutoEncoders için modelimizi oluşturabiliriz.

Şimdi de keras API’sini kullanarak modelimizi oluşturduk. Gördüğünüz gibi 28x28 olarak modelimize giren görüntüler encoder ile sıkıştırılıyor ve daha sonra decoder ile tekrardan görüntüler oluşturuluyor. Modelimizin başarısını oluşturduğu görsellerle orijinallerini karşılaştırarak görelim.

Test veri setimiz üzerinden yaptığımız denemenin sonuçlarını yukarıda görmektesiniz. Orijinal görsellerimiz çok fazla gürültüye sahipler. Alt satırda gördüğümüz resimler ise Autoencoders ile üretilmiş resimlerimiz. Modelimiz güzel bir başarı göstermiş ve gürültüleri iyi bir şekilde temizlemiş. Bundan sonrada temizlenmiş veri setimizle yeni modeller kurmaya başlayabilirsiniz.

3. Anomali Tespiti :

AutoEncoders kullanılan en önemli alanlarından bir tanesi de Anomali değerlerin tespiti konusudur. Bu gibi sorunlarda Autoencoders kullanarak veri setimizde ki anomali olan değerleri tespit edip, veri kümemizden çıkarabiliyoruz.

İlk önce bu kısmı anlatırken kullanacağımız veri setinden bahsedelim ve yükleyelim. Anomali Tespitini açıklarken kullanacağımız veri seti İnsanların EKG çektirmesi sonucu oluşan 140 veri noktasına sahip 5000 tane örnek içerir. Şimdi bu veri setimizi indirelim :

Peki bu veri setinde Anomali Tespitini nasıl yapacağız ? Yapacağımız ilk şey Autoencoders modelimizi normal ritimler üzerinden eğiteceğiz. Daha sonra verilerimizi tekrardan yapılandırmak için modelimizi kullanacağız. Bu noktada anormal ritimlerin yeniden yapılandırırken daha yüksek hataya sahip olacaktır. İşte bizde bunun için belirli bir eşik değeri belirleyeceğiz. Eğer oluşan hatalar belirlediğimiz bu sabit hatayı aşarsa bunları anomali değer olarak nitelendireceğiz.

Veri setimizi kullanıma hazır hale getirmek için bir kaç işlem gerçekleştiriyoruz. Fonksiyonların yaptığı işlemler yanlarında açıklamalarıyla belirtilmiştir.

Burada yaptığımız işlem ise normal bir insanın EKG’sinin nasıl olduğunu çizdirmek oldu. Bir de anormal bir EKG görüntüsünü görelim.

Veri setimizi hazırladık ve örnek olarak 2 tane görselleştirme yaptık. Şimdi modelimizi oluşturmaya başlayabiliriz.

Daha önce oluşturduğumuz modellerde olduğu gibi burada da encoder ve decoder olmak üzere yapı oluşturduk. İlk önce verilerimizi encoder ile sıkıştırdık ve daha sonra decoder ile sıkıştırılan vektörden verimizi yeniden üretmesini sağladık.

Oluşturduğumuz modeli derleyip eğittikten sonra kullanıma hazır hale getirdik. Ama kullanmadan önce modelimizin Loss değerinin nasıl değiştiğini grafik üzerinde görelim.

Grafik üzerinde modelimizin Loss değerini görüyoruz. Düzenli olarak düşmesi ve son epochda da loss’un düşük olması bizim için çok güzel bir haber. Şimdi de orijinal bir EKG ile decoder ile tekrardan oluşturulmuş bir EKG grafiğini görelim.

Yukarıdaki hipotezimizde bahsettiğimiz gibi anomali değerleri tespit ederken belirlediğimiz bir Threshold değerini kullanacağız. Peki bu değeri nasıl belirleyeceğiz ? Bunun için bizim kullanacağımız yöntem normal EKG’leri yeniden oluştururken ortaya çıkan hataların ortalamasına standart sapmayı eklemek olacaktır.

Modelimiz üzerinden normal dataları kullanarak tahminler gerçekleştirdik ve buna göre bir Threshold değeri belirledik. Anomali tespiti yaparken bunu kullanacağız.

O zaman Anomali Tespitini gerçekleştirmek için gereken fonksiyonlarımızı yazalım ve metriclere göre modelimizi değerlendirelim.

Yukarıda yazdığımız 2 fonksiyonu açıklayalım. İlk fonksiyonda parametre olarak modelimizi, veri setimizi ve sınır değerimizi veriyoruz. Bunlara göre ilk önce bir loss hesaplanıyor ve bu loss değeri ile Threshold değeri karşılaştırarak anomali tespiti gerçekleştiriyoruz. İkinci fonksiyonumuzda ise test verilerimiz ile modelimizi değerlendiriyoruz. Bunun çıktısında da görebileceğimiz üzere modelimiz yüksek bir performans göstermektedir.

Kaynakça (Sources):

  1. https://www.tensorflow.org/tutorials/generative/autoencoder
  2. https://blog.keras.io/building-autoencoders-in-keras.html
  3. http://ufldl.stanford.edu/tutorial/unsupervised/Autoencoders/
  4. https://lazyprogrammer.me/a-tutorial-on-autoencoders/
  5. https://www.tensorflow.org/guide/keras/custom_layers_and_models

--

--

Onuryilmaz
Google Developer Student Clubs

Istanbul University- Industrial engineering / Computer Engineering / Junior Software Engineer @LcWaikiki