Adımlar ve Örneklerle TensorFlow'da CNN Görüntü Sınıflandırması

Evrişimsel Sinir Ağı Nedir?

Evrişimsel Sinir Ağı, convnets veya CNN olarak da bilinir, bilgisayarlı görüş uygulamalarında iyi bilinen bir yöntemdir. Görsel imgeleri analiz etmek için kullanılan bir derin sinir ağı sınıfıdır. Bu mimari türü, bir resim veya videodan nesneleri tanımak için baskındır. Görüntü veya video tanıma, sinir dili işleme vb. gibi uygulamalarda kullanılır.

ArchiEvrişimsel Sinir Ağının Yapısı

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

Görüntü sınıflandırması için bir evrişimsel sinir ağının anlaşılması çok zor değildir. Bir giriş görüntüsü, evrişim aşaması sırasında işlenir ve daha sonra bir etiket atfedilir.

Tipik bir convnet mimarisi aşağıdaki resimde özetlenebilir. Öncelikle, ağa bir görüntü gönderilir; buna giriş görüntüsü denir. Daha sonra, giriş görüntüsü sonsuz sayıda adımdan geçer; bu, ağın evrişimsel kısmıdır. Son olarak, sinir ağı görüntüdeki rakamı tahmin edebilir.

ArchiEvrişimli Sinir Ağının (CNN) yapısı
ArchiEvrişimli Sinir Ağının (CNN) yapısı

Bir görüntü, yüksekliği ve genişliği olan bir dizi pikselden oluşur. Gri tonlamalı görüntüde yalnızca bir kanal bulunurken renkli görüntüde üç kanal bulunur (her biri Kırmızı, Yeşil ve Mavi için). Bir kanal üst üste istiflenir. Bu eğitimde yalnızca tek kanallı gri tonlamalı bir görüntü kullanacaksınız. Her piksel, rengin yoğunluğunu yansıtacak şekilde 0 ila 255 arasında bir değere sahiptir. Örneğin 0'a eşit bir piksel beyaz renk gösterirken, değeri 255'e yakın olan piksel daha koyu olacaktır.

Şimdi dosyada saklanan bir görüntüye bakalım. MNIST veri seti. Aşağıdaki resim soldaki resmin matris formatında nasıl temsil edileceğini göstermektedir. Orijinal matrisin 0 ile 1 arasında olacak şekilde standartlaştırıldığını unutmayın. Daha koyu renk için matristeki değer yaklaşık 0.9 iken beyaz pikseller 0 değerine sahiptir.

Evrişimsel Sinir Ağı

Evrişimsel işlem

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

Evrişim kısmı sırasında ağ, görüntünün temel özelliklerini korur ve alakasız gürültüyü hariç tutar. Örneğin model, arka planda dağ bulunan bir resimden bir fili nasıl tanıyacağını öğreniyor. Geleneksel bir sinir ağı kullanıyorsanız model, gerekli olmayan ve ağı yanıltabilecek dağdaki pikseller de dahil olmak üzere tüm piksellere bir ağırlık atayacaktır.

Bunun yerine, bir keras evrişimsel 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 özellikler öğrenmesini sağlar. Evrişim, matrisi her parçadaki en temel öğeleri öğrenmek için küçük parçalara böler.

Evrişimli Sinir Ağının Bileşenleri (ConvNet veya CNN)

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

  1. kıvrım
  2. Doğrusal Olmama (ReLU)
  3. Pooling veya Alt Örnekleme
  4. Sınıflandırma (Tam Bağlantılı Katman)

kıvrım

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

Konvolüsyon, eleman bazında bir çarpmadır. Kavramın anlaşılması kolaydır. Bilgisayar, genellikle 3×3 boyutunda olan görüntünün bir kısmını tarayacak ve onu bir filtreye çarpacaktır. Eleman bazında çarpmanın çıktısına özellik haritası denir. Bu adım, tüm görüntü taranana kadar tekrarlanır. Konvolüsyondan sonra görüntünün boyutunun küçüldüğünü unutmayın.

kıvrım

Aşağıda, evrişimin nasıl çalıştığını uygulamalı olarak görmek için bir URL bulunmaktadır.

kıvrım

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

kıvrım

Evrişimin arkasındaki aritmetik

Evrişimsel faz, filtreyi resim içindeki küçük bir piksel dizisine uygulayacaktır. Filtre, genel olarak 3×3 veya 5×5 şeklinde giriş görüntüsü 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 görüntü, evrişimin nasıl çalıştığını göstermektedir. Yama boyutu 3×3'tür ve çıktı matrisi, görüntü matrisi ile filtre arasındaki eleman bazında işlemin sonucudur.

Evrişimin Arkasındaki Aritmetik

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

Kenarlık efekti

Görselde 5×5 özellik haritası ve 3×3 filtre bulunmaktadır. Ortada filtrenin 3×3 ızgarayı görüntüleyebileceği tek bir pencere vardır. Çıktı özelliği haritası, 3×3 boyutuyla birlikte iki kare küçültülecektir.

Kenar Etkisi

Giriş 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ütunun eklenmesinden oluşur. Evrişimin her giriş döşemesine sığmasını sağlayacak. Aşağıdaki resimde giriş/çıkış matrisi aynı boyuta sahiptir: 5×5

Kenar Etkisi

Ağı tanımladığınızda, evrilmiş özellikler üç parametre tarafından kontrol edilir:

  1. derinlik: Evrişim sırasında uygulanacak filtre sayısını tanımlar. Önceki örnekte derinliğin 1 olduğunu gördünüz, bu da yalnızca bir filtre kullanıldığı anlamına gelir. Çoğu durumda birden fazla filtre bulunur. Aşağıdaki resim üç filtreli bir durumda yapılan işlemleri göstermektedir

Kenar Etkisi

  1. Adım: İki dilim arasındaki "piksel sıçraması" sayısını tanımlar. Adım 1'e eşitse, pencereler bir piksellik yayılmayla hareket eder. Adım ikiye eşitse, pencereler 2 piksel sıçrar. Adımı artırırsanız, daha küçük özellik haritalarına sahip olursunuz.

Örnek adım 1

Adım Örneği

adım 2

Adım Örneği

  1. Sıfır dolgu: Doldurma, giriş özellikleri haritalarının her iki tarafına karşılık gelen sayıda satır ve sütun ekleme işlemidir. Bu durumda çıktı, girdiyle aynı boyuta sahiptir.

Doğrusal Olmama (ReLU)

Evrişim işleminin sonunda çıktı, doğrusal olmamayı sağlamak için bir aktivasyon fonksiyonuna tabi tutulur. Convnet için genel aktivasyon işlevi Relu'dur. Negatif değere sahip tüm pikseller sıfırla değiştirilecektir.

Pooling Operayon

Bu adımın anlaşılması kolaydır. Havuzlamanın amacı giriş görüntüsünün boyutunu azaltmaktır. Adımlar işlemin hesaplama karmaşıklığını azaltmak için yapılır. Boyutları azaltarak, ağın hesaplanacak daha düşük ağırlıkları olur, böylece aşırı uyumu önler.

Bu aşamada, boyutu ve adımı tanımlamanız gerekir. Giriş görüntüsünü bir araya getirmenin standart bir yolu, özellik haritasının maksimum değerini kullanmaktır. Aşağıdaki resme bakın. "Bir araya getirme", 4×4 özellik haritasının dört alt matrisini tarayacak ve maksimum değeri döndürecektir. Bir araya getirme, 2×2 dizinin maksimum değerini alır ve ardından bu pencereleri iki piksel hareket ettirir. Örneğin, ilk alt matris [3,1,3,2]'dir, bir araya getirme maksimum değeri döndürecektir, bu da 3'tür.

Pooling Operayon

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

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

Tamamen Bağlı Katmanlar

Son adım geleneksel bir yapı oluşturmaktır. yapay sinir ağı önceki eğitimde yaptığınız gibi. 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 softmax aktivasyon fonksiyonunu kullanırsınız.

Tekrar:

TensorFlow Evrişimli Sinir ağı, bir tahmin yapmadan önce farklı katmanları derler. Bir sinir ağı şunları içerir:

  • Evrişimsel bir katman
  • Relu Etkinleştirme işlevi
  • Pooling katmanı
  • Yoğun bağlı katman

Evrişimsel katmanlar resmin bir alt bölgesine farklı filtreler uygular. Relu aktivasyon fonksiyonu doğrusal olmama ekler ve havuzlama katmanları özellik haritalarının boyutluluğunu azaltır.

Tüm bu katmanlar görüntülerden gerekli bilgileri çıkarır. Son olarak özellik haritası, bir tahminde bulunmak için softmax işlevine sahip birincil, tamamen bağlı bir katmana beslenir.

TensorFlow ile CNN'yi eğitin

Artık bir convnet'in yapı taşı hakkında bilgi sahibi olduğunuza göre, bir convnet oluşturmaya hazırsınız. TensorFlow. CNN görüntü sınıflandırması için MNIST veri setini kullanacağız.

Veri hazırlama önceki eğitimle aynıdır. Kodları çalıştırabilir ve doğrudan CNN mimarisine geçebilirsiniz.

CNN kullanarak görsel sınıflandırma için aşağıdaki adımları izleyeceksiniz:

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

Adım 2: Giriş katmanı

Adım 3: Evrişimsel katman

4 Adım: Pooling katmanı

Adım 5: İkinci Evrişimsel Katman ve Pooling Katman

Adım 6: Yoğun katman

Adım 7: Logit Katmanı

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

MNIST veri kümesini şu adreste öğrenmek için scikit'te mevcuttur: URL. Lütfen indirin ve İndirilenler'de saklayın. fetch_mldata('MNIST orijinal') ile yükleyebilirsiniz.

Bir eğitim/test seti oluşturun

Veri setini train_test_split ile bölmeniz gerekiyor

Özellikleri ölçeklendirin

Son olarak, TensorFlow CNN örneğini kullanarak aşağıdaki görüntü sınıflandırmasında gösterildiği gibi özelliği MinMaxScaler ile ölçeklendirebilirsiniz.

import numpy as np
import tensorflow as tf
from sklearn.datasets import fetch_mldata

#Change USERNAME by the username of your machine
## Windows USER
mnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original')
## Mac User
mnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original')

print(mnist.data.shape)
print(mnist.target.shape)
from sklearn.model_selection import train_test_split

X_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 )
## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_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, geleneksel bir sinir ağıyla küresel desenle karşılaştırmalı ayrıntılı deseni öğrenmek için bir görüntünün ham pikselinde filtreler kullanır. Bir CNN oluşturmak için şunları tanımlamanız gerekir:

  1. Evrişimsel katman: Özellik haritasına n sayıda filtre uygulayın. Evrişimden sonra ağa doğrusal olmama özelliği eklemek için Relu aktivasyon fonksiyonunu kullanmanız gerekir.
  2. Pooling katmanı: Evrişimden sonraki adım, özellik maksimumunu küçültmektir. Amaç, aşırı uyumu önlemek ve hesaplama hızını artırmak için özellik haritasının boyutunu azaltmaktır. Maksimum havuzlama, özellik haritalarını alt bölgelere (genellikle 2×2 boyutunda) bölen ve yalnızca maksimum değerleri tutan geleneksel tekniktir.
  3. Tamamen bağlı katmanlar: Önceki katmanlardaki tüm nöronlar bir sonraki katmanlara bağlıdır. CNN, etiketi evrişimsel katmanlardaki özelliklere göre sınıflandıracak ve havuzlama katmanıyla azaltacaktır.

CNN mimarisi

  • Evrişimsel Katman: ReLU etkinleştirme işleviyle 14 5×5 filtre uygular (5×5 piksellik alt bölgeleri çıkarır)
  • Pooling Katmanı: 2×2 filtre ve 2 adımla maksimum havuzlama gerçekleştirir (bu, havuzlanan bölgelerin örtüşmediğini belirtir)
  • Evrişimsel Katman: ReLU etkinleştirme işleviyle 36 adet 5×5 filtre uygular
  • Pooling Katman #2: Tekrar, 2×2 filtre ve 2 adımla maksimum havuzlama gerçekleştirir
  • 1,764 nöron, bırakma düzenleme oranı 0.4 (herhangi bir öğenin eğitim sırasında düşürülme olasılığı 0.4)
  • Yoğun Katman (Logits Katmanı): 10 nöron, her rakam hedef sınıfı için bir tane (0-9).

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

  • conv2d(). Filtre sayısı, filtre çekirdeği boyutu, dolgu ve aktivasyon fonksiyonunun bağımsız değişken olarak kullanıldığı iki boyutlu bir evrişimli katman oluşturur.
  • max_pooling2d(). Max-pooling algoritmasını kullanarak iki boyutlu bir havuzlama 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. Her şeyi fonksiyona sarmadan önce her bir yapı taşının 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 şekline sahip 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 verinin özellikleridir.

Bir resmin yüksekliği, genişliği ve kanalı vardır. MNIST veri seti 28×28 boyutunda monokronik bir resimdir. Özelliklerin[“x”] şeklini alması için şekil argümanında parti boyutunu -1 olarak ayarladık. Bunun avantajı, toplu iş boyutu hiperparametrelerinin ayarlanmasını sağlamaktır. Toplu iş boyutu 7 olarak ayarlanırsa tensör 5,488 değeri (28*28*7) besleyecektir.

Adım 3: Evrişimsel katman

# first Convolutional Layer
  conv1 = 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 14x5 çekirdek boyutunda 5 filtreye sahiptir. Aynı dolgu, hem çıkış tensörünün 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ır ekleyecektir.

Relu aktivasyon fonksiyonunu kullanırsınız. Çıkış boyutu [28, 28, 14] olacaktır.

4 Adım: Pooling katmanı

Evrişimden sonraki adım havuzlama hesaplamasıdır. Havuzlama hesaplaması verilerin boyutunu azaltacaktır. 2×2 boyutunda ve 2 adım uzunluğunda 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 Layer 
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

Adım 5: İkinci Evrişimsel Katman ve Pooling Katman

İkinci evrişimsel katman, [batch_size, 32, 14, 14] çıktı boyutuna sahip 32 filtreye sahiptir. Havuzlama katmanı, öncekiyle aynı boyuta sahiptir ve çıktı şekli [batch_size, 14, 14, 18]'dir.

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

Daha sonra 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; bu, ağırlıkların yüzde 30'unun 0'a ayarlanacağı anlamına gelir. Bırakmanın yalnızca eğitim aşamasında gerçekleştiğini unutmayın. Cnn_model_fn işlevi, aşağıdaki CNN görüntü sınıflandırması TensorFlow örneğinde gösterildiği gibi, modelin eğitilmesinin veya değerlendirilmesinin gerekip gerekmediğ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 Katmanı

Son olarak TensorFlow görüntü sınıflandırma örneğinde son katmanı model tahminiyle tanımlayabilirsiniz. Çıktı şekli toplu iş boyutuna ve toplam görüntü sayısı olan 10'a eşittir.

# Logits Layer
logits = 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ı varsa en yüksek değeri döndürür. Softmax işlevi her 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")  }			

Sözlük tahminini yalnızca mod tahmin olarak ayarlandığında döndürmek istersiniz. Tahminleri göstermek 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ı hesaplamaktan oluşur. Son eğitimde, çoklu sınıf modeli 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)

TensorFlow CNN örneğinin son adımı modeli optimize etmek, yani ağırlıkların en iyi değerlerini bulmaktır. Bunun için öğrenme oranı 0.001 olan bir Gradyan iniş optimize edici kullanırsınız. Amaç kaybı en aza indirmek

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

CNN'le işiniz bitti. Ancak değerlendirme modu sırasında performans ölçümlerini görüntülemek istiyorsunuz. Çok sınıflı bir model için performans ölçümleri doğruluk ölçümleridir. Tensorflow, iki argüman, 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 oluşturdunuz 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 Layer
  input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])

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

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

  # Convolutional Layer #2 and Pooling Layer
  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)

  # Dense Layer
  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.4, training=mode == tf.estimator.ModeKeys.TRAIN)

  # Logits Layer
  logits = 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 Loss
  loss = 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 mode
  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)

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

Öncelikle görüntü sınıflandırması için CNN modeli ile bir tahminci tanımlarsınız.

# Create the Estimator
mnist_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 her 50 yinelemede softmax katmanlarının değerlerini depolamak için bir Günlük kancası oluşturursunuz.

# Set up logging for predictions
tensors_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 belirlersiniz ve verileri karıştırırsınız. Eğitim adımlarını 16.000 olarak belirlediğimizi unutmayın, eğitim çok zaman alabilir. Sabırlı ol.

# Train the model
train_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 results
eval_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:41
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56
INFO: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 mimariyle %97 doğruluk elde edersiniz. Doğruluğu artırmak için mimariyi, toplu boyutu ve yineleme sayısını değiştirebilirsiniz. CNN sinir ağı, ANN veya lojistik regresyondan çok daha iyi performans göstermiştir. Yapay sinir ağı eğitiminde, CNN'den daha düşük olan %96 doğruluk elde ettiniz. CNN'nin performansları daha büyük bir görüntüyle etkileyicidir setHem hız hesaplaması hem de doğruluk açısından.

ÖZET

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

TensorFlow CNN oluşturmak için Yedi adımı uygulamanız gerekir:

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

MNIST veri seti scikit ile öğrenilebilir. Lütfen indirin ve İndirilenler'de saklayın. fetch_mldata('MNIST orijinal') ile yükleyebilirsiniz.

2. Adım: Giriş katmanı:

Bu adım verileri yeniden şekillendirir. Şekil, piksel sayısının kareköküne eşittir. Örneğin, bir resmin 156 pikseli varsa, şekil 26×26'dır. Resmin rengi olup olmadığını belirtmeniz gerekir. Eğer varsa, şeklin 3'ü vardır - RGB için 3, aksi takdirde 1.

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

3. Adım: Evrişimsel katman

Daha sonra evrişimli katmanları oluşturmanız gerekir. Ağın önemli özellikleri öğrenmesini sağlamak 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)

4. Adım: Pooling katmanı

Üçüncü adımda bir havuzlama 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 değeri, yani 3'ü döndürür.

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

5. Adım: Evrişimsel Katman Ekle ve Pooling Katman

Bu adımda istediğiniz kadar conv katmanı ve havuzlama katmanı ekleyebilirsiniz. Google 20'den fazla conv katmanına sahip mimariyi kullanır.

6. Adım: Yoğun katman

6. adım, tamamen bağlantılı katmanlar oluşturmak için öncekini düzleştirir. Bu adımda farklı aktivasyon fonksiyonlarını kullanabilir ve 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)

7. Adım: Logit Katmanı

Son adım ise tahmindir.

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

Bu yazıyı şu şekilde özetleyin: