Eğitiyoruz & Öğretiyoruz Serisi -1 : Python ile Veri Hazırlama

Numpy kütüphanesi kullanılarak Python'da oluşturulmuş bir veriseti .npy uzantısı ile kaydedilir. Bu dosya daha sonra kullanılmak istendiğinde np.load() fonksiyonu ile çağrılır.

Bir örnek olarak RF frekans sınıflandırma uygulamasında kullanılan verisetini ele alalım. Python'da rtl-sdr kütüphanesi kullanılarak USB fiziksel haberleşme arayüzünden bir SDR platformundan okunan IQ verilerini kompleks sayı olarak tutsun ve numpy array olarak kaydetsin.


import numpy as np
a=np.load('training_data\wfm\samples-akpvdqiapdzcrywq.npy')

Burada görüleceği üzere .npy uzantılı numpy array verisi okunmuştur.

print(a)

komutu ile de terminal ekranından görmek isteyelim:


şeklinde olacaktır. Burada görülen bir dizi var ve bu dizi Python veya veri bilimi dilinde 1D array olarak bilinir. 2 boyutlu olsaydı yani 2D array olsaydı bu bir matris olacaktır aslında.

Bu arada eğer bu diziyi bir CSV dosyası olarak yani .csv formatında kaydedecek ve sonra da Pycharm arayüzünde veya başka bir şekilde (excel ile vs.) içerisindeki verileri okumaya çalışsaydık aşağıdaki komutu kullanmamız yeterli olurdu:

np.savetxt("samples-akpvdqiapdzcrywq.csv", a, delimiter=",")


Görüldüğü üzere ilk görseldeki terminal çıktılarının aynısını (datanın yalnızca ufak bir kısmı görüntülendi) CSV dosyasında da görebiliyoruz. Kodun tamamı:

import numpy as np
a=np.load('training_data\wfm\samples-akpvdqiapdzcrywq.npy')
np.savetxt("samples-akpvdqiapdzcrywq.csv", a, delimiter=",")
print("Okunan .npy dosyası icerigi :")
print(a)

Eğer kompleks sayılarımızın real ve imajiner bileşenlerini ayırıp farklı sütunlar olarak ele almak istersek (ki bu da 2 boyutlu giriş verisi olarak ele alırken gerekecektir) bu durumd Python'ın kolaylıklarından faydalanmak işimize yarayacaktır. Aşağıdaki komutları çalıştırdığımızda bu işlemi de gerçekleştirmiş oluruz:

real = np.real(a)
img = np.real(a)
print(" REAL VALUES: \n")
print(real)
print(" IMAGE VALUES: \n")
print(img)


Buraya kadar yapılan işlemler sayesinde numpy array dosyasından IQIQIQIQ... olarak okunması zor olan bir veri dizisini I+jQ, I+jQ ... , I+jQ şeklinde bir veri setine çevirdik ve ardından I ve J bileşenlerini ayrı veri dizilerine aktardık. Ancak ANN uygulamamız için hala istediğimiz giriş veri setini tma olarak elde etmiş değiliz. Bundan sonrasında bu iki veri dizisini "concatenate" işlemi ile birleştirip aynı dosya içerisinde gösterebiliriz:

iq_samples = np.ravel(np.column_stack((real, img)))
np.savetxt("birlesik_veri.csv", iq_samples, delimiter=",")

Bunun çıktısı şu şekilde olacaktır:


Görüldüğü üzere yukarıda REAL ve IMAGE datası olarak ayrı ayrı görüntülediğimiz kompleks sayı bileşenleri burada alt alta görünmekte. Bundan sonra yapacağımız son dokunuş da çift sayılı satırlardaki IMAGE bileşeni verilerini ayrı bir sütunda göstermek. Böylece n satır 2 sütunlu verisetimizi ağımıza girecek uygun hale getirebiliriz.

iq_samples1 = iq_samples[:5000]
iq_samples1 = iq_samples1.reshape(2500, 2)
print("SHAPED DATA: ")
print(iq_samples1)
np.savetxt("birlesik_veri_SON.csv", iq_samples1, delimiter=",")

Yukarıdaki satırları uyguladıktan sonra istediğimiz işlemin çıktısını bir CSV dosyası içerisinde aşağıdaki şekilde görebiliyor olmamız gerekmektedir. 5000 satırlık bir kısmı alıp 2500 satır ve 2 sütun olacak şekilde verisetimizi şekillendirmiş olduk.


Artık verisetimiz bir sinir ağına girebilir ve mantıklı sonuçlar elde edilebilir. Burada Output yani Class olarak isimlendirdiğimiz verinin sınıfını girmedik henüz. O noktaya gelmeden önce bir CNN yani Evrişimsel Sinir Ağı'nda nasıl bir giriş seti oluştururuz onu görelim. CNN'ler daha çok resim verilerini girdi olarak alıp görüntü algılama ve kategorize etme uygulamalarında kullanıldıkları için giriş verisinin skalası daha farklıdır. Burada piksel mantığını düşündüğümüzde örnek olarak 20 x 20 piksel boyutlarında bir resim için bu 20 x 20 ifadesi aslında 20 satır 20 sütunluk 2D array olarak adlandırdığımız "matris" kavramını hatırımıza getirir. 
Bu uygulamada CNN ağımızın girişinde 28 x 2 boyutlarında matrislerden 28 tane olmasını istiyoruz. Verimizi bu şekilde şekillendiriyoruz. Bunu yaparken ağ modelimizi kurduğumuz train_keras.py dosyasında aşağıdaki satırı kullanıyoruz.

input_signal = Input(shape=(28, 28, 2))

Böylece ağımızın girişine 28*2 'lik matrislerden 28 taneyi aynı anda giriş verisi olarak alıyoruz. Bu da demek oluyor ki 28 * 28 * 2 yani 1568 adet değeri ağımıza girdik.

Yorumlar

Bu blogdaki popüler yayınlar

KV260 Kria Starter Kit Series: 3 - Petalinux Install and Boot

KV260 Kria Starter Kit Series: 1 - Power and Boot Up

KV260 Kria Starter Kit Series: 2 - Smartcam Application (Ubuntu)