Özel TensorFlow'u uygulamalı öğretin (kodla)

Son sayıda, herkesin TensorFlow'u kapsamlı bir şekilde anlamasına ve başlamak için gerekli web sitelerini, kitapları, videoları ve diğer materyalleri paylaşmasını sağlayan "TensorFlow'u Anlamak için Bir Makale (kod ve öğrenme materyalleri ile)" yayınladık. Bu sayı sizi getirecek TensorFlow ile adım adım başlayın.

1. Giriş

Derin öğrenme algoritmalarının başarısı, yapay zeka araştırma ve uygulamasında atılımlar yaptı ve hayatımızı büyük ölçüde değiştirdi. Giderek daha fazla geliştirici, derin öğrenmenin geliştirme teknolojisini öğreniyor. Google'ın TensorFlow'u şu anda grafik sınıflandırması, ses işleme, öneri sistemleri ve doğal dil işleme alanlarında zengin uygulamalara sahip en popüler açık kaynaklı derin öğrenme çerçevesidir. Güçlü işlevlerine rağmen, Python'un kurulumunda ve kullanımında ustalaştığınız ve makine öğrenimi ve sinir ağlarını anladığınız sürece çerçevenin öğrenme eşiği yüksek değildir. Bu makale sizi TensorFlow'un aydınlanma yolculuğuna götürecektir.

2. TensorFlow'u tanıma

2.1. TensorFlow kurulum talimatları

Önce TensorFlow'u kuralım. TensorFlow ortam konusunda seçici değildir.Python 2.7 ve Python3 altında çalışabilir. İşletim sistemleri Linux, MAC ve Windows'dur (yeni sürüm, 64-bit olduğu sürece yalnızca bazı işletim sistemlerini çıktığında destekleyebilir). TensorFlow'u yüklemedeki temel fark, TensorFlow yükleme paketinin GPU'yu destekleyen ve GPU'yu desteklemeyen iki sürüme bölünmesidir. Adlar sırasıyla tensorflow-gpu ve tensorflow'dur. Gerçek üretim ortamında, GPU'nun güçlü hesaplama gücünü kolaylaştırmak için GPU'yu destekleyen bir sürüm kurmak en iyisidir, ancak bu önce ilgili CUDA ToolKit ve CuDNN'nin yüklenmesini gerektirir. Buna karşılık, GPU'yu desteklemeyen bir TensorFlow paketi kurmak daha kolaydır. İyi giderse, sadece pip install tensorflow'u çalıştırın. Okuyucular kurulum sırasında sorunlarla karşılaşırlarsa, hata istemlerine göre çevrimiçi çözümler arayabilirler.

Kurulumdan sonra, Python'u komut satırından başlatabilir veya Jupyter Notebook'u açabilir ve TensorFlow'un başarıyla kurulup kurulmadığını doğrulamak için aşağıdaki ifadeyi çalıştırabilirsiniz.

> > > tensorflow'u tf olarak içe aktar

TensorFlow paketlerine başvurmak için tf'yi kullanmak bir kural haline geldi. Bu makaledeki tüm örnek kodlarda, ifadenin önceden çalıştırıldığı varsayılmaktadır.

2.2. TensorFlow hesaplama modeli

Önce TensorFlow'da c = a + b'nin nasıl hesaplanacağına bakalım. Burada a = 3 ve b = 2.

> > > a = tf.constant (3)

> > > b = tf.constant (2)

> > > c = a + b

> > > sess = tf.Session ()

> > > baskı (sess.run (c))

5

Yukarıdaki koddan da görülebileceği gibi, aynı işlevi TensorFlow'da uygulamak için Python'daki bir baskıdan (3 + 2) daha fazla adım gerekir. Parametreler ilk olarak paketlenmeli ve ardından sonucun çıktısını almak için yürütme için Session nesnesine aktarılmalıdır.

Şimdi programın daha fazla hata ayıklama bilgisi vermesine izin vermek için kodu biraz değiştiriyoruz.

> > > a = tf.constant (3)

> > > b = tf.constant (2)

> > > baskı (a, b)

Tensör ("Sabit: 0", şekil = (), dtype = int32) Tensör ("Sabit_1: 0", şekil = (), dtype = int32)

> > > c = a + b

> > > baskı (c)

Tensör ("add: 0", şekil = (), dtype = int32)

> > > sess = tf.Session ()

> > > sess.run ((a, b))

(3,2)

> > > baskı (sess.run (c))

5

Yukarıdan da görülebileceği gibi, a, b ve c sayıları değil tensörlerdir. Bir tensörün matematiksel anlamı çok boyutlu bir dizidir. 1 boyutlu dizileri vektörler ve 2 boyutlu dizileri matrisler olarak adlandırıyoruz. 1 boyutlu, 2 boyutlu, 3 boyutlu veya 4 boyutlu ne olursa olsun, hepsi tensör olarak adlandırılabilir ve hatta skalerler (sayılar) 0 boyutlu tensörler olarak kabul edilebilir. Derin öğrenmede, neredeyse tüm veriler, sinir ağlarının ağırlıkları ve önyargıları gibi tensörler olarak kabul edilebilir. Siyah beyaz bir resim 2 boyutlu bir tensörle temsil edilebilir, burada her öğe resimdeki bir pikselin gri değerini temsil eder. Renkli bir resmin 3 boyutlu bir tensörle temsil edilmesi gerekir; burada iki boyut genişlik ve yüksekliktir ve diğer boyut bir renk kanalıdır. TensorFlow, adında Tensor kelimesini içerir. Başka bir Akış kelimesi "akış" anlamına gelir, bu da hesaplamanın tensörlerin akışı yoluyla ifade edildiği anlamına gelir. TensorFlow, hesaplamaları grafikler biçiminde ifade eden bir programlama sistemidir. Grafikteki her düğüm, hesaplama, başlatma ve atama dahil olmak üzere bir işlemdir. Tensör, işlemin girdisi ve çıktısıdır. Örneğin, yukarıdaki c = a + b, c = tf.add (a, b) 'ye eşdeğer olan bir tensörün toplama işlemidir, a ve b toplama işleminin girdisidir ve c, toplama işleminin çıktısıdır.

Tensörü yürütmek için oturum nesnesine (Oturum) gönderin ve belirli bir değeri elde edebilirsiniz. Yani TensorFlow'da iki aşama vardır: Öncelikle hesaplama sürecini bir hesaplama grafiği şeklinde tanımlayın ve ardından oturum nesnesine gönderin, hesaplamayı yapın ve hesaplama sonucunu geri getirin. Bunun nedeni, TensorFlow'un çekirdeğinin Python'da uygulanmaması ve her çağırma adımının, işlev kitaplığı ile Python arasında çok fazla ek yükü olan bir geçiş gerektirmesidir. Ve TensorFlow genellikle GPU üzerinde yürütülür. Her adım otomatik olarak yürütülürse, GPU verileri almak ve geri döndürmek için çok fazla kaynağı harcayacaktır, bu da döndürülen verileri bir kerede almaktan çok daha az verimlidir. TensorFlow'un hesaplama sürecini bir paket servis olarak düşünebiliriz. Bir lokantaya gidersek yemek yerken servis yapabiliriz. Bir paket yemek sipariş ederseniz, tarifi bir seferde sipariş etmeniz ve ardından diğer taraftan yemeği paketleyip teslim etmesini istemeniz gerekir, böylece teslimat yapan kişinin birden çok kez kaçması uygun olmaz.

Sess.run (c) ile eşdeğer ifade c.eval'dir (session = sess). Nesneler ve parametreler olarak tensör ve seans sadece ayarlanır. Bağlamda yalnızca bir oturum kullanılıyorsa, tf.InteractiveSession (), daha sonra hesaplamalar yapılırken belirtilmesi gerekmeyen varsayılan bir oturum nesnesi oluşturmak için kullanılabilir. hangisi:

> > > a = tf.constant (3)

> > > b = tf.constant (2)

> > > c = a + b

> > > sess = tf.InteractiveSession ()

> > > baskı (c.eval ())

5

Ek olarak, önceki kodda, 3 ve 2 numaralı parametreler kodda sağlamlaştırılmıştır. Ekleme işlemlerini birden çok kez gerçekleştirmek istiyorsanız, tf.constant yerine tf.placeholder kullanabilir ve ardından yürütme sırasında parametrelere değerler atayabiliriz. Aşağıdaki kodda gösterildiği gibi:

> > > a = tf.placeholder (tf.int32)

> > > b = tf.placeholder (tf.int32)

> > > c = a + b

> > > sess = tf.InteractiveSession ()

# Aşağıdaki ifade ayrıca print olarak da yazılabilir (sess.run (c, (a: 3, b: 2)))

> > > baskı (c.eval ({a: 3, b: 2}))

5

> > > baskı (c.eval ({a :, b:}))

Parametreleri saklamanın başka bir yolu da değişken nesneler (tf.Variable) kullanmaktır. Tf.constant işlevi tarafından oluşturulan tensörün aksine, değişken nesne parametre güncellemelerini destekler, ancak bu aynı zamanda daha fazla kaynağa bağlı olduğu ve oturuma daha sıkı bir şekilde bağlı olduğu anlamına gelir. Değişken nesnesi, oturum nesnesinde açıkça başlatılmalıdır, genellikle tüm değişkenleri bir kerede başlatmak için tf.global_variables_initializer işlevini çağırır.

> > > a = tf.Variable (3)

> > > b = tf.Variable (2)

> > > c = a + b

> > > init = tf.global_variables_initializer ()

> > > sess = tf.InteractiveSession ()

> > > init.run ()

> > > baskı (c.eval ())

5

> > > a.load (7)

> > > b. yük (8)

> > > baskı (c.eval ())

15

Derin öğrenmede, değişken nesneler genellikle ağırlık, önyargı vb. Gibi optimize edilecek model parametrelerini temsil etmek için kullanılır ve değerleri eğitim sürecinde otomatik olarak ayarlanır. Bu, bu makalenin ilerisindeki örnekte görülebilir.

3. TensorFlow makine öğrenimine başlarken

3.1. Verileri içe aktar

MNIST, genellikle makine öğrenimi için giriş niteliğinde bir örnek olarak kullanılan çok ünlü bir el yazısı rakam tanıma veri setidir. TensorFlow paketi, MNIST kullanımını daha kolay hale getirir. Şimdi, makine öğrenimi için TensorFlow'un nasıl kullanılacağını tartışmak için MINIST numara tanıma problemini örnek olarak alıyoruz.

MNIST, el yazısıyla yazılmış 70.000 resim içeren bir resim koleksiyonudur:

Ayrıca, her bir resme karşılık gelen ve bize hangi sayı olduğunu söyleyen bir etiket içerir. Örneğin, yukarıdaki dört resmin etiketleri 5, 0, 4, 1'dir.

Aşağıdaki kodda, input_data.read_data_sets () işlevi verileri indirir ve sıkıştırmasını açar.

tensorflow.examples.tutorials.mnist'ten import input_data

# MNIST_data, rastgele belirlenmiş depolama verileri için geçici bir dizindir

mnist = input_data.read_data_sets ("MNIST_data /", one_hot = Doğru)

İndirilen veri seti 3 bölüme ayrılmıştır: 55.000 eğitim verisi (minist.train); 5.000 doğrulama verisi (mnist. validation); 10.000 test verisi (mnist.test). Segmentasyonun amacı, eğitim için ayrı bir test veri setinin kullanılmasını değil, model tasarımı sırasında bu modelin performansını değerlendirmek için kullanılmasını sağlamak, böylece tasarlanan modeli diğer veri setlerine genişletmeyi kolaylaştırmaktır.

Her resim bir piksel içerir. Bir resmi temsil etmek için bir dizi sayı kullanabiliriz:

Dizi bir uzunluk vektörüne genişletilir, ardından eğitim veri kümesi mnist.train.images bir şekil tensörüdür. Bu tensördeki her öğe, belirli bir resimdeki belirli bir pikselin gri tonlamasını temsil eder ve değeri 0 ile 1 arasındadır.

MNIST veri kümesinin etiketi, 10 uzunluğunda tek sıcak vektördür (çünkü veriler daha önce yüklendiğinde one_hot True olarak belirtilmiştir). Bir tek sıcak vektör, bir hane dışında tüm boyutlarda 0'a sahiptir. Örneğin, etiket 3, () olarak temsil edilecektir. Bu nedenle, mnist.train.labels bir sayılar matrisidir.

3.2. Tasarım modeli

Şimdi, resimdeki sayıları tahmin etmek için Softmax adlı bir makine öğrenimi modeli eğitiyoruz. Özetlemek gerekirse, sınıflandırma ve regresyon (sayısal tahmin) en temel makine öğrenimi problemleridir. Doğrusal regresyon, regresyon problemleri için en temel makine öğrenme modelidir. Temel fikri, her bir etkileyen faktöre uygun ağırlıklar atamaktır ve tahmin edilen sonuç, her bir etkileyen faktörün ağırlıklı toplamıdır. Lojistik regresyon, genellikle sınıflandırma problemleriyle başa çıkmak için kullanılır.Doğrusal regresyona dayalı olarak, referans değerinin altındaki ve üzerindeki sonuçları sırasıyla 0 ve 1'e yakın değerlere dönüştürmek için Lojistik fonksiyonunu (Sigmoid fonksiyonu olarak da adlandırılır) kullanır. Ancak lojistik regresyon yalnızca ikili problemlerle başa çıkabilir. Softmax regresyonu, çoklu sınıflandırma problemlerinde lojistik regresyonun teşvik edilmesidir. Modelin tamamı aşağıda gösterilmiştir:

Veya doğrusal cebir formülünde şu şekilde ifade edilir:

Bunlar arasında x giriş verilerinin özellik vektörü, vektörün uzunluğu resmin pikselidir (), vektördeki her eleman resimdeki her noktanın gri değeridir ve W 784'ü resmin pikseline karşılık gelen ağırlık matrisidir. 10, 0'dan 9'a kadar 10 sayıya karşılık gelir, b, 10 uzunluğunda bir vektördür, vektördeki her eleman, 0'dan 9'a kadar her bir sayının ofsetidir ve her sayının ağırlığı elde edilir.Son olarak, softmax işlevi, ağırlığı bir olasılık dağılımına dönüştürür . Genellikle sonunda sadece en yüksek olasılığa sahip sayıyı tutuyoruz, ancak bazen daha yüksek olasılığa sahip diğer sayılara da dikkat ediyoruz.

Aşağıdaki, formülü TensorFlow'da uygulamak için koddur. Temel kod, tf.matmul işlevinin Tensor'daki matris çarpımını temsil ettiği son cümledir. Formülden küçük bir farkın, x'in 2 boyutlu bir tensör olarak bildirilmesi olduğuna dikkat edin, burada birinci boyut herhangi bir uzunluktur, böylece işleme için girdi görüntülerini toplu işleyebiliriz. Ayrıca basitlik açısından W ve b'yi 0 ile dolduruyoruz.

x = tf.placeholder (tf.float32,)

W = tf.Variable (tf.zeros ())

b = tf.Variable (tf.zeros ())

y = tf.nn.softmax (tf.matmul (x, W) + b)

Modele ek olarak, modeldeki parametrelerin nasıl optimize edileceğini gösteren bir gösterge tanımlamamız da gerekiyor. Genellikle bir modelin ne kadar yetersiz olduğunu gösteren göstergeler tanımlar ve ardından bu göstergeyi en aza indirmeye çalışırız. Bu göstergeye maliyet fonksiyonu denir. Maliyet fonksiyonu, modelle yakından ilgilidir. Regresyon problemleri genellikle maliyet fonksiyonu olarak ortalama kare hatasını kullanır.Sınıflandırma problemleri için yaygın olarak kullanılan maliyet fonksiyonu çapraz entropidir ve şu şekilde tanımlanır:

Burada y, tahmin edilen olasılık dağılımımızdır ve y ', gerçek dağılımdır. Çapraz entropinin anlaşılması bilgi teorisi bilgisini içerir Burada, bunu tahminlerin uyumsuzluğunu yansıtan bir gösterge olarak görebiliriz veya göstergenin gerçek durumun ne ölçüde beklenmedik olduğunu yansıtır. Çapraz entropinin asimetrik olduğuna dikkat edin. TensorFlow'da çapraz entropi şu kodla ifade edilir:

cross_entropy = -tf.reduce_sum (y_ * tf.log (y))

Çapraz entropi genellikle Softmax regresyonuyla birlikte kullanıldığından, TensorFlow bu iki işlevi birleşik bir şekilde kapsüller ve tf.nn.softmax_cross_entropy_with_logits işlevini sağlar. Softmax regresyonunu kullandıktan sonra çapraz entropi işlevi, aşağıdaki kod aracılığıyla doğrudan gerçekleştirilebilir. Formüldeki y'nin aksine, koddaki y'nin Softmax işlevi çağrılmadan önceki değer olduğuna dikkat edin. Son olarak, ortalama değeri elde etmek için tf.reduce_mean işlevini çağırın, çünkü resimler gruplar halinde aktarılır ve her resim için bir çapraz entropi hesaplanır.

y = tf.matmul (x, W) + b

cross_entropy = tf.reduce_mean (

tf.nn.softmax_cross_entropy_with_logits (etiketler = y_, logits = y))

3.3. Tasarım optimizasyon algoritması

Şimdi maliyet fonksiyonunu en aza indirmek için parametreleri nasıl ayarlayacağımızı düşünmemiz gerekiyor.Bu, makine öğreniminde optimizasyon algoritması tasarım problemi olarak adlandırılıyor. Yazar burada TensorFlow'un optimizasyon sürecine kısa bir giriş yapıyor: Optimizasyon algoritmasının bir anlamda modelden daha önemli olduğunu bilmelisiniz.

TensorFlow, sinir ağlarına dayalı bir derin öğrenme çerçevesidir. Softmax gibi modeller için, gizli katmanları olmayan, tamamen bağlı bir sinir ağı olarak kabul edilir. Sinir ağındaki parametreleri eğitim verilerine uyacak şekilde ayarlayarak, model, ileriye doğru yayılma ve geri yayılma (Geri yayılım) yinelemeli sürecine yansıyan bilinmeyen örnekleri tahmin etme yeteneği sağlayabilir. Her yinelemenin başlangıcında, ilk olarak eğitim verilerinin tamamı veya bir kısmı seçilmelidir ve sinir ağı modelinin tahmin sonucu ileri yayılma algoritması ile elde edilir.

Eğitim verileri doğru cevapla işaretlendiğinden, mevcut sinir ağı modelinin tahmin edilen cevabı ile doğru cevap arasındaki boşluk hesaplanabilir. Son olarak, tahmin edilen değer ile gerçek değer arasındaki farka bağlı olarak, geri yayılım algoritması, sinir ağı parametrelerinin değerlerini buna göre güncelleyecektir, böylece bu veri yığını üzerindeki sinir ağı modelinin tahmin sonuçları gerçek yanıtlara daha yakın olacaktır. Aşağıda gösterildiği gibi:

TensorFlow, çeşitli farklı optimize edicileri destekler ve okuyucular, belirli uygulamalara göre farklı optimizasyon algoritmaları seçebilir. Yaygın olarak kullanılan üç optimizasyon yöntemi vardır:

  • tf.train.GradientDescentOptimizer

  • tf.train.AdamOptimizer

  • tf.train.MomentumOptimizer

train_step = tf.train.GradientDescentOptimizer (0.01) .minimize (cross_entropy)

Burada, TensorFlow'un 0.01 öğrenme hızıyla çapraz entropiyi en aza indirmek için Gradient Descent'i kullanmasını istiyoruz. Gradyan iniş algoritması basit bir öğrenme sürecidir ve TensorFlow'un yalnızca her değişkeni, maliyeti düşürme yönünde yavaş yavaş hareket ettirmesi gerekir. İfade tarafından döndürülen train_step, çalıştırılacak oturum nesnesine gönderilebilen optimize edilmiş işlemi (İşlem) temsil eder.

3.4. Modeli eğitmek

Şimdi modeli eğitmeye ve 1000 kez yinelemeye başlıyoruz. Oturum nesnesinin W, b veya y'yi değil, train_step'i yürüttüğünü unutmayın.

aralıktaki i için (1000):

batch_xs, batch_ys = mnist.train.next_batch (100)

sess.run (train_step, feed_dict = {x: batch_xs, y_: batch_ys})

Döngünün her adımında, eğitim verilerinde rastgele 100 toplu veri noktası alırız ve daha sonra bu veri noktalarını, train_step işlemini çalıştırmak için önceki yer tutucuların yerine parametre olarak kullanırız.

Az miktarda rastgele veri kullanarak eğitim, stokastik eğitim olarak adlandırılır - bu durumda, daha kesin olarak stokastik gradyan iniş eğitimidir. İdeal bir durumda, eğitimin her adımı için tüm verilerimizi kullanmayı umuyoruz, çünkü bu bize daha iyi eğitim sonuçları verebilir, ancak açıkçası bu çok fazla hesaplama ek yükü gerektirir. Bu nedenle, her eğitim için farklı veri alt kümeleri kullanabiliriz, bu da hesaplama yükünü azaltabilir ve veri kümesinin genel özelliklerini en üst düzeye çıkarabilir.

3.5. Değerlendirme Modeli

Modelimizin çalışıp çalışmadığını doğrulama zamanı. Eğitilmiş W ve b'ye dayanarak, y'yi hesaplamak ve tahmin edilen sayıyı test resminin gerçek etiketiyle karşılaştırmak için test resmini kullanabiliriz. Numpy'de, dizideki en büyük elemanın indeks değerini verebilen çok kullanışlı bir argmax fonksiyonu vardır. Etiket vektörü 0, 1'den oluştuğundan, maksimum değer 1'in bulunduğu dizin konumu kategori etiketidir. Y için, en büyük ağırlığın indeks konumu tahmin edilen sayıdır, çünkü softmax işlevi monoton olarak artmaktadır. Aşağıdaki kod, her test resminin tahmininin gerçek durumla eşleşip eşleşmediğini karşılaştırır ve ortalama işlevi aracılığıyla doğru oranı hesaplar.

numpy'yi np olarak içe aktar

output = sess.run (y, feed_dict = {x: mnist.test.images})

baskı (np.mean (np.argmax (çıktı, 1) == np.argmax (mnist.test.labels, 1)))

TensorFlow'un karşılaştırmayı gerçekleştirmesine de izin verebiliriz, bu da çoğu durumda daha rahat ve verimli olur. TensorFlow'da benzer bir argmax işlevi vardır.

right_prediction = tf.equal (tf.argmax (y, 1), tf.argmax (y_, 1))

doğruluk = tf.reduce_mean (tf.cast (right_prediction, "float"))

baskı (sess.run (doğruluk, feed_dict = {x: mnist.test.images, y_: mnist.test.labels}))

Nihai sonuç değeri yaklaşık% 91 olmalıdır. Kodun tamamı için lütfen birkaç değişiklikle https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py adresine bakın.

4. TensorFlow derin öğrenmeye başlarken

4.1. Evrişimli Sinir Ağlarına Giriş

Daha önce tek katmanlı bir sinir ağı kullandık. Sinir ağının katman sayısı artırılırsa, doğruluk oranı daha da iyileştirilebilir. Bununla birlikte, katman sayısının artırılması, eğitilmesi gereken parametrelerin sayısını artıracaktır, bu da yalnızca hesaplama hızını yavaşlatmakla kalmaz, aynı zamanda kolayca aşırı uyum sorunlarına da yol açar. Bu nedenle, sinir ağındaki parametre sayısını etkili bir şekilde azaltmak için daha makul bir sinir ağı yapısına ihtiyaç vardır. Görüntü tanıma gibi sorunlar için, Convolutional Neural Network (CNN) şu anda en etkili yapıdır.

Evrişimli sinir ağı seviyeleri artan bir yapıdır Temel fikir piksellerin ve kenarların tanınmasıyla başlamak, ardından yerel şekle ve son olarak genel algıya ulaşmaktır. Geleneksel yöntemlerde, köşe noktaları, gradyanlar vb. Gibi özellikleri çıkarmak için, sınıflandırmadan önce görüntüyü düzleştirme, denoize etme, ışık normalleştirme vb. Gibi önceden işlememiz gerekir ve evrişimli sinir ağları bu işlemi otomatikleştirir. Elbette sinir ağı bir kara kutudur, yukarıda bahsedilen kavramlar olmadan, çıkardığı tek şey soyut anlamdaki, insanlar tarafından anlaşılan anlamsal özelliklere karşılık gelmeyen özelliklerdir. Dahası, birden fazla dönüşüm katmanından sonra, resim uzun zamandır tamamen farklıydı. Ek olarak, evrişimli sinir ağları, görüntü tanıma dışındaki alanlarda da kullanılabilir. Ancak anlaşılmasını kolaylaştırmak için aşağıda pikseller ve renkler gibi günlük terimler hala kullanılmaktadır.

Evrişimli sinir ağlarında özellik tanımanın temel yöntemi Evrişim'dir. Resmin özel efektlerle işlendiğini anlayabiliriz.Yeni resmin her bir konumunun piksel değeri, Photoshop'taki bulanıklaştırma gibi filtrelere benzer şekilde, orijinal resmin karşılık gelen konumunu ve bitişik konumun piksel değerini üst üste getirmenin veya ters çevirmenin belirli bir yoludur. TensorFlow'da keskinleştirme ve mozaiğe filtreler denir. Evrişimin hesaplama yöntemi, bitişik alanlardaki piksellerin ağırlıklı toplamıdır.Bir formülle ifade edilirse, yine de geçerlidir, ancak hesaplama küçük bir dikdörtgen alanla sınırlıdır.

Evrişim yalnızca resmin bitişik konumları için olduğundan, eğitimden sonra yerel girdi özelliklerine en güçlü yanıtı sağlayabilir. Ek olarak, görüntünün nerede konumlandırıldığına bakılmaksızın, aynı ağırlık seti kullanılır; bu, filtreyi bir el feneri olarak görüntü üzerinde ileri geri taramaya eşdeğerdir, bu da görüntü içeriğinin görüntüdeki konumunun yargı sonucunu etkilememesini sağlar. Evrişimli ağın bu özellikleri, parametre sayısını önemli ölçüde azaltırken, aynı zamanda görüntünün yapısal bilgisini, görüntünün düşük seviyeden karmaşık özelliklerine kadar, insan performansını bile aşabilecek şekilde daha iyi bir şekilde kullanabilir.

Sinir ağının, doğrusallaştırmayı kaldırmak için aktivasyon işlevini kullanması gerekir, aksi takdirde, ağın derinliği artırılsa bile, yine de doğrusal bir haritalama olur ve birden çok katmanın etkisi elde edilemez. Softmax modelinde kullanılan Sigmoid işlevinin aksine, evrişimli sinir ağının aktivasyon işlevi, geri yayılma fazının hesaplanmasına yardımcı olan ve aşırı uyumu da hafifletebilen ReLU'dur. ReLU işlevi çok basittir ve 0'dan küçük çıktıyı yok sayar, bu da origami gibi verileri ayırt etmek olarak anlaşılabilir. ReLU işlevini kullanırken, nöron düğümünün çıktısının her zaman 0 olması sorununu önlemek için önyargı terimini küçük bir pozitif sayıyla başlatmak daha iyidir. Aşağıdaki şekil Sigmoid ve ReLU işlevlerinin bir karşılaştırmasıdır.

Evrişime ek olarak, evrişimli sinir ağları genellikle altörnekleme kullanır (altörnekleme veya alt örnekleme). Resmin uygun şekilde küçültüldüğünü anlayabiliriz, böylece aşırı uydurma belirli bir dereceye kadar kontrol edilir ve görüntü döndürme ve distorsiyonun özellik çıkarımı üzerindeki etkisini azaltır, çünkü aşağı örnekleme sürecinde yön bilgisi bulanıklaşır. Evrişimli sinir ağları, evrişim ve altörnekleme yoluyla büyük miktarda veriyle görüntü tanıma problemlerinin boyutsallığını başarılı bir şekilde azaltır ve sonunda bunların eğitilmesini sağlar. Alt örnekleme, genellikle maksimum havuzlama, ortalama havuzlama vb. Dahil evrişimli sinir ağlarında havuzlama olarak adlandırılır. En yaygın olanı, giriş verilerini üst üste binmeyen dikdörtgen kutu alanlarına bölen ve çıktı olarak her dikdörtgen kutu için maksimum değeri alan maksimum havuzlamadır. Aşağıda gösterildiği gibi.

4.2. LeNet-5 Ağı Oluşturma

Evrişimli sinir ağları hakkında temel bir anlayışa sahip olduktan sonra, şimdi bu ağı MNIST basamak tanıma problemleriyle uğraşmak için kullanmaya başlıyoruz. Burada, en klasik LeNet-5 modeline atıfta bulunarak, TensorFlow'un derin öğrenme için nasıl kullanılacağı. LeNet-5'in yapısı aşağıdaki şekilde gösterilmektedir. LeNet-5'in iki evrişim ve altörnekleme içerdiği ve ardından iki tam bağlantıdan geçtiği ve çıktı olarak Softmax sınıflandırmasını kullandığı görülebilir.

Modelin ilk katmanı evrişimli katmandır. Giriş orijinal resimdir, boyuttur ve renk gri tonlamayla temsil edilir, bu nedenle veri türü böyledir. Toplu giriş dikkate alındığında, verilerin 4 boyutu olmalıdır. Filtre boyutu 32 özelliktir, bu nedenle ağırlık W bir tensördür ve ofset b, 32 uzunluğunda bir vektördür. Ek olarak, çıktı resminin hala boyutta olmasını sağlamak için, resmin kenarındaki pikselleri döndürürken çevreyi doldurmak için 0 kullanırız.

TensorFlow'da tf.nn.conv2d işlevi, evrişimli katmanın ileri yayılma algoritmasını uygular. Bu fonksiyonun ilk iki parametresi sırasıyla girdi verilerini x ve ağırlık W'yi temsil eder, bunların her ikisi de yukarıda açıklandığı gibi 4 boyutlu tensörlerdir. Simetriyi kırmak ve sıfır gradyanı önlemek için ağırlık az miktarda parazitle başlatılmalıdır, burada doldurmak için tf.truncated_normal işlevi tarafından oluşturulan rastgele miktarı kullanıyoruz. Fonksiyonun sonraki iki parametresi, görüntü üzerinde kaydırıldığında filtrenin adım boyutu ve doldurma yöntemi dahil olmak üzere evrişim yöntemini tanımlar. Adım uzunluğu, giriş verilerinin 4 boyutuna karşılık gelen bir uzunluk dizisi 4 ile temsil edilir. Aslında, yalnızca ortadaki iki sayının ayarlanması gerekir. Burada, piksel piksel hareket ettiği anlamına gelecek şekilde ayarladık. Doldurma yöntemi için iki seçenek vardır: "AYNI" veya "GEÇERLİ", burada "AYNI" 0 dolgunun tamamını eklemek ve "GEÇERLİ", eklememek anlamına gelir.

Aşağıdaki kod, modelin ilk katmanını uygular:

x = tf.placeholder (tf.float32,)

# Burada tf.reshape işlevi tensörün boyutunu düzeltmek için kullanılır, -1 uyarlanabilir anlamına gelir

x_image = tf.reshape (x,)

W_conv1 = tf.Variable (tf.truncated_normal (, stddev = 0.1))

b_conv1 = tf.Variable (tf.constant (0.1, şekil =))

# Evrişim gerçekleştirdikten sonra doğrusallaştırmak için ReLU işlevini kullanın

h_conv1 = tf.nn.relu (tf.nn.conv2d (

x_image, W_conv1, strides =, padding = 'AYNI') + b_conv1)

Modelin ikinci katmanı alt örnekleme katmanıdır. Örnekleme penceresi boyutu üst üste binmez, bu nedenle adım boyutu da maksimum havuzlama kullanılarak örneklemeden sonra görüntünün boyutu orijinalin yarısına düşürülür. Resimlerin maksimum havuzunu gerçekleştirme işlevi tf.nn.max_pool'dur. Parametreleri tf.nn.conv2d'ye benzer, tek fark, ikinci parametrenin ağırlığı değil, giriş verilerinin 4 boyutuna karşılık gelen uzunluk 4 dizisi ile temsil edilen örnekleme penceresinin boyutunu ayarlaması dışında.

h_pool1 = tf.nn.max_pool (h_conv1, ksize =,

strides =, padding = 'AYNI')

Modelin üçüncü katmanı evrişimli katmandır. Girdi veri boyutu 32 özelliktir ve filtre boyutu hala 64 özelliktir Bu nedenle, ağırlık tipi W'dir ve ofset b, 64 uzunluğunda bir vektördür.

W_conv2 = tf.Variable (tf.truncated_normal (, stddev = 0.1))

b_conv2 = tf.Variable (tf.constant (0.1, şekil =))

# Evrişim gerçekleştirdikten sonra doğrusallaştırmak için ReLU işlevini kullanın

h_conv2 = tf.nn.relu (tf.nn.conv2d (

h_pool1, W_conv2, strides =, padding = 'AYNI') + b_conv2)

Modelin dördüncü katmanı, ikinci katmana benzer şekilde aşağı örnekleme katmanıdır. Görüntü boyutu yeniden yarıya indirilir.

h_pool2 = tf.nn.max_pool (h_conv2, ksize =,

strides =, padding = 'AYNI')

Modelin beşinci katmanı, tamamen bağlantılı bir katmandır. Girdi veri boyutu 64 özelliktir ve 1024 nöron çıktıdır. Tamamen bağlı olduğundan, hem giriş verisi x hem de ağırlık W 2 boyutlu tensörler olmalıdır. Birçok tam bağlantı parametresi vardır ve aşırı uyumu önlemek için Dropout burada tanıtılmıştır. Bırakma, her eğitim sırasında rastgele bazı ağırlıkları devre dışı bırakır; bu, birden fazla eğitim örneğinde sonuçların ortalamasına eşdeğerdir ve ayrıca her ağırlık arasındaki bağlantıyı azaltır. TensorFlow'da Dropout'u uygulayan işlev tf.nn.dropout'tur. Fonksiyonun ikinci parametresi, her bir ağırlığın devre dışı bırakılmama olasılığını temsil eder.

W_fc1 = tf.Variable (tf.truncated_normal (, stddev = 0.1))

b_fc1 = tf.Variable (tf.constant (0.1, şekil =))

# 4 boyutlu tensörü 2 boyutluya dönüştürme

h_pool2_flat = tf.reshape (h_pool2,)

h_fc1 = tf.nn.relu (tf.matmul (h_pool2_flat, W_fc1) + b_fc1)

keep_prob = tf.placeholder (tf.float32)

h_fc1_drop = tf.nn.dropout (h_fc1, keep_prob)

Modelin son katmanı, daha önce tanıtılan tek katmanlı modele benzer şekilde, tamamen bağlantılı artı Softmax çıktısıdır.

W_fc2 = tf.Variable (tf.truncated_normal (, stddev = 0.1))

b_fc2 = tf.Variable (tf.constant (0.1, şekil =))

y_conv = tf.matmul (h_fc1_drop, W_fc2) + b_fc2

cross_entropy = tf.reduce_mean (

tf.nn.softmax_cross_entropy_with_logits (etiketler = y_, logits = y_conv))

4.3. Modeli eğitin ve değerlendirin

Eğitim ve değerlendirme için, önceki basit tek katmanlı Softmax modeliyle hemen hemen aynı kod setini kullanıyoruz, ancak yakınsama süresini kısaltmak için daha karmaşık bir ADAM iyileştirici kullanacağız ve Bırakmayı kontrol etmek için feed_dict'e ek bir keep_prob parametresi ekleyeceğiz oran. Ardından, her 100 yinelemede bir günlük çıktısını alın.

train_step = tf.train.AdamOptimizer (1e-4) .minimize (cross_entropy)

right_prediction = tf.equal (tf.argmax (y_conv, 1), tf.argmax (y_, 1))

doğruluk = tf.reduce_mean (tf.cast (right_prediction, tf.float32))

sess = tf.InteractiveSession ()

sess.run (tf.global_variables_initializer ())

aralıktaki i için (20000):

batch_xs, batch_ys = mnist.train.next_batch (50)

eğer ben% 100 == 0:

train_accuracy = doğruluk.eval (feed_dict = {

x: batch_xs, y_: batch_ys, keep_prob: 1.0})

print ('adım% d, eğitim doğruluğu% g'% (i, train_accuracy))

train_step.run (feed_dict = {x: batch_xs, y_: batch_ys, keep_prob: 0.5})

print ('test doğruluğu% g'% doğruluk.eval (feed_dict = {

x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

Yukarıdaki kodun son test setindeki doğruluğu yaklaşık% 99,2'dir. Kodun tamamı için lütfen bazı değişikliklerle birlikte https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_deep.py adresine bakın.

5. Özet

Bu makalede, TensorFlow'un temel kullanımını tanıtıyoruz ve MNIST verilerini, Softmax modeline ve evrişimli sinir ağına dayalı makine öğrenimi ve derin öğrenme için TensorFlow'un nasıl kullanılacağını açıklamak için örnek olarak alıyoruz.

TensorFlow, zengin eğitim modelleri dahil olmak üzere derin öğrenme için güçlü destek sağlar ve ayrıca TensorBoard, TensorFlow oyun alanı ve TensorFlow Debugger gibi uygun görselleştirme ve hata ayıklama araçları sağlar. Alan sınırlamaları nedeniyle, bunları burada tek tek tanıtmayacağım. Ayrıntılar için lütfen resmi TensorFlow belgelerine bakın. Derin öğrenme nispeten yeni bir teknolojidir ve teorik ve pratikte birçok tuzak vardır. Ancak daha fazlasını öğrendiğiniz ve başladığınız sürece, TensorFlow'un ellerinizde bir silah olabileceğine inanıyorum.

Referans malzemeleri:

"TensorFlow: Pratik Google Derin Öğrenme Çerçevesi", Caiyun Technology, Zheng Zeyu, Gu Siyu

Sam Abrahams tarafından "Makine Zekası için TensorFlow Uygulaması", Duan Fei ve Chen Peng tarafından çevrildi

"Merhaba, TensorFlow"

"TensorFlow White Paper" (çeviri)

"Evrişimli Sinir Ağı"

"Evrişimli Sinir Ağlarına Giriş"

Parktaki kadına saldıran adam, şüphelinin izini takip ederek kıyafetlerini değiştirdi ve kaçtı.
önceki
Isınma maçı Iron Gate 2, Giroud Grim Reaper'a yardımcı oldu, Arsenal'in 3-1 sezon öncesi iki maçlık galibiyet serisini attı
Sonraki
Uzun süredir beklenen "Blade Runner 2049", sıfır spoyler derinlemesine analiziyle nihayet burada!
GIF-Milli futbolcu genç kız şaşırttı, Luneng AFC Şampiyonlar Ligi'nde 3 dakikada 2 gol, Kashima'nın 0-2 gerisinde kaybetti!
Yao Kizhi'nin Yunqi Konferansı'nda yaptığı konuşma: Neden bu finansal teknolojinin "yeni" altın çağı olduğunu söylüyorum
Bahar Şenliğini hangi ritüeller temsil edebilir?
Özel | Yapay zeka alanında 66 seçkin bilim insanını araştırırken bulduk ki ...
Özel Doğal dil işleme NLP'yi anlamak için bir makale (öğrenme materyalleri ile)
İlk profesyonel sözleşmesini 16 yıl önce imzaladı ve daha sonra Barcelona'da hayatının galibi oldu!
Anakara film pazarı yükseliyor, "Venom" Anakara ilk haftada 770 milyon çekiyor
Özel | 2017 Yunqi Konferansı'nda yayınlanan veri bilimi topluluğu hakkında ne güzel haberler var?
Hedeflenen yoksulluğun azaltılmasını sağlamak için büyük veri nasıl kullanılır?
inci! Pato göndermeye devam etti: gerçek geç kalacak, ama asla olmayacak!
Binlerce oyunculu oyun takımı ortaya çıktı ve 5 yıl içinde oyunlar ve hayat birleşmeye başlayacak
To Top