MNIST basamak tanıma için basit 2D CNN kullanın

Leifeng.com AI Research Press: Bu makale, Leifeng.com'un altyazı grubu tarafından derlenen teknik bir blogdur.Orijinal başlık MNIST rakam tanıma için basit bir 2D CNN'dir ve yazar Sambit Mahapatra'dır.

Tercüme | Wang Yi redaksiyon | Huo Leigang bitirme | Kong Lingshuang

Görüntü sınıflandırma görevleri için, şu anda en gelişmiş mimari Evrişimli Sinir Ağları'dır (CNN'ler). Yüz tanıma, otonom sürüş veya nesne algılama olsun, CNN yaygın olarak kullanılmaktadır. Bu makalede, iyi bilinen MNIST basamak tanıma görevi için, arka plan teknolojisi olarak tensorflow ile keras'ı temel alan basit bir 2D evrişimli sinir ağı (CNN) modeli tasarladık. Tüm iş akışı aşağıdaki gibidir:

1. Verileri hazırlayın

2. Modeli oluşturun ve derleyin

3. Modeli eğitin ve değerlendirin

4. Modeli ileride kullanmak üzere saklayın

Veri seti, yukarıda bahsedilen MNIST veri setini kullanır. MNIST veri seti (Değiştirilmiş Ulusal Standartlar Enstitüsü ve Technoloy veri seti), büyük bir el yazısı rakamlı (0 - 9) veri setidir. Veri seti, 60.000 eğitim resmi ve 10.000 test resmi dahil olmak üzere 28x28 boyutunda 70.000 resim içerir. İlk adım veri setini yüklemektir.Bu adıma keras api ile kolayca ulaşılabilir.

kerasları içe aktar

keras.datasets'den ithalat mnist

#load mnist veri kümesi

(X_train, y_train), (X_test, y_test) = mnist.load_data #her zaman veri yüklemek o kadar kolay olmayacak :)

Bunlar arasında, X_train 28x28 boyutunda 60.000 eğitim resmi ve y_train bu resimlere karşılık gelen etiketleri içerir. Benzer şekilde, X_test 28x28 boyutunda 10.000 test resmi içerir ve y_test buna karşılık gelen etikettir. Derin öğrenme modelinin amacını anlamak için eğitim verilerinin bir kısmını görselleştirelim.

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

fig = plt.figure

aralıktaki i için (9):

plt.subplot (3,3, i + 1)

plt.tight_layout

plt.imshow (X_train , cmap = 'gri', enterpolasyon = 'yok')

plt.title ("Rakam: {}". format (y_train ))

plt.xticks ()

plt.yticks ()

incir

Yukarıda gösterildiği gibi, sol üst köşede "5" olan görüntü verileri X_train'de depolanır ve karşılık gelen etiketi "5" y_train'de depolanır. Derin öğrenme modelimiz, yalnızca el yazısı resimlerle yazılan gerçek sayıyı tahmin edebilmelidir. Şimdi veriyi hazırlamak için bu resimler üzerinde yeniden boyutlandırma ve piksel değeri normalleştirme gibi bazı işlemler yapmamız gerekiyor.

#reshaping

#this veri formatımızı varsayar

# 3D veriler için, "channel_last", (conv_dim1, conv_dim2, conv_dim3, kanallar)

# "channel_first" varsayar (kanallar, conv_dim1, conv_dim2, conv_dim3).

k.image_data_format == 'channel_first' ise:

X_train = X_train.reshape (X_train.shape, 1, img_rows, img_cols)

X_test = X_test.reshape (X_test.shape, 1, img_rows, img_cols)

input_shape = (1, img_rows, img_cols)

Başka:

X_train = X_train.reshape (X_train.shape, img_rows, img_cols, 1)

X_test = X_test.reshape (X_test.shape, img_rows, img_cols, 1)

input_shape = (img_rows, img_cols, 1)

#more yeniden şekillendirme

X_train = X_train.astype ('float32')

X_test = X_test.astype ('float32')

X_train / = 255

X_test / = 255

print ('X_train şekli:', X_train.shape) #X_train şekli: (60000, 28, 28, 1)

Görüntü verilerinin gerekli işlenmesinden sonra, y_train ve y_test etiket verilerinin sınıflandırılmış bir biçime dönüştürülmesi gerekir. Örneğin, modeli oluştururken, 3 bir vektöre dönüştürülmelidir.

kerasları içe aktar

#set kategori sayısı

num_category = 10

# Sınıf vektörlerini ikili sınıf matrislerine dönüştürme

y_train = keras.utils.to_categorical (y_train, num_category)

y_test = keras.utils.to_categorical (y_test, num_category)

Model oluşturun ve derleyin

Veriler modele yüklendikten sonra model yapısını tanımlamamız ve optimizasyon fonksiyonlarını, kayıp fonksiyonlarını ve performans göstergelerini geçmemiz gerekiyor.

Mimarinin bir sonraki tanımı, her birini bir havuzlama katmanı, tam bağlantılı bir katman ve bir softmax katmanı izleyen 2 evrişimli katmandır. Her evrişimli katmanda, farklı türdeki özellikleri çıkarmak için birden çok filtre kullanılır. Sezgisel olarak açıklamak için, ilk filtre resimdeki düz çizgileri tespit etmeye yardımcı olur, ikinci filtre resimdeki daireleri tespit etmeye yardımcı olur vb. Her bir teknoloji katmanının uygulanmasına ilişkin açıklama bir takip yazısında açıklanacaktır. Her katmanın anlamını daha iyi anlamak istiyorsanız, adresine başvurabilirsiniz.

Maksimum havuzlama ve tam bağlı katmandan sonra, modelin aşırı uyum sorununu ortadan kaldırmak için modelimizde regülasyon için bırakma tanıtıldı.

## model oluşturma

model = Sıralı

# düzeltilmiş doğrusal birim aktivasyonlu evrişimli katman

model.add (Conv2D (32, kernel_size = (3, 3),

aktivasyon = 'relu',

input_shape = input_shape))

Her biri 3x3 boyutunda 32 evrişim filtresi kullanıldı

#tekrar

model.add (Conv2D (64, (3, 3), etkinleştirme = 'relu'))

Her biri 3x3 boyutunda 64 evrişim filtresi kullanıldı

# havuz oluşturma yoluyla en iyi özellikleri seçin

model.add (MaxPooling2D (pool_size = (2, 2)))

# Yakınsamayı iyileştirmek için nöronları rastgele açın ve kapatın

model.add (Bırakma (0,25))

#flatten çok fazla boyut olduğundan, yalnızca bir sınıflandırma çıktısı istiyoruz

model.add (Düzleştir)

Alakalı tüm verileri almak için # tamamen bağlı

model.add (Yoğun (128, aktivasyon = 'relu'))

# yakınsama uğruna bir bırakma daha :)

model.add (Dropout (0.5))

# matrisi çıktı olasılıklarına sıkıştırmak için bir softmax çıktı

model.add (Yoğun (num_category, aktivasyon = 'softmax'))

Model mimarisi belirlendikten sonra modelin derlenmesi gerekiyor. Bu çok kategorili bir sınıflandırma problemi olduğu için, kayıp işlevi olarak kategorik_crossentropy kullanmamız gerekir. Tüm etiketlerin ağırlıkları benzer olduğundan, performans göstergesi olarak doğruluğu kullanmayı tercih ediyoruz. AdaDelta, çok yaygın olarak kullanılan bir gradyan iniş yöntemidir. Model parametrelerini optimize etmek için bu yöntemi kullanıyoruz.

# Uyarlanabilir öğrenme oranı (adaDelta), yalnızca adam ve adagrad'ın rakip olduğu popüler bir gradyan iniş biçimidir

#categorical ce çünkü birden fazla sınıfımız var (10)

model.compile (kayıp = keras.losses.categorical_crossentropy,

optimizer = keras.optimizers.Adadelta,

metrics =)

Modeli eğitin ve değerlendirin

Model mimarisini tanımladıktan ve modeli derledikten sonra, modelin el yazısı rakamları tanıyabilmesi için modeli eğitmek için eğitim setini kullanın. Burada, modele uyması için X_train ve y_train kullanacağız.

batch_size = 128

num_epoch = 10

#model eğitimi

model_log = model.fit (X_train, y_train,

batch_size = batch_size,

epochs = num_epoch,

ayrıntılı = 1,

validation_data = (X_test, y_test))

Bunların arasında bir dönem, tam bir eğitim örneğinin ileriye ve geriye doğru yayılmasını temsil eder. batch_size, ileri / geri yayılma sürecinde kullanılan eğitim örneklerinin sayısıdır. Eğitim çıktısı aşağıdaki gibidir:

Şimdi eğitilen modelin performansını değerlendirelim.

score = model.evaluate (X_test, y_test, ayrıntılı = 0)

print ('Test kaybı:', puan) #Test kaybı: 0,0296396646054

print ('Test doğruluğu:', puan) #Test doğruluğu: 0.9904

Test doğruluk oranı% 99 + 'ya ulaştı, bu da bu tahmine dayalı model eğitiminin çok başarılı olduğu anlamına geliyor. Eğitim günlüğünün tamamına bakarsanız, dönem sayısı arttıkça, eğitim verilerindeki ve test verilerindeki modelin kaybının ve doğruluğunun kademeli olarak birleştiğini ve sonunda sabitlendiğini göreceksiniz.

işletim sistemini içe aktar

# metrikleri çizme

fig = plt.figure

plt.subplot (2,1,1)

plt.plot (model_log.history)

plt.plot (model_log.history)

plt.title ('model doğruluğu')

plt.ylabel ('doğruluk')

plt.xlabel ('epoch')

plt.legend (, loc = 'sağ alt')

plt.subplot (2,1,2)

plt.plot (model_log.history)

plt.plot (model_log.history)

plt.title ('model kaybı')

plt.ylabel ('kayıp')

plt.xlabel ('epoch')

plt.legend (, loc = 'sağ üst')

plt.tight_layout

incir

Modeli ileride kullanmak üzere saklayın

Şimdi eğitilmiş modeli serileştirmemiz gerekiyor. Modelin mimarisi veya yapısı bir json dosyasına kaydedilir ve ağırlıklar bir hdf5 dosyasına kaydedilir.

# Modeli kaydedin

# modeli JSON'a serileştir

model_digit_json = model.to_json

json_file olarak open ("model_digit.json", "w") ile:

json_file.write (model_digit_json)

# ağırlıkları HDF5'e serileştir

model.save_weights ("model_digit.h5")

print ("Kaydedilmiş model diske")

Model kaydedildikten sonra tekrar kullanılabilir ve diğer ortamlara da kolaylıkla nakledilebilir. Gelecekteki bir gönderide, bu modelin bir üretim ortamında nasıl konuşlandırılacağını göstereceğiz.

Derin öğrenmenin tadını çıkarın!

Referans

Keras Sıralı modeline başlarken

CS231n Görsel Tanıma için Evrişimli Sinir Ağları

sambit9238 / Derin Öğrenme

Lei Feng net altyazı grubu derlemesi

Orijinal bağlantı: https://towardsdatascience.com/a-simple-2d-cnn-for-mnist-digit-recognition-a998dbc1e79a

Takma ad

Odaklanmış biri

AI teknolojisinin geliştirilmesi ve AI mühendislerinin büyümesi için bilgi arayan bir topluluk

Doğdu!

Herkesi aşağıdaki bağlantıyı ziyaret etmeye veya deneyimlemek için kodu taramaya hoş geldiniz

https://club.leiphone.com/page/home

X9s bir geçiş mi? Bu telefon, Vivo'nun Huawei ile savaşma çabalarının katili
önceki
Chang Cheng, Huang Zhang'dan daha cüretkar, Lenovo'nun yeni makinesi adı doğruluyor ve ısınma posterinin sızdırıldığından şüpheleniliyor!
Sonraki
Porsche'nin 100 kilometreden 3.6 saniyede hızlanan yeni 911 GTS'si çıktı
Büyüleyici bahar manzarasının yanı sıra, Chongqing'de randevunuzu bekleyen sihirli bir gece de var!
FTC kaykay ve su tabancası yapmaz mı? Yeni yaz not etmeyin dizisi biraz "işleri düzgün yapmıyor"
LOL: Dört kez Avrupa şampiyonu ormancı oyuna dönüyor! G2 ekibinin kahramanı olarak kullanılırdı
Seyrek geri bildirim görevlerini öğrenmek için merak kullanın
"Eve Köpeğin Yolu" Kuzey Amerika'nın ağızdan ağza yasağı kaldırıldı ve aynı dönemin filmlerinin ivmesi ezildi
Ürün satmadan kar edebilirsiniz Nokia, OPPO'ya kendi patentlerinden bazılarını kullanma yetkisi verdi!
[Chongqing Flower Takdir Sezonu Açıldı] Jiulongpo bir "çiçek ve çiçek dünyası" oldu, erik rotasını kontrol edin
Kuzey Amerika Otomobil Fuarı'nda görücüye çıkan Kia Stinger / 5.1'ler 100'ü kırdı
Mücevher Kılıç Ustasından daha acımasız bir rutin, kral zaten kullanılıyor, tasarımcı: yaygın olarak kullanılırsa zayıflayacak
Liu Lirong, Saipan'ın 1 milyardan fazla kumarda kaybettiğini ve Jinli'nin uzun vadeli kayıplar nedeniyle düştüğünü itiraf etti!
Veri bilimi için Python: Unutabileceğiniz 8 kavram
To Top