Metni girin
1. LeNet Ağına Giriş
LeNet Ağına Giriş
LeNet ağının arka planı
1.1
Önemli Noktalar: CNN'nin temel bileşenlerini tanımlar ve CNN'in yaratıcısıdır.
LeNet, 1998 yılında evrişimli sinir ağlarının dedesi LeCun tarafından, el yazısıyla yazılmış rakam tanımanın görsel görevini çözmek için önerildi. O zamandan beri, CNN'nin en temel mimarisi ayarlandı: evrişimli katman, havuz katmanı ve tamamen bağlantılı katman. Günümüzde büyük derin öğrenme çerçevelerinde kullanılan LeNet, basitleştirilmiş ve geliştirilmiş bir LeNet-5'tir (-5, 5 katman anlamına gelir) ve şu anda çok yaygın olarak kullanılan aktivasyon işlevini ReLu olarak değiştirmek gibi orijinal LeNet'ten biraz farklıdır.
Ancak her ağ katmanının belirli parametre ayarları biraz farklı olacaktır. Örneğin, evrişim çekirdeğinin boyutu ve çıktı özelliği haritalarının sayısı özelleştirilebilir.
LeNet Ağına Giriş
LeNet'in ağ yapısı
1.2
LeNet toplam 5 ağ katmanı içerir ve havuz katmanını da sayarsanız, 8 ağ katmanı vardır.
Giriş katmanı: Giriş katmanının görüntü boyutu 28x28x1'dir
Evrişimli katman 1: Evrişim çekirdeğinin boyutu 3x3x1x32 yani 32 adet 3x3x1 evrişim çekirdeğine eşdeğer, hareketli adım uzunluğu 1 yani elde edilen çıktı 32 özellik haritasıdır.Bir görüntünün 32 kanallı 28x28x32 olduğu da söylenebilir.
Havuzlama katmanı 1: Maksimum havuzlama katmanı kullanılır, 2x2 ve hareketli adım 2'dir, bu nedenle çıktı: 14x14x32'dir.
Evrişimli katman 2: Evrişim çekirdeğinin boyutu 3x3x32x64 yani 643x3x32 evrişim çekirdeğine eşdeğer, hareketli adım uzunluğu 1 yani elde edilen çıktı 64 özellik haritasıdır Bir görüntünün 64 kanala, 14x14x64 olduğu da söylenebilir.
Havuzlama katmanı 2: Maksimum havuzlama katmanı kullanılır, 2x2 ve hareketli adım 2'dir, dolayısıyla çıktı: 7x7x64
Evrişimli katman 3: Evrişim çekirdeğinin boyutu 3x3x64x128 yani 128 adet 3x3x64 evrişim çekirdeğine eşdeğerdir Hareketli adım uzunluğu 1 yani elde edilen çıktı 128 özellik haritasıdır.Bir görüntünün 128 kanallı 7x7x128 olduğu da söylenebilir.
Havuzlama katmanı 3: Maksimum havuzlama katmanı kullanılır, 2x2'dir ve hareketli adım 2'dir, dolayısıyla çıktı: 4x4x128'dir.
Tamamen bağlı katman: Giriş, tek boyutlu olarak genişletilmesi gereken 128x4x4'tür ve çıktı 625'tir.
Çıktı katmanı: Giriş 625 ve çıkış 10'dur.
LeNet Ağına Giriş
LeNet yapı diyagramı
1.3
Açıklamalar: Başlangıçta kendi kendime daha güzel bir resim çizmek istedim.Bu makaleyi yazarken acelem vardı.Bu resim sadece kaba bir taslak.İçindeki parametre boyut bilgisi bu makalenin gerçekleşmesinden farklı.
Sonraki
İki, tensorflow LeNet'i uygular
TensorFlow, LeNet'i uygular
Uygulama kodu ve yorumlar
2.1
Np olarak 1import numpy
Tf olarak 2import tensorflow
3from tensorflow.examples.tutorials.mnist import input_data #module verileri içe aktarmak için
4
5batch_size = 100 #, eğitim setinin toplam 55000 veri setine sahip olması nedeniyle, her eğitim grubunun 100 set veri olduğu anlamına gelir, bu nedenle bir eğitim döngüsü 550 yineleme gerektirir
6test_size = 256 # Doğrulama verisi olarak, doğrulama setinde 10000 veri seti vardır, ancak burada sadece 256 set doğrulanmıştır, çünkü çok fazla veri vardır ve hesaplama çok yavaştır
7img_size = 28 #El yazısı resim boyutu
8num_class = 10 # Görüntü kategorisi
9
10X = tf.placeholder (dtype = tf.float32, şekil =, ad = 'giriş')
11Y = tf.placeholder (dtype = tf.float32, şekil =)
12
13p_keep = tf.placeholder (tf.float32, name = 'p_keep_rate') # Bırakma katmanının ayrılmış parametreleri daha sonra kullanılır
14
15mnist = input_data.read_data_sets ('mnist_data', one_hot = True) #import veri kümesi
16train_X, train_Y, test_X, test_Y = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels
17
18train_X = train_X.reshape (-1, img_size, img_size, 1) #Training verilerinin ve test verilerinin yeniden şekillendirilmesi gerekiyor çünkü içe aktarılan 724 uzunluk
19test_X = test_X.reshape (-1, img_size, img_size, 1)
20
21 # İlk evrişimli katman
22 tf.name_scope ('cnn_layer_01') cnn_01 olarak:
23 w1 = tf.Variable (tf.random_normal (şekil =, stddev = 0.01))
24 dönüşüm1 = tf.nn.conv2d (X, w1, adımlar =, padding = "AYNI")
25 dönş_y1 = tf.nn.relu (dönş1)
26
27 # İlk havuz katmanı
Tf.name_scope ('pool_layer_01') pool_01 olarak 28 ile:
29 pool_y2 = tf.nn.max_pool (conv_y1, ksize =, strides =, padding = 'AYNI')
30 pool_y2 = tf.nn.dropout (pool_y2, p_keep)
31
32 # İkinci evrişimli katman
33, tf.name_scope ('cnn_layer_02') ile cnn_02 olarak:
34 w2 = tf.Variable (tf.random_normal (şekil =, stddev = 0.01))
35 dönüşüm2 = tf.nn.conv2d (havuz_y2, w2, adım sayısı =, dolgu = "AYNI")
36 dönüşüm_y3 = tf.nn.relu (dönüşüm2)
37
38 # İkinci havuz katmanı
39, tf.name_scope ('pool_layer_02') pool_02 olarak:
40 pool_y4 = tf.nn.max_pool (conv_y3, ksize =, strides =, padding = 'AYNI')
41 pool_y4 = tf.nn.dropout (pool_y4, p_keep)
42
43 # Üçüncü evrişimli katman
44, tf.name_scope ('cnn_layer_03') cnn_03 olarak:
45 w3 = tf.Variable (tf.random_normal (şekil =, stddev = 0.01))
46 dönüşüm3 = tf.nn.conv2d (havuz_y4, w3, adım sayısı =, dolgu = "AYNI")
47 dönş_y5 = tf.nn.relu (dönş3)
48
49 # Üçüncü havuz katmanı
Tf.name_scope ('pool_layer_03') pool_03 olarak 50:
51 pool_y6 = tf.nn.max_pool (conv_y5, ksize =, strides =, padding = 'AYNI')
52
53 # Tamamen bağlı katman
54; tf.name_scope ('full_layer_01') full_01 olarak:
55 w4 = tf.Variable (tf.random_normal (şekil =, stddev = 0.01))
56 FC_layer = tf.reshape (havuz_y6,)
57 FC_layer = tf.nn.dropout (FC_layer, p_keep)
58 FC_y7 = tf.matmul (FC_layer, w4)
59 FC_y7 = tf.nn.relu (FC_y7)
60 FC_y7 = tf.nn.dropout (FC_y7, p_keep)
61
62 # çıktı katmanı, model_Y, sinir ağının tahmin çıktısıdır
63with tf.name_scope ('output_layer') output_layer olarak:
64 w5 = tf.Variable (tf.random_normal (şekil =))
65 model_Y = tf.matmul (FC_y7, w5, ad = 'çıktı')
66
67 # Kayıp fonksiyonu
68Y_ = tf.nn.softmax_cross_entropy_with_logits (logits = model_Y, etiketler = Y)
69cost = tf.reduce_mean (Y_)
70
71 # Doğruluk oranı
72correct_prediction = tf.equal (tf.argmax (model_Y, axis = 1), tf.argmax (Y, axis = 1))
73accuracy = tf.reduce_mean (tf.cast (right_prediction, tf.float32))
74
75 # optimizasyon yöntemi
76optimizer = tf.train.RMSPropOptimizer (0.001,0.9) .minimize (maliyet)
77
78 # İlgili parametreleri tensorboard'a yazın
79 # ------------------------------------------------ -----------------------
80tf.summary.scalar ('zarar', maliyet)
81tf.summary.scalar ('doğruluk', doğruluk)
82tf.summary.histogram ('w1', w1)
83tf.summary.histogram ('w2', w2)
84tf.summary.histogram ('w3', w3)
85tf.summary.histogram ('w4', w4)
86tf.summary.histogram ('w5', w5)
87merge = tf.summary.merge_all ()
88 # ------------------------------------------------ --------------------------
89 # İnşaat oturumu görevi
Tf.Session () oturum olarak ile 90:
91 tf.global_variables_initializer (). Run ()
92 writer = tf.summary.FileWriter ('mnist_cnn_summary_01', graph = sess.graph)
93 # [(0,100), (100,200), (200,300) değerini elde etmek için dizini yeniden düzenleyin. . . . form
94 eğitim_batch = zip (aralık (0, len (tren_X), batch_size), aralık (batch_size, len (train_X) + 1, batch_size))
95
96 run_metadata = tf.RunMetadata ()
97 # Eğitime başlayın, burada yalnızca bir dönem eğitilir, birden çok dönemi eğitmek istiyorsanız başka bir döngü ekleyebilirsiniz
Eğitim_batch'te başlangıç, bitiş için 98:
99 opti, özet, kayıp, acc = sess.run (, \
100 feed_dict = {X: train_X, Y: train_Y, p_keep: 0.8}, \
101 run_metadata = run_metadata) #Bu en kritik adımdır, optimize edici, özet, kayıp, doğruluk eğitim için bir araya getirilmiştir
102
103 writer.add_run_metadata (run_metadata, tag = 'step {0}'. Format (başlangıç), global_step = (start / batch_size) +1)
104 writer.add_summary (özet, global_step = (başlangıç / batch_size) +1)
105
106 print ({(start / batch_size) +1}. Yinelemede, doğruluk {acc} ve hata {kayıp} ', end =' \ r ', flush = True)
107
108 print ('=================== Teste başlayalım ========================= ======= ')
109 # Test setindeki verileri doğrulamaya başlayalım
110 test_index = np.arange (len (test_X))
111 np.random.shuffle (test_index) # Test setindeki 10000 veri setinin sırası hemen kaotiktir
112 test_index = test_index # Test için karıştırılmış sıranın ardından yalnızca 256 örnek veri seti seçin
113 test_acc = sess.run (doğruluk, feed_dict = {X: test_X, Y: test_Y, p_keep: 1})
114 baskı (f'Yukarıdaki test setinin doğruluğu: {test_acc} ')
115 print ('=================== Aşağıdakiler kaydetme modelidir ====================== ========= ')
116 # Kaydetme modeli
117 koruyucu = tf.train.Saver ()
118 yol = saver.save (sess, 'mnist_cnn_model / medel.ckpt')
119 yazdır (f'model Ou {yol} 'konumuna kaydet)
120 baskı ('Eğitim bitti!')
TensorFlow, LeNet'i uygular
Program çalıştırma sonuçlarının analizi
2.2
2.2.1 Baskı sonuçları
1 =================== Test etmeye aşağıdaki başlangıç ========================== ==== 857185366
2 Test setindeki doğruluk oranı 0,9765625'tir
3 =================== Aşağıda kaydetme modeli verilmiştir ========================= ======
4 Modeli mnist_cnn_model / medel.ckpt olarak kaydedin
5 Eğitim bitti!
256 set test verisinin doğruluğunun ve yukarıdakinin 0.9765625 olduğu yukarıdan görülebilir.Yalnızca bir dönem eğitiminin bu etkiyi başarabilmesi çok iyidir.
2.2.1 Hata eğrisi ve doğruluk
2.2.2 Model grafiği
Sonraki
3. Model yükleme ve tahmin
Model yükleme tahmini
tahmin sonucu
3.1
Büyülü bir eğitim tamamlandıktan sonra, modeli kaydetmeniz gerekir, böylece modeli her kullanışınızda yeniden eğitimden kaçınabilirsiniz.Bu makale yalnızca uygulama hakkında konuşur. Modelin nasıl kaydedildiği, nasıl yükleneceği ve ilgili kaydedilen dosyaların özel anlamı daha sonra tartışılacaktır. .
Rastgele 1 ithalat
2import matplotlib.pyplot olarak plt
3import tensorflow tf olarak
4from tensorflow.examples.tutorials.mnist import input_data #module verileri içe aktarmak için
5
6mnist = input_data.read_data_sets ('mnist_data', one_hot = Doğru)
7train_X, train_Y, test_X, test_Y = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels
8
9
10test_image = mnist.test.images # 101'inci resmi seçin
11img_size = 28
12test_image = test_image.reshape (-1, img_size, img_size, 1)
13
Oturum olarak tf.Session () ile 14: #
15 new_saver = tf.train.import_meta_graph ('mnist_cnn_model / medel.ckpt.meta') # Adım 2: Modelin grafik yapısını içe aktarın
16 new_saver.restore (sess, 'mnist_cnn_model / medel.ckpt') # Adım 3: Bu oturumu içe aktarılan grafiğe bağlayın
17 # new_saver.restore (sess, tf.train.latest_checkpoint ('mymodel')) # Üçüncü adım da aynı olabilir, çünkü kontrol noktası mymodel klasöründen alınacak ve en son arşiv dosyası yolu kontrol noktasında saklanacaktır
18
19 baskı ('====================== Model yükleme tamamlandı ==================== ========= ')
20 X = sess.graph.get_tensor_by_name ('input: 0') # Modelden girdiyi alan düğüm
21 p_keep = sess.graph.get_tensor_by_name ('p_keep_rate: 0')
22 model_y = sess.graph.get_tensor_by_name ('output_layer / output: 0')
23 baskı ('====================== Giriş ve çıkış yüklemesi tamamlandı ================== ========== ')
24 sonuç = sess.run (model_y, feed_dict = {X: test_image, p_keep: 1}) # Gerekli olan, sonuç olarak burada saklanan model_Y model tahmin değeridir
25 baskı ('+++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++ ')
26 baskı (sonuç)
27 baskı ('+++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++ ')
28 soft_result = tf.nn.softmax (sonuç)
29 sonuç1 = sess.run (soft_result)
30 baskı (sonuç1)
31
34 plt.imshow (test_image.reshape (), cmap = 'Griler')
35 plt. Göster ()
Model yükleme tahmini
Tahmin sonuç analizi
3.2
Bu sefer yalnızca bir test resmi seçildi ve 101. resim seçildi.Programın çalışması aşağıdaki gibi görüntülenir:
Orijinal test resmi aşağıdaki gibidir:
Sonuç şu şekildedir:
1 ======================= Model yükleme tamamlandı ======================= ======
2 ===================== Giriş ve çıkış yüklemesi tamamlandı ====================== =======
3 ++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++
4
6 +++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++
7
Yukarıdaki çalışan sonuçlardan ilk sayının 0.99999416 olduğu ve diğer sayıların temelde 0'a çok yakın olduğu görülebilir, bu da bu sayının 0 olma olasılığının% 99.9999 olduğunu gösterir.
Sonraki
Tam metin özeti
Bu makale, TensorFlow'a dayalı klasik LeNet ağını yüksek doğrulukla uygular.Okuduktan sonra herhangi bir sorun veya iyileştirme alanı olduğunu düşünüyorsanız, bir mesaj bırakabilirsiniz. Ek olarak, VGGNet, GoogleNet, ResNet, DenseNet vb. Dahil olmak üzere birbiri ardına ilgili klasik ağları uygulayacağım. Derin öğrenmede birlikte öğrenmek istiyorsanız, dikkat etmeye devam edebilirsiniz.
Ayrıca, derin öğrenme ile ilgili herhangi bir sorunuz varsa, birlikte konuşabilirsiniz!