Özel TensorFlow'un temellerini anlamak için bir makale

Bu makalenin uzunluğu 7196 kelime , Okumanız tavsiye edilir 10 dakika

Bu makale, Tensorflow'un makine öğrenimi ve derin öğrenme için nasıl kullanılacağını açıklar.

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 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, başlayabilirsiniz. Bu makale sizi TensorFlow ile aydınlanma yolculuğuna çıkaracak.

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ü bilgi işlem gücünü kolaylaştırmak için GPU'yu destekleyen bir sürüm kurmak en iyisidir, ancak bunun için önce ilgili CUDA ToolKit ve CuDNN'nin yüklenmesi gerekir. Buna karşılık, GPU'yu desteklemeyen bir TensorFlow paketi kurmak daha kolaydır. Sorunsuz bir şekilde giderse, pip install tensorflow'u çalıştırın ve tamam olacaktır. 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 görülebileceği gibi, aynı işlevi TensorFlow'da uygulamak için Python'daki bir print (3 + 2) 'den daha fazla adım gerekir. Parametrelerin ilk olarak paketlenmesi ve ardından yürütme işleminin sonucun çıktısını alması için Session nesnesine iletilmesi gerekir.

Ş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 diziye vektör ve 2 boyutlu diziye matris diyoruz. 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, sinir ağlarının ağırlıkları ve önyargıları gibi neredeyse tüm veriler 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ışıyla 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 üzere 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 birden çok kez almak ve geri döndürmek için çok fazla kaynak israf eder ve bu, döndürülen verileri bir kerede almaktan çok daha az verimlidir. TensorFlow'un hesaplama sürecini bir paket servis olarak hayal edebiliriz. Bir lokantaya gidersek yemek yerken servis yapabiliriz. Bir paket yemek sipariş ederseniz, tarifi bir defada sipariş etmeniz ve ardından diğer taraftan yemeği paketleyip teslim etmesini istemeniz gerekir, teslimat yapan kişinin birden çok kez kaçması uygun değildir.

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, daha sonra hesaplamalar yaparken belirtilmesi gerekmeyen varsayılan bir oturum nesnesi oluşturmak için tf.InteractiveSession () öğesini kullanabilirsiniz. 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 parametreleri 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 baskı 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örden farklı olarak, değişken nesne parametre güncellemesini 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 resme karşılık gelen ve bize sayının ne 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 bir 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 problemlerinin üstesinden gelmek 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 ikilemlerle ilgilenebilir. 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ı tutarız, ancak bazen daha yüksek olasılığa sahip diğer sayılara da dikkat ederiz.

Aşağıdaki, bu 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. Ek olarak, 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 ve sınıflandırma problemleri için yaygın olarak kullanılan maliyet fonksiyonu çapraz entropidir.

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 veya göstergenin gerçek durumun ne ölçüde beklenmedik olduğunu yansıtan bir gösterge olarak kabul edebiliriz. Çapraz entropinin asimetrik olduğuna dikkat edin. TensorFlow'da çapraz entropi aşağıdaki kodla ifade edilir:

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

Çapraz entropi genellikle Softmax regresyonuyla 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 almak için tf.reduce_mean işlevi çağrılır, çü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ılma) 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ının seçilmesi gerekir ve sinir ağı modelinin tahmin sonucu ileri yayılma algoritması ile elde edilir. Eğitim verileri doğru cevapla işaretlendiğinden, tahmin edilen cevap ile mevcut sinir ağı modelinin doğru cevabı 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 ve 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. Eğitim modeli

Ş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 ardından bu veri noktalarını, train_step işlemini çalıştırmak için önceki yer tutucuların yerini alacak parametreler olarak kullanırız.

Az miktarda rastgele veriyle 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 ve 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 bir 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 arttı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şimsel sinir ağı, seviyeleri artan bir yapıdır. Temel fikir, piksellerin ve kenarların tanınmasından sonra yerel şekle ve son olarak genel algıya başlamaktı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 gibi önceden işlememiz gerekir ve evrişimli sinir ağları bu işlemi otomatikleştirir. Tabii ki 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 gelemeyen özelliklerdir. Dahası, çoklu dönüşüm katmanları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 basit ve anlaşılır olması 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ı vermesi garanti edilebilir. Ek olarak, görüntünün konumundan bağımsız olarak, aynı ağırlık seti kullanılır; bu, filtreyi bir el feneri olarak resim üzerinde ileri geri taramaya eşdeğerdir, bu da görüntü içeriğinin resimdeki konumunun yargılama sonucunu etkilememesini sağlar. Evrişimsel ağın bu özellikleri, parametre sayısını önemli ölçüde azaltırken, aynı zamanda görüntünün yapısal bilgilerini, görüntünün düşük seviyeden karmaşık özelliklerine, insan performansını bile aşabilecek şekilde çıkarmak için daha iyi 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 olacaktır ve çok katmanlı bir etkiye sahip olmayacaktır. 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, yani çıktıyı 0'dan küçük görmezden gelir, 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 (altörnekleme veya alt örnekleme) kullanır. Bunu, resmi uygun şekilde küçültmek, böylece belirli bir dereceye kadar fazla sığdırmayı kontrol etmek ve görüntü döndürme ve bozulmanın özellik çıkarımı üzerindeki etkisini azaltmak olarak anlayabiliriz, çünkü aşağı örnekleme sürecinde yön bilgisi bulanıklaşır. Evrişimsel sinir ağının, büyük veri hacmiyle görüntü tanıma probleminin boyutluluğunu başarılı bir şekilde azaltması ve nihayetinde eğitilmesini sağlaması, evrişim ve altörneklemedir. Alt örneklemeye genellikle maksimum havuzlama, ortalama havuzlama vb. Dahil evrişimli sinir ağlarında havuzlama denir. En yaygın olanlardan biri, giriş verilerini çakışmayan 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 başa çıkmak 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. Girdi orijinal resimdir, boyuttur ve renk gri tonlamalı olarak ifade edilir, yani veri türü böyledir. Toplu girdiye bakıldığında, verilerin 4 boyuta sahip olması gerekir. Filtre boyutu 32 özelliktir, dolayısıyla ağırlık W bir tensördür ve ofset b, 32 uzunluğunda bir vektördür. Ek olarak, çıktı görüntüsünün hala boyutta olmasını sağlamak için, görüntünün 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 0 gradyandan kaçınmak 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 boyutu, 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 yaptıktan 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 penceresinin 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 havuzlamasını gerçekleştirme işlevi tf.nn.max_pool'dur. Parametreleri tf.nn.conv2d'ye benzer, ancak ikinci parametrenin ağırlığı değil, girdi 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 bir 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 yaptıktan 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ğu için, hem giriş verileri 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 çok 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 parametre keep_prob 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ıyor ve MNIST verilerini örnek olarak alıyor ve Softmax modeline ve evrişimli sinir ağına dayalı makine öğrenimi ve derin öğrenme için TensorFlow'un nasıl kullanılacağını açıklı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 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 elinizde bir silah olabileceğine inanıyorum.

Referans malzemeleri:

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

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

3. "Merhaba, TensorFlow"

4. "TensorFlow Teknik Raporu" (Çeviri)

5. "Evrişimli Sinir Ağı"

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

Editör: Wen Jing

yazar hakkında

Wang Xiaojian Chongqing Üniversitesi'nden Bilgisayar Bilimleri Yüksek Lisansı, BT uzmanı, şu anda Chongqing'deki bir şirkette teknoloji araştırma ve geliştirme ve ekip yönetimi ile uğraşıyor.

Performans optimizasyonu, doğal dil işleme ve diğer teknolojilere odaklanarak, büyük veri depolama, dağıtılmış hesaplama, veri analizi ve makine öğrenimine büyük ilgi duyuyor.

Daha heyecan verici içerik için lütfen Tsinghua-Qingdao Veri Bilimi Enstitüsü "THU Data Pie" resmi WeChat kamu platformunu takip edin

Tatil drama dizisi 2018 Kore draması, düşük seviyeli insanların derin ve hassas yaşamlarına odaklanıyor
önceki
Eşitmak için 96 dakikalık sayaç! Süper Lig'deki 3-3 çekilişi çok dramatik.
Sonraki
Jiuding Dağı'ndaki Mianzhu Exposure'daki Vahşi Hayvanların "Yaşam Fotoğrafları"! Birçok insanın onu hiç görmediğine inanıyorum
Özel | Stack Overflow iş aramasına bir bakış
GIF- anında havaya uçuruldu! SIPG 4 dakikada 2 gol kaybetti, Yan Junling çaresizce iç çekti
"Getirmek" ten muhteşem bir şekilde döndü Yurt içi orijinal varyete şovlarının yurt dışına çıkması bekleniyor
GIF-2 oyunları 3 gol atıyor! Carrasco, Süper Lig'de en çok gol atanlar listesinde başı çekiyor, Altın Ayakkabı'nın en büyük kara atı çıkıyor
GIF-Lv Wenjun 30m Dünya Dalgası! Oscar Bears ile kutlayın, 4 maçta 3 gol atın
Özel | Hadoop'u bir makalede anlamak (4): İPLİK
Beyit, bu yıl on ikinci ayın 28'inde mi yayınlanacak? Gerçek ne?
Erken Kapitalizm | Double 11 Savaş Raporu: Tmall 213.5 milyar, 159.8 milyar JD, Suning% 132 arttı
Özel | Hadoop'u bir makalede anlamak (3): Mapreduce
Didi'ye satış yapmak sadece sahte bir atış. İnsansız sürüş Uber'in Çin'deki stratejisi mi?
Odak analizi | Xiaomi tanıdık gelmiyor, Lei Jun rahatlık alanından çıkıyor
To Top