Denetimsiz kümeleme uygulamak için Keras nasıl kullanılır?

Leifeng.com AI Araştırma Enstitüsü Basını: Bu makale, Leifeng.com'un altyazı grubu tarafından derlenen teknik bir blogdur.Orijinal başlık A, Word2Vec - Derin Öğrenmede küçük bir adımdır, ancak Doğal Dil İşleme yolunda dev bir adımdır, yazar makine öğrenimi mühendisi Suvro Banerjee'dir

Tercüme | Cheng Wei Li Haoyang Bitti | Kong Lingshuang

Orijinal bağlantı:

https://medium.com/@chengweizhang2012/how-to-do-unsupervised-clustering-with-keras-9e1284448437

Derin öğrenme algoritmalarının doğrusal olmayan gösterimleri ifade etme konusundaki mükemmel yeteneği nedeniyle, girdiyi etiketli bir veri setinin çıktısına eşlemek için çok uygundur. Bu göreve sınıflandırma denir. Birinin verileri etiketlemesini gerektirir. İster X-ışını görüntülerine açıklama eklemek ister haber raporlarının konusu olsun, veri seti arttığında insan müdahalesine güvenmek zaman alıcı ve yoğun emek gerektirir.

Küme analizi veya kümeleme, denetimsiz bir makine öğrenimi tekniğidir. Etiketli bir veri seti gerektirmez. Veri üyelerini benzerliklerine göre gruplayabilir.

Neden buna dikkat etmen gerekiyor? Birkaç nedenden bahsedeyim.

Kümeleme uygulaması

  • Öneri sistemi, kullanıcının satın alma geçmişini öğrenerek, kümeleme modeli kullanıcıları benzerliğe göre ayırt edebilir. Benzer düşünen kullanıcıları ve ilgili ürünleri bulmanıza yardımcı olabilir.

  • Biyolojide, dizi kümeleme algoritmaları, ilgili biyolojik dizileri gruplandırmaya çalışır. Proteinleri amino asit içeriğine göre kümeler.

  • Görüntü ve video kümeleme analizi, onları benzerliğe göre gruplandırır.

  • Tıbbi veri tabanında, gerçekten değerli testler (glikoz, kolesterol gibi) her hasta için farklıdır. İlk olarak, hastaların küme analizi, gerçekten değerli özellikleri sınıflandırmamıza yardımcı olabilir ve böylece özellik dağılımını azaltabilir. Kanser hastalarının sağkalımını tahmin etmek gibi sınıflandırma görevlerinin doğruluğunu artırabilir.

  • Genel kullanımda, sınıflandırma, örüntü keşfi, hipotez oluşturma ve test etme için verilerin bir özetini oluşturabilir.

Her durumda, veri bilimcileri için kümeleme çok değerli bir araçtır.

İyi kümeleme nasıl yapılır

İyi bir kümeleme yöntemi, aşağıdaki özelliklere sahip olan yüksek kaliteli sınıflandırma oluşturmalıdır:

  • Grup içinde yüksek benzerlik: grup içinde yakın toplama

  • Gruplar arasında düşük benzerlik: her grup farklıdır

  • K-Means algoritması için bir temel belirleyin

    Geleneksel K-Means algoritması hızlıdır ve çeşitli problemleri çözmek için yaygın olarak kullanılabilir. Ancak, mesafe ölçümü orijinal veri alanı ile sınırlıdır. Bu nedenle, girdi veri boyutu yüksek olduğunda, görüntü setleri gibi verimliliği azalacaktır.

    MNIST el yazısı yazı tiplerini 10 gruba ayırmak için bir K-Means modeli eğitelim.

    sklearn.cluster'dan ithal KMeans

    keras.datasets'den ithalat mnist

    (x_train, y_train), (x_test, y_test) = mnist.load_data

    x = np.concatenate ((x_train, x_test))

    y = np.concatenate ((y_train, y_test))

    x = x.reshape ((x.shape, -1))

    x = np. bölme (x, 255.)

    # 10 küme

    n_clusters = uzunluk (np.unique (y))

    # Paralel 4 CPU'da çalışır

    korta = KMeans (n_kümeler = n_kümeler, n_init = 20, n_jobs = 4)

    # K-Means'ı eğitin.

    y_pred_kmeans = kmeans.fit_predict (x)

    # K-Means kümeleme doğruluğunu değerlendirin.

    metrics.acc (y, y_pred_kmeans)

    K-Means kümeleme algoritmasının doğruluğunun% 53,2 olduğu tahmin edilmektedir. Bunu daha sonra derin gömülü kümeleme modeli ile karşılaştıracağız.

    • Bir otomatik kodlayıcı, ön eğitim yoluyla, ilk sıkıştırmadan sonra etiketlenmemiş veri kümesinin temsilini öğrenir.

    • Kodlayıcının üzerinde oluşturulan kümeleme katmanı, çıktıyı bir gruba gönderir. Mevcut değerlendirme ile elde edilen K-Means kümeleme merkezine bağlı olarak, kümeleme katmanı ağırlık değerinin başlatılmasını tamamlar.

    • Kümeleme katmanını ve kodlayıcıyı geliştirirken kümeleme modelini eğitin.

    Kaynak kodunu mu arıyorsunuz? Github'ımda kontrol edin.

    Ön eğitim otomatik kodlayıcı

    Autoencoder bir veri sıkıştırma algoritmasıdır. Kodlayıcı ve kod çözücü olmak üzere iki ana bölümden oluşur. Kodlayıcının görevi, giriş verilerini daha düşük boyutlu özelliklere sıkıştırmaktır. Örneğin, 28x28 MNIST görüntüsünde toplam 784 piksel vardır. Kodlayıcı, onu 10 kayan noktalı sayı dizisi halinde sıkıştırabilir. Bu kayan nokta sayılarını görüntünün özellikleri olarak kullanıyoruz. Diğer yandan kod çözücü, sıkıştırılmış özellikleri girdi olarak alır ve orijinal görüntüye mümkün olduğu kadar benzer bir görüntüyü yeniden oluşturmak için kullanır. Aslında, otomatik kodlayıcı, denetimsiz bir öğrenme algoritmasıdır. Eğitim sürecinde, etikete değil, yalnızca görüntünün kendisine ihtiyaç duyar.

    Otomatik kodlayıcı

    Otomatik kodlayıcı, tamamen bağlı simetrik bir modeldir. Simetriktir çünkü görüntü sıkıştırma ve açma işlemi, tamamen zıt karşılık gelen süreçler kümesidir.

    Tamamen bağlı otomatik kodlayıcı

    Otomatik kodlayıcıyı 300 tur için eğiteceğiz ve model ağırlık değerini kaydedeceğiz.

    autoencoder.fit (x, x, batch_size = 256, epochs = 300) #, callbacks = cb)

    autoencoder.save_weights ('./ results / ae_weights.h5')

    Kümeleme modeli

    Otomatik kodlayıcıyı eğiterek, kodlayıcının her bir görüntüyü 10 kayan nokta sayısına sıkıştırmayı öğrenmesini sağladık. Girdi boyutu 10'a düşürüldüğü için K-Ortalamaları algoritmasının bundan kümelenmeye başlaması gerektiğini düşünebilirsiniz. Evet, küme merkezleri oluşturmak için K-Means algoritmasını kullanacağız. 10 boyutlu öznitelik vektör uzayında 10 grubun merkezidir. Ancak giriş özelliklerini grup etiketi olasılıklarına dönüştürmek için özel kümeleme katmanımızı da oluşturmamız gerekiyor.

    Bu olasılık, t dağılımından hesaplanır. T dağılımı mahalle gömme algoritması gibi T dağılımı, iç nokta ile merkez nokta arasındaki benzerliği ölçer. Tahmin edebileceğiniz gibi, kümeleme katmanının rolü, kümeleme için K-ortalamasına benzer ve bu katmanın ağırlığı, K-araçlarının eğitilmesiyle başlatılabilen küme merkezini temsil eder.

    Keras'ta özel katmanlar oluşturma konusunda yeniyseniz, uygulayabileceğiniz üç uygulama yöntemi vardır.

    • katmanın ağırlığını tanımladığınız yerde (input_shape), bizim örneğimizde bu 10-D özellik uzayında 10 küme, yani 10x10 ağırlık değişkenidir.

    • katman mantığının bulunduğu, yani özelliğin kümeleme etiketinin büyüsüyle eşlendiği (x) çağrısı.

    • compute_output_shape (input_shape), giriş şeklinden çıktı şekline şekil dönüştürme mantığını belirtirsiniz.

    İşte özel kümeleme katmanı kodu,

    class ClusteringLayer (Layer):

    "" "

    Kümeleme katmanı, girdi örneğini (özelliği) yumuşak etikete dönüştürür.

    # Misal

    ''

    model.add (ClusteringLayer (n_clusters = 10))

    ''

    # Argümanlar

    n_kümeler: küme sayısı.

    ağırlıklar: "(n_clusters, n_features)" şeklindeki Numpy dizisinin listesi ilk küme merkezlerini temsil eder.

    alpha: Student t dağılımındaki serbestlik derecesi parametresi. Varsayılan değer 1.0'dır.

    # Giriş şekli

    Şekilli 2D tensör: "(n_samples, n_features)`.

    # Çıktı şekli

    Şekilli 2D tensör: "(n_samples, n_clusters)`.

    "" "

    def __init __ (öz, n_kümeler, ağırlıklar = Yok, alfa = 1.0, ** kwargs):

    if'input_shape 'kwargs'ta değil ve kwargs'da'put_dim':

    kwargs = (kwargs.pop ('input_dim'),)

    super (ClusteringLayer, self) .__ init __ (** kwargs)

    self.n_clusters = n_clusters

    self.alpha = alpha

    self.initial_weights = ağırlıklar

    self.input_spec = InputSpec (ndim = 2)

    def build (self, input_shape):

    len (input_shape) == 2

    input_dim = input_shape

    self.input_spec = InputSpec (dtype = K.floatx, şekil = (Yok, input_dim))

    self.clusters = self.add_weight ((self.n_clusters, input_dim), başlatıcı = 'glorot_uniform', ad = 'kümeler')

    self.initial_weights None değilse:

    self.set_weights (self.initial_weights)

    del self.initial_weights

    self.built = Doğru

    def çağrısı (self, inputs, ** kwargs):

    t-SNE algoritmasında kullanılanla aynı "" "öğrenci t dağılımı.

    q_ij = 1 / (1 + dist (x_i, µ_j) ^ 2), sonra normalleştirin.

    q_ij, örnek i'yi j kümesine atama olasılığı olarak yorumlanabilir.

    (yani yumuşak bir atama)

    Argümanlar:

    girdiler: verileri içeren değişken, şekil = (n_örnekler, n_özellikler)

    Dönüş:

    q: öğrencinin t dağılımı veya her örnek için yumuşak etiketler. şekil = (n_örnekler, n_kümeler)

    "" "

    q = 1.0 / (1.0 + (K.sum (K.square (K.expand_dims (girişler, eksen = 1) -kendi kümeleri), eksen = 2) / self.alpha))

    q ** = (self.alpha + 1.0) / 2.0

    q = K.transpose (K.transpose (q) / K.sum (q, axis = 1)) # Her örneğin 10 değerinin 1'e eşit olduğundan emin olun.

    dönüş q

    def compute_output_shape (self, input_shape):

    input_shape ve len (input_shape) == 2 onaylayın

    return input_shape, self.n_clusters

    def get_config (self):

    config = {'n_clusters': self.n_clusters}

    base_config = super (ClusteringLayer, self) .get_config

    dönüş diktesi (list (base_config.items) + list (config.items))

    Daha sonra, bir kümeleme modeli oluşturmak için önceden eğitilmiş kodlayıcıdan sonra kümeleme katmanlarını istifliyoruz. Kümeleme katmanı için, ağırlıklarını başlatıyoruz ve küme merkezi, tüm görüntülerin özellik vektörlerini eğitmek için k-araçlarını kullanıyor.

    clustering_layer = ClusteringLayer (n_clusters, name = 'clustering') (encoder.output)

    model = Model (inputs = encoder.input, outputs = clustering_layer)

    # K-araçlarını kullanarak küme merkezlerini başlatın.

    kortalar = KMeans (n_kümeler = n_kümeler, n_init = 20)

    y_pred = kmeans.fit_predict (encoder.predict (x))

    model.get_layer (name = 'kümeleme'). set_weights ()

    Kümeleme modeli yapısı

    Kümeleme modelini eğitin

    Yardımcı hedef dağılımı ve KL sapma kaybı

    Bir sonraki adım, hem küme atamasını hem de özellik sunumunu iyileştirmektir. Bu amaçla, merkeze dayalı bir hedef olasılık dağılımı tanımlayacağız ve model kümeleme sonucuna göre KL sapmasını en aza indireceğiz.

    Hedef atamanın aşağıdaki özelliklere sahip olmasını istiyoruz:

    • Tahmini güçlendirin, yani küme saflığını iyileştirin.

    • Yüksek güvenlikle atanan veri noktalarına daha fazla dikkat edin.

    • Büyük kümelerin gizli özellik alanını bozmasını önleyin.

    Hedef dağılım, önce q'nun (kodlama özelliği vektörü) ikinci güce yükseltilmesi ve ardından her kümenin frekansı ile normalize edilerek hesaplanır.

    def target_distribution (q):

    ağırlık = q ** 2 / q.sum (0)

    getiri (ağırlık.T / ağırlık.sum (1)). T

    Yardımcı hedef dağılımları yardımıyla yüksek güvenilirlikli atamalardan öğrenerek kümeleri yinelemeli olarak iyileştirmek gerekir. Belirli sayıda yinelemeden sonra, hedef dağıtım güncellenir ve kümeleme modeli, hedef dağıtım ile küme çıktısı arasındaki KL sapma kaybını en aza indirmek için eğitilir. Eğitim stratejileri, bir kendi kendine eğitim biçimi olarak görülebilir. Tıpkı kendi kendine eğitimde olduğu gibi, bir ilk sınıflandırıcı ve etiketlenmemiş bir veri seti alırız ve daha sonra, yüksek güvenilirlik tahminlerini eğitmek için veri kümesini etiketlemek için sınıflandırıcı kullanırız.

    Kayıp fonksiyonu, KL diverjansı veya Kullback-Leibler ıraksaması, iki farklı dağılım arasındaki davranış farkının bir ölçüsüdür. Hedef dağıtımın küme çıktı dağıtımına mümkün olduğunca yakın olması için bunu en aza indirmek istiyoruz.

    Aşağıdaki kod parçacığında, hedef dağıtım her 180 eğitim yinelemesinde güncellenir.

    model.compile (optimize edici = SGD (0.01, 0.9), kayıp = 'kld')

    maksiter = 8000

    update_interval = 140

    aralıktaki ite için (int (maxiter)):

    ite% update_interval == 0 ise:

    q = model.predict (x, ayrıntılı = 0)

    p = target_distribution (q) # yardımcı hedef dağıtımını güncelle p

    # kümeleme performansını değerlendirin

    y_pred = q.argmax (1)

    y Hiçbiri değilse:

    acc = np.round (metrics.acc (y, y_pred), 5)

    idx = dizin_dizisi

    model.train_on_batch (x = x, y = p)

    dizin = dizin + 1 if (dizin + 1) * batch_size

    Her güncellemeden sonra, kümeleme doğruluğunda sürekli bir artış göreceksiniz.

    Değerlendirme indeksi

    Bu metrik,% 96,2'lik bir kümeleme doğruluğuna ulaştığını gösterir; bu, girdinin etiketlenmemiş bir görüntü olduğu düşünüldüğünde çok iyidir. Doğruluğuna daha yakından bakalım.

    Bu metriğin, denetimsiz algoritmadan ve kesin referans atamasından bir küme ataması elde etmesi ve ardından aralarındaki en iyi eşleşmeyi bulması gerekir.

    En iyi haritalama, scikit öğrenme kitaplığında uygulanan Macar algoritması ile doğrusal atama olarak verimli bir şekilde hesaplanabilir.

    sklearn.utils.linear_assignment_ adresinden import linear_assignment

    y_true = y.astype (np.int64)

    D = max (y_pred.max, y_true.max) + 1

    w = np.zeros ((D, D), dtype = np.int64)

    # Karışıklık matrisi.

    aralıktaki i için (y_pred.size):

    w + = 1

    ind = doğrusal_ atama (-w)

    acc = toplam () * 1.0 / y_pred.size

    Karışıklık matrisine daha doğrudan bakın.

    Karışıklık matrisi

    Burada, küme atamasını manuel olarak hızlı bir şekilde eşleştirebilirsiniz, örneğin küme 1, gerçek etiket 7 veya el yazısı numara "7" ve mengene vizesiyle eşleşir.

    Aşağıda gösterilen karışıklık matrisi çizim kodu pasajı.

    seaborn'u sns olarak ithal etmek

    sklearn.metrics'i içe aktar

    matplotlib.pyplot dosyasını plt olarak içe aktar

    sns.set (font_scale = 3)

    confusion_matrix = sklearn.metrics.confusion_matrix (y, y_pred)

    plt.figure (figsize = (16, 14))

    sns.heatmap (confusion_matrix, annot = True, fmt = "d", annot_kws = {"size": 20});

    plt.title ("Karışıklık matrisi", fontsize = 30)

    plt.ylabel ('Gerçek etiket', yazı tipi boyutu = 25)

    plt.xlabel ('Kümeleme etiketi', fontsize = 25)

    plt.show

    Evrişimli otomatik kodlayıcı uygula (deneysel)

    Görüntü veri kümeleri üzerinde çalıştığımız için, tamamen bağlantılı katmanlarla oluşturmak yerine evrişimli bir otomatik kodlayıcı denemeye değer.

    Görüntüyü yeniden yapılandırmak için, yapaylıkları azaltmak için ters evrişim katmanını (Keras'ta Conv2DTranspose) veya yukarı örnekleme (UpSampling2D) katmanını seçebileceğinizi belirtmekte fayda var. Evrişimli otomatik kodlayıcının deneysel sonuçları GitHub'ımda bulunabilir.

    Sonuç ve daha fazla okuma

    Otomatik kodlayıcı, boyutsallık azaltmada ve parametre başlatmada önemli bir rol oynadı ve ardından özelleştirilmiş kümeleme katmanı, doğruluğu daha da iyileştirmek için hedef dağıtım için eğitildi.

    daha fazla okuma

    Keras'ta bir otomatik kodlayıcı oluşturma-resmi Keras blogu

    Küme analizi için denetimsiz derin gömme, bu makaleyi yazmam için bana ilham verdi.

    Kaynak kodun tamamı GitHub'ımda, not defterinin sonuna kadar okuyorum çünkü aynı anda kümeleme ve otomatik kodlayıcı kaybını azaltabilecek başka bir yöntem bulacaksınız.Bu yöntemin evrişimli kümelemeyi iyileştirdiği kanıtlanmıştır. Modelin kümeleme doğruluğu çok kullanışlıdır.

    Leifeng.com altyazı grubu tarafından derlenmiştir.

    Liu Zuohu, OnePlus 5T'nin ince ve hafif gövdesini duyurdu, Huawei Honor V10 onu utandırdı!
    önceki
    "Merhaba, Çin" ağızdan ağza bir videoyu övgü dolu eleştirilere maruz bıraktı, bu kışın en sıcak filmi iyileşti
    Sonraki
    Buick Velite 5 plug-in hibrid otomobil ortaya çıktı, 100 kilometrede yakıt tüketimi 0.9L
    Missoni x CONVERSE ortaklaşa yeni bir ayakkabı modeli çıkardı, biraz tanıdık geliyor mu acaba?
    AnTuTu, Redmi dördüncü ve 360 onuncu ile Ekim fiyat-performans sıralamasını yayınladı!
    "Beşinci Kişilik" Karga kasaplara her üç saniyede bir ne rapor etmelidir? Çaylak olmamak için bu numarayı öğrenin!
    "Küçük Kırlangıç" kararı kabul etmeyi mi reddetti? Zhao Wei, seni para kaybetmeye çağıran 5 Chongqing yatırımcısı daha var! Avukatlar daha fazla mağdur istiyor
    Yeni nesil Audi A4 allroad 423.800'den satışa sunuluyor
    Gionee M2017, iPhone 7 Plus ile karşılaştırılabilir çift optik zoom
    ASICS bu nedenle yeni teknolojileri bir araya getirdi JYUNI Black serisi harika bir geçmişe sahip mi? !
    Zhang Xiaolongun ilk çalışması WeChatte değildi, Lei Jun bunu 150.000e satın almak zorunda kaldı!
    "Beşinci Kişilik" hamile kadınlar tarafından şikayet edildi mi? Bebeğin karnındaki kalp atışı 170'e yükseldi!
    Halka açık tuvaletleri, otelleri ve çeşitli alanlarda diğer projeleri güçlendiren akıllı sistem entegrasyon hizmetleri
    Mutluluk endeksini analiz etmek için Kaggle veri kümesini kullanın
    To Top