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)
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 =)
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
Ş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!
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