TensorFlow Görüntü Sınıflandırması: CNN (Evrişimli Sinir Ağı)

İçindekiler:

Anonim

Evrişimli Sinir Ağı nedir?

Evrişimli sinir ağı, aynı zamanda konvnetler veya CNN olarak da bilinir, bilgisayarla görme uygulamalarında iyi bilinen bir yöntemdir. Bu tür bir mimari, bir resim veya videodan nesneleri tanımada baskındır.

Bu eğitimde, bir konvnetin nasıl oluşturulacağını ve el yazısı veri setini çözmek için TensorFlow'un nasıl kullanılacağını öğreneceksiniz.

Bu eğitimde öğreneceksiniz

  • Evrişimli Sinir Ağı
  • Evrişimli Sinir Ağının Mimarisi
  • Konvnet Bileşenleri
  • TensorFlow ile CNN'i eğitin
  • 1. Adım: Veri Kümesini Yükleyin
  • Adım 2: Giriş katmanı
  • 3. Adım: Evrişimli katman
  • Adım 4: Havuzlama katmanı
  • Adım 5: İkinci Evrişimli Katman ve Havuzlama Katmanı
  • Adım 6: Yoğun katman
  • Adım 7: Logit Layer

Evrişimli Sinir Ağının Mimarisi

Birkaç yıl önce Facebook'u düşünün, profilinize bir resim yükledikten sonra, resimdeki yüze manuel olarak bir isim eklemeniz istendi. Günümüzde Facebook, fotoğraftaki arkadaşınızı otomatik olarak etiketlemek için convnet'i kullanıyor.

Evrişimli bir sinir ağını anlamak çok da zor değildir. Bir giriş görüntüsü, evrişim aşamasında işlenir ve daha sonra bir etiketle ilişkilendirilir.

Tipik bir konvnet mimarisi aşağıdaki resimde özetlenebilir. Öncelikle ağa bir görüntü aktarılır; buna giriş görüntüsü denir. Ardından, girdi görüntüsü sonsuz sayıda adımdan geçer; bu, ağın evrişimli kısmıdır. Son olarak, sinir ağı görüntüdeki rakamı tahmin edebilir.

Bir görüntü, yüksekliği ve genişliği olan bir dizi pikselden oluşur. Gri tonlamalı bir görüntünün yalnızca bir kanalı varken renkli görüntünün üç kanalı vardır (her biri Kırmızı, Yeşil ve Mavi için). Bir kanal birbirinin üzerine yığılır. Bu eğitimde, yalnızca bir kanallı gri tonlamalı bir resim kullanacaksınız. Her piksel, rengin yoğunluğunu yansıtmak için 0 ile 255 arasında bir değere sahiptir. Örneğin, 0'a eşit bir piksel beyaz bir renk gösterirken, 255'e yakın bir değere sahip bir piksel daha koyu olacaktır.

MNIST veri kümesinde depolanan bir görüntüye bir göz atalım. Aşağıdaki resim, soldaki resmin bir matris formatında nasıl temsil edileceğini göstermektedir. Orijinal matrisin 0 ile 1 arasında standartlaştırıldığına dikkat edin. Daha koyu renk için, matristeki değer yaklaşık 0,9 iken beyaz piksellerin değeri 0'dır.

Evrişimli işlem

Modeldeki en kritik bileşen evrişimli katmandır. Bu bölüm, ağırlıkların daha hızlı hesaplanması için görüntünün boyutunu küçültmeyi ve genellemesini geliştirmeyi amaçlamaktadır.

Evrişimli kısım sırasında, ağ görüntünün temel özelliklerini korur ve ilgisiz gürültüyü hariç tutar. Örneğin, model arka planda dağ olan bir resimden bir filin nasıl tanınacağını öğreniyor. Geleneksel bir sinir ağı kullanıyorsanız, model gerekli olmayan ve ağı yanıltabilecek dağdan olanlar da dahil olmak üzere tüm piksellere bir ağırlık atayacaktır.

Bunun yerine, evrişimli bir sinir ağı, yalnızca en alakalı pikselleri çıkarmak için matematiksel bir teknik kullanacaktır. Bu matematiksel işleme evrişim denir. Bu teknik, ağın her katmanda giderek daha karmaşık özellikleri öğrenmesine olanak tanır. Evrişim, her parçadaki en önemli unsurları öğrenmek için matrisi küçük parçalara böler.

Konvnet Bileşenleri

Bir Konvnet'in dört bileşeni vardır

  1. Evrişim
  2. Doğrusal Olmayan (ReLU)
  3. Havuzlama veya Alt Örnekleme
  4. Sınıflandırma (Tamamen Bağlı Katman)
  • Evrişim

Evrişimin amacı, görüntü üzerindeki nesnenin özelliklerini yerel olarak çıkarmaktır. Bu, ağın resimdeki belirli kalıpları öğreneceği ve onu resmin her yerinde tanıyabileceği anlamına gelir.

Evrişim, eleman bazlı bir çarpmadır. Kavramın anlaşılması kolaydır. Bilgisayar görüntünün genellikle 3x3 boyutundaki bir bölümünü tarayacak ve onu bir filtreyle çarpacaktır. Eleman bazlı çarpmanın çıktısına özellik haritası denir. Bu adım, tüm görüntü taranana kadar tekrarlanır. Evrişimden sonra görüntünün boyutunun küçüldüğünü unutmayın.

Aşağıda, evrişimin nasıl çalıştığını eylemde görmek için bir URL var.

Çok sayıda kanal mevcuttur. Aşağıda bazı kanalları listeledik. Her filtrenin belirli bir amacı olduğunu görebilirsiniz. Aşağıdaki resimde bulunan not; Çekirdek, filtrenin eşanlamlısıdır.

Kaynak

Evrişimin arkasındaki aritmetik

Evrişim aşaması, filtreyi resim içindeki küçük bir piksel dizisine uygulayacaktır. Filtre, genel bir 3x3 veya 5x5 şeklinde giriş resmi boyunca hareket edecektir. Bu, ağın bu pencereleri tüm giriş görüntüsü boyunca kaydıracağı ve evrişimi hesaplayacağı anlamına gelir. Aşağıdaki resim, evrişimin nasıl işlediğini göstermektedir. Yamanın boyutu 3x3'tür ve çıktı matrisi, görüntü matrisi ile filtre arasındaki öğe bazlı işlemin sonucudur.

Kaynak

Çıktının genişliğinin ve yüksekliğinin girişin genişliğinden ve yüksekliğinden farklı olabileceğini fark ettiniz. Sınır etkisi nedeniyle olur.

Sınır etkisi

Resimde 5x5 özellik haritası ve 3x3 filtre vardır. Ortada, filtrenin 3x3 ızgarayı perdeleyebileceği tek bir pencere vardır. Çıktı özelliği haritası, 3x3 boyutunun yanı sıra iki kare küçülecektir.

Girdi boyutuyla aynı çıktı boyutunu elde etmek için dolgu eklemeniz gerekir. Dolgu, matrisin her iki tarafına doğru sayıda satır ve sütun eklemekten oluşur. Evrişimin her giriş döşemesine ortalanmasına izin verecektir. Aşağıdaki resimde, girdi / çıktı matrisi aynı 5x5 boyutuna sahiptir.

Ağı tanımladığınızda, kıvrımlı özellikler üç parametre tarafından kontrol edilir:

  1. Derinlik: Evrişim sırasında uygulanacak filtre sayısını tanımlar. Önceki örnekte, 1'lik bir derinlik gördünüz, yani yalnızca bir filtre kullanıldı. Çoğu durumda, birden fazla filtre vardır. Aşağıdaki resim, üç filtreli bir durumda yapılan işlemleri göstermektedir.

  1. Adım: İki dilim arasındaki "piksel atlama" sayısını tanımlar. Adım 1'e eşitse, pencereler bir piksel genişliğinde hareket edecektir. Adım ikiye eşitse, pencereler 2 piksel atlayacaktır. Adımınızı artırırsanız, daha küçük özellik haritalarına sahip olacaksınız.

Örnek adım 1

Resim adımı 2

  1. Sıfır doldurma: Dolgu, giriş özellikleri haritalarının her bir tarafına karşılık gelen sayıda satır ve sütun ekleme işlemidir. Bu durumda çıktı, girdi ile aynı boyuta sahiptir.
  2. Doğrusal Olmayan (ReLU)

Evrişim işleminin sonunda, çıktı doğrusal olmayışa izin vermek için bir aktivasyon fonksiyonuna tabidir. Convnet için olağan etkinleştirme işlevi Relu'dur. Negatif değere sahip tüm pikseller sıfır ile değiştirilecektir.

  • Maksimum havuzlama işlemi

Bu adımın anlaşılması kolaydır. Havuzlamanın amacı, girdi görüntüsünün boyutluluğunu azaltmaktır. İşlemin hesaplama karmaşıklığını azaltmak için adımlar atılır. Boyutsallığı azaltarak, ağın hesaplamak için daha düşük ağırlıkları vardır, bu nedenle aşırı uydurmayı önler.

Bu aşamada boyutu ve adımı belirlemeniz gerekir. Giriş görüntüsünü birleştirmenin standart bir yolu, özellik haritasının maksimum değerini kullanmaktır. Aşağıdaki resme bakın. "Havuzlama" 4x4 özellik haritasının dört alt matrisini görüntüleyecek ve maksimum değeri döndürecektir. Havuzlama, 2x2'lik bir dizinin maksimum değerini alır ve ardından bu pencereleri iki piksel hareket ettirir. Örneğin, ilk alt matris [3,1,3,2], havuzlama maksimum olan 3'ü döndürecektir.

Ortalama gibi başka bir havuzlama işlemi var.

Bu işlem, özellik haritasının boyutunu agresif bir şekilde azaltır

  • Tamamen bağlı katmanlar

Son adım, önceki eğitimde yaptığınız gibi geleneksel bir yapay sinir ağı oluşturmaktan ibarettir. Bir önceki katmandaki tüm nöronları bir sonraki katmana bağlarsınız. Giriş görüntüsündeki sayıyı sınıflandırmak için bir softmax aktivasyon işlevi kullanırsınız.

Özet:

Evrişimli Sinir ağı, bir tahmin yapmadan önce farklı katmanları derler. Bir sinir ağında şunlar bulunur:

  • Evrişimli bir katman
  • Relu Aktivasyon işlevi
  • Havuzlama katmanı
  • Yoğun bağlı katman

Evrişimli katmanlar, resmin bir alt bölgesine farklı filtreler uygular. Relu etkinleştirme işlevi doğrusal olmama ekler ve havuzlama katmanları özellik haritalarının boyutluluğunu azaltır.

Tüm bu katmanlar, görüntülerden temel bilgileri çıkarır. Sonunda, özellikler haritası, bir tahmin yapmak için bir softmax işlevine sahip, tamamen bağlı bir birincil katmana beslenir.

TensorFlow ile CNN'i eğitin

Artık bir konvnetin yapı taşına aşina olduğunuza göre, TensorFlow ile bir tane oluşturmaya hazırsınız. MNIST veri kümesini görüntü sınıflandırması için kullanacağız.

Veri hazırlama, önceki öğretici ile aynıdır. Kodları çalıştırabilir ve doğrudan CNN mimarisine atlayabilirsiniz.

Aşağıdaki adımları takip edeceksiniz:

1. Adım: Veri Kümesini Yükleyin

Adım 2: Giriş katmanı

3. Adım: Evrişimli katman

Adım 4: Havuzlama katmanı

Adım 5: İkinci Evrişimli Katman ve Havuzlama Katmanı

Adım 6: Yoğun katman

Adım 7: Logit Layer

1. Adım: Veri Kümesini Yükleyin

MNIST veri kümesi, bu URL'de öğrenmek için scikit ile kullanılabilir. Lütfen indirin ve İndirilenler bölümünde saklayın. Bunu fetch_mldata ('MNIST orijinal') ile yükleyebilirsiniz.

Bir tren / test seti oluşturun

Veri kümesini train_test_split ile bölmeniz gerekir

Özellikleri ölçeklendirin

Son olarak, özelliği MinMaxScaler ile ölçeklendirebilirsiniz.

import numpy as npimport tensorflow as tffrom sklearn.datasets import fetch_mldata#Change USERNAME by the username of your machine## Windows USERmnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original')## Mac Usermnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original')print(mnist.data.shape)print(mnist.target.shape)from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)y_train = y_train.astype(int)y_test = y_test.astype(int)batch_size =len(X_train)print(X_train.shape, y_train.shape,y_test.shape )## resclaefrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()# TrainX_train_scaled = scaler.fit_transform(X_train.astype(np.float64))# testX_test_scaled = scaler.fit_transform(X_test.astype(np.float64))feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]X_train_scaled.shape[1:]

CNN'yi tanımlayın

Bir CNN, bir görüntünün ham pikselindeki filtreleri kullanarak, geleneksel bir sinir ağı ile küresel modelle karşılaştırarak ayrıntı modelini öğrenir. Bir CNN oluşturmak için şunları tanımlamanız gerekir:

  1. Evrişimli katman: Özellik haritasına n sayıda filtre uygulayın. Evrişimden sonra, ağa doğrusal olmayanlık eklemek için bir Relu aktivasyon işlevi kullanmanız gerekir.
  2. Havuzlama katmanı: Evrişimden sonraki adım, özellik maks. Amaç, aşırı uyumu önlemek ve hesaplama hızını artırmak için özellik haritasının boyutsallığını azaltmaktır. Maksimum havuzlama, özellik haritalarını alt bölgelere (genellikle 2x2 boyutunda) bölen ve yalnızca maksimum değerleri tutan geleneksel tekniktir.
  3. Tamamen bağlantılı katmanlar: Önceki katmanlardan gelen tüm nöronlar, sonraki katmanlara bağlanır. CNN, etiketi evrişimli katmanlardan gelen özelliklere göre sınıflandıracak ve havuzlama katmanı ile azaltılacaktır.

CNN mimarisi

  • Evrişimli Katman: ReLU etkinleştirme işleviyle 14 5x5 filtre uygular (5x5 piksel alt bölgeleri çıkarır)
  • Pooling Layer: 2x2 filtre ve 2 adımla maksimum havuzlama gerçekleştirir (bu, havuzlanmış bölgelerin çakışmadığını belirtir)
  • Evrişimli Katman: ReLU etkinleştirme işlevi ile 36 5x5 filtre uygular
  • Havuzlama Katmanı # 2: Yine, 2x2 filtre ve 2 adımla maksimum havuzlama gerçekleştirir
  • Bırakma düzenlenme oranı 0.4 olan 1.764 nöron (eğitim sırasında herhangi bir elemanın düşme olasılığı 0.4)
  • Yoğun Katman (Logits Layer): Her basamaklı hedef sınıf için bir tane (0-9) olmak üzere 10 nöron.

Bir CNN oluşturmak için kullanılacak üç önemli modül vardır:

  • conv2d (). Bağımsız değişkenler olarak filtre sayısı, filtre çekirdeği boyutu, doldurma ve etkinleştirme işleviyle iki boyutlu bir evrişimli katman oluşturur.
  • max_pooling2d (). Maksimum havuz algoritmasını kullanarak iki boyutlu bir havuz katmanı oluşturur.
  • yoğun(). Gizli katmanlar ve birimlerle yoğun bir katman oluşturur

CNN'yi oluşturmak için bir işlev tanımlayacaksınız. İşlevde her şeyi bir araya getirmeden önce her yapı bloğunun nasıl inşa edileceğini ayrıntılı olarak görelim.

Adım 2: Giriş katmanı

def cnn_model_fn(features, labels, mode):input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

Verinin şekli ile bir tensör tanımlamanız gerekir. Bunun için tf.reshape modülünü kullanabilirsiniz. Bu modülde, yeniden şekillendirilecek tensörü ve tensörün şeklini bildirmeniz gerekir. İlk argüman, fonksiyonun argümanında tanımlanan verilerin özellikleridir.

Bir resmin yüksekliği, genişliği ve kanalı vardır. MNIST veri kümesi, 28x28 boyutunda tek zamanlı bir resimdir. Şekil argümanında parti boyutunu -1 olarak ayarladık, böylece özelliklerin ["x"] şeklini alacaktır. Bunun avantajı, parti boyutu hiperparametrelerinin ayarlanmasını sağlamaktır. Parti boyutu 7 olarak ayarlanırsa, tensör 5,488 değeri (28 * 28 * 7) besleyecektir.

Step 3: Convolutional layer
# first Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=14,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)

İlk evrişimli katman, aynı dolguya sahip 5x5 çekirdek boyutuna sahip 14 filtreye sahiptir. Aynı dolgu, hem çıkış tensörü hem de giriş tensörünün aynı yüksekliğe ve genişliğe sahip olması gerektiği anlamına gelir. Tensorflow, aynı boyutu sağlamak için satırlara ve sütunlara sıfırlar ekleyecektir.

Relu aktivasyon işlevini kullanıyorsunuz. Çıktı boyutu [28, 28, 14] olacaktır.

Adım 4: Havuzlama katmanı

Evrişimden sonraki adım, havuz hesaplamasıdır. Havuz hesaplaması, verilerin boyutluluğunu azaltacaktır. 2x2 boyutunda ve 2 adımda max_pooling2d modülünü kullanabilirsiniz. Önceki katmanı girdi olarak kullanırsınız. Çıktı boyutu [batch_size, 14, 14, 14] olacaktır

# first Pooling Layerpool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

Adım 5: İkinci Evrişimli Katman ve Havuzlama Katmanı

İkinci evrişimli katman çıktı boyutu [batch_size, 14, 14, 32] olan 32 filtreye sahiptir. Havuzlama katmanı öncekiyle aynı boyuta sahiptir ve çıktı şekli [batch_size, 14, 14, 18] şeklindedir.

conv2 = tf.layers.conv2d(inputs=pool1,filters=36,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

Adım 6: Yoğun katman

Ardından, tam bağlantılı katmanı tanımlamanız gerekir. Özellik haritasının yoğun katmana bağlanmadan önce düzleştirilmesi gerekir. Modül şeklini 7 * 7 * 36 boyutunda kullanabilirsiniz.

Yoğun katman 1764 nöronu birbirine bağlayacak. Bir Relu aktivasyon işlevi eklersiniz. Ayrıca, 0,3 oranında bir bırakma düzenleme terimi eklersiniz, yani ağırlıkların yüzde 30'u 0'a ayarlanacaktır. Bırakmanın yalnızca eğitim aşamasında gerçekleştiğini unutmayın. Cnn_model_fn işlevi, modelin eğitilmesi mi yoksa değerlendirilmesi mi gerektiğini bildirmek için bir argüman moduna sahiptir.

pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)dropout = tf.layers.dropout(inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)

Adım 7: Logit Layer

Son olarak modelin tahmini ile son katmanı tanımlayabilirsiniz. Çıktı şekli toplu iş boyutuna ve toplam resim sayısı olan 10'a eşittir.

# Logits Layerlogits = tf.layers.dense(inputs=dropout, units=10) 

Sınıfları ve her sınıfın olasılığını içeren bir sözlük oluşturabilirsiniz. Tf.argmax () modülü, logit katmanları ise en yüksek değeri döndürür. Softmax işlevi, her bir sınıfın olasılığını döndürür.

predictions = {# Generate predictions"classes": tf.argmax(input=logits, axis=1),"probabilities": tf.nn.softmax(logits, name="softmax_tensor") }

Yalnızca mod, tahmin olarak ayarlandığında diksiyonel tahmini döndürmek istersiniz. Tahminleri dağıtmak için bu kodları eklersiniz

if mode == tf.estimator.ModeKeys.PREDICT:return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

Bir sonraki adım, modelin kaybını hesaplamaktır. Son eğitimde, çok sınıflı bir model için kayıp fonksiyonunun çapraz entropi olduğunu öğrendiniz. Kayıp, aşağıdaki kodla kolayca hesaplanır:

# Calculate Loss (for both TRAIN and EVAL modes)loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

Son adım, modeli optimize etmektir, yani ağırlıkların en iyi değerlerini bulmaktır. Bunun için, 0,001 öğrenme oranına sahip bir Gradyan iniş optimize edicisi kullanırsınız. Amaç, kaybı en aza indirmektir

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)train_op = optimizer.minimize(loss=loss,global_step=tf.train.get_global_step())

CNN ile işiniz bitti. Ancak, değerlendirme modu sırasında performans ölçümlerini görüntülemek istersiniz. Çok sınıflı bir model için performans ölçütleri, doğruluk ölçütleridir. Tensorflow, iki bağımsız değişken, etiketler ve tahmin edilen değerler içeren bir modül doğruluğu ile donatılmıştır.

eval_metric_ops = {"accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

Bu kadar. İlk CNN'nizi yarattınız ve modeli eğitmek ve değerlendirmek için kullanmak üzere her şeyi bir fonksiyona sarmaya hazırsınız.

def cnn_model_fn(features, labels, mode):"""Model function for CNN."""# Input Layerinput_layer = tf.reshape(features["x"], [-1, 28, 28, 1])# Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=32,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)# Pooling Layerpool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)# Convolutional Layer #2 and Pooling Layerconv2 = tf.layers.conv2d(inputs=pool1,filters=36,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)# Dense Layerpool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)dropout = tf.layers.dropout(inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)# Logits Layerlogits = tf.layers.dense(inputs=dropout, units=10)predictions = {# Generate predictions (for PREDICT and EVAL mode)"classes": tf.argmax(input=logits, axis=1),"probabilities": tf.nn.softmax(logits, name="softmax_tensor")}if mode == tf.estimator.ModeKeys.PREDICT:return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)# Calculate Lossloss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)# Configure the Training Op (for TRAIN mode)if mode == tf.estimator.ModeKeys.TRAIN:optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)train_op = optimizer.minimize(loss=loss,global_step=tf.train.get_global_step())return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)# Add evaluation metrics Evaluation modeeval_metric_ops = {"accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

Aşağıdaki adımlar önceki eğitimlerle aynıdır.

Öncelikle CNN modeli ile bir tahminci tanımlıyorsunuz.

# Create the Estimatormnist_classifier = tf.estimator.Estimator(model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")

Bir CNN'nin eğitilmesi birçok kez alır, bu nedenle, softmax katmanlarının değerlerini her 50 yinelemede depolamak için bir Günlük Kancası oluşturursunuz.

# Set up logging for predictionstensors_to_log = {"probabilities": "softmax_tensor"}logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)

Modeli tahmin etmeye hazırsınız. Toplu iş boyutunu 100 olarak ayarlarsınız ve verileri karıştırırsınız. 16.000 eğitim adımı belirlediğimizi unutmayın, eğitmek çok zaman alabilir. Sabırlı ol.

# Train the modeltrain_input_fn = tf.estimator.inputs.numpy_input_fn(x={"x": X_train_scaled},y=y_train,batch_size=100,num_epochs=None,shuffle=True)mnist_classifier.train(input_fn=train_input_fn,steps=16000,hooks=[logging_hook])

Artık model eğitildiğine göre, onu değerlendirebilir ve sonuçları yazdırabilirsiniz.

# Evaluate the model and print resultseval_input_fn = tf.estimator.inputs.numpy_input_fn(x={"x": X_test_scaled},y=y_test,num_epochs=1,shuffle=False)eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn)print(eval_results)
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-08-05-12:52:41INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56INFO:tensorflow:Saving dict for global step 15652: accuracy = 0.9589286, global_step = 15652, loss = 0.13894269{'accuracy': 0.9689286, 'loss': 0.13894269, 'global_step': 15652}

Mevcut mimari ile% 97 doğruluk elde edersiniz. Doğruluğu artırmak için mimariyi, parti boyutunu ve yineleme sayısını değiştirebilirsiniz. CNN sinir ağı, YSA veya lojistik regresyondan çok daha iyi performans gösterdi. Yapay sinir ağıyla ilgili eğiticide, CNN'yi düşüren% 96'lık bir doğruluğa sahiptiniz. CNN'in performansları , hem hız hesaplaması hem de doğruluk açısından daha büyük bir görüntü setiyle etkileyicidir .

Özet

Evrişimli bir sinir ağı, resmi değerlendirmek için çok iyi çalışır. Bu tür bir mimari, bir resim veya videodan nesneleri tanımada baskındır.

Bir CNN oluşturmak için altı adımı izlemeniz gerekir:

Adım 1: Giriş katmanı:

Bu adım, verileri yeniden şekillendirir. Şekil, piksel sayısının kareköküne eşittir. Örneğin, bir resim 156 piksele sahipse, şekil 26x26'dır. Resmin renkli olup olmadığını belirtmeniz gerekir. Cevabınız evet ise, o zaman 3 şekle - RGB için 3 -, aksi takdirde 1'e sahiptiniz.

input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1]) 

Adım 2: Evrişimli katman

Ardından, evrişimli katmanları oluşturmanız gerekir. Ağın önemli özellikleri öğrenmesine izin vermek için farklı filtreler uygularsınız. Çekirdeğin boyutunu ve filtre miktarını siz belirlersiniz.

conv1 = tf.layers.conv2d(inputs=input_layer,filters=14,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)

3. Adım: Toplama katmanı

Üçüncü adımda, bir havuz katmanı eklersiniz. Bu katman, girdinin boyutunu azaltır. Bunu, bir alt matrisin maksimum değerini alarak yapar. Örneğin, alt matris [3,1,3,2] ise, havuzlama maksimum olan 3'ü döndürecektir.

pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) 

Adım 4: Evrişimli Katman ve Havuzlama Katmanı Ekleyin

Bu adımda, istediğiniz kadar dönüşüm katmanları ve havuzlama katmanları ekleyebilirsiniz. Google, 20'den fazla dönüşüm katmanına sahip mimari kullanır.

Adım 5: Yoğun katman

5. adım, tamamen bağlantılı katmanlar oluşturmak için öncekini düzleştirir. Bu adımda, farklı aktivasyon işlevi kullanabilir ve bir bırakma efekti ekleyebilirsiniz.

pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)dropout = tf.layers.dropout(inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)

Adım 6: Logit Layer

Son adım, tahmindir.

logits = tf.layers.dense(inputs=dropout, units=10)