TensorFlow - Evrişimli Sinir Ağları
Makine öğrenimi kavramlarını anladıktan sonra, şimdi odak noktamızı derin öğrenme kavramlarına kaydırabiliriz. Derin öğrenme, makine öğreniminin bir bölümüdür ve araştırmacılar tarafından son yıllarda atılan çok önemli bir adım olarak kabul edilmektedir. Derin öğrenme uygulamasının örnekleri, görüntü tanıma ve konuşma tanıma gibi uygulamaları içerir.
Aşağıda iki önemli derin sinir ağı türü verilmiştir:
- Evrişimli Sinir Ağları
- Tekrarlayan Sinir Ağları
Bu bölümde, CNN, Convolutional Neural Networks'e odaklanacağız.
Evrişimli Sinir Ağları
Evrişimli Sinir ağları, verileri birden çok dizi katmanı aracılığıyla işlemek için tasarlanmıştır. Bu tür sinir ağları, görüntü tanıma veya yüz tanıma gibi uygulamalarda kullanılır. CNN ile diğer herhangi bir sıradan sinir ağı arasındaki temel fark, CNN'nin girdiyi iki boyutlu bir dizi olarak alması ve diğer sinir ağlarının odaklandığı özellik çıkarımına odaklanmak yerine doğrudan görüntüler üzerinde çalışmasıdır.
CNN'in baskın yaklaşımı, tanıma sorunlarına yönelik çözümleri içerir. Google ve Facebook gibi önde gelen şirketler, faaliyetleri daha hızlı yapmak için tanıma projelerine yönelik araştırma ve geliştirmeye yatırım yaptı.
Evrişimli bir sinir ağı üç temel fikir kullanır -
- Yerel ilgili alanlar
- Convolution
- Pooling
Bu fikirleri detaylı olarak anlayalım.
CNN, giriş verilerinde bulunan uzamsal korelasyonları kullanır. Bir sinir ağının her eşzamanlı katmanı bazı giriş nöronlarını birbirine bağlar. Bu belirli bölgeye yerel alıcı alan denir. Yerel alıcı alan, gizli nöronlara odaklanır. Gizli nöronlar, belirli sınırların dışındaki değişiklikleri fark etmeden belirtilen alanın içindeki giriş verilerini işler.
Aşağıda, yerel ilgili alanların oluşturulmasının bir şema gösterimi verilmiştir -
Yukarıdaki temsili gözlemlersek, her bağlantı, bir katmandan diğerine hareketle ilişkili bir bağlantıyla birlikte gizli nöronun ağırlığını öğrenir. Burada, bireysel nöronlar zaman zaman bir değişiklik yapar. Bu sürece "evrişim" denir.
Giriş katmanından gizli özellik haritasına bağlantıların eşlenmesi "paylaşılan ağırlıklar" olarak tanımlanır ve dahil edilen önyargı "paylaşılan önyargı" olarak adlandırılır.
CNN veya evrişimli sinir ağları, CNN bildiriminden hemen sonra konumlandırılan katmanlar olan havuzlama katmanlarını kullanır. Kullanıcıdan gelen girdiyi, evrişimli ağlardan gelen bir özellik haritası olarak alır ve yoğunlaştırılmış bir özellik haritası hazırlar. Katmanları havuzlamak, önceki katmanların nöronlarıyla katman oluşturmaya yardımcı olur.
CNN'nin TensorFlow Uygulaması
Bu bölümde, CNN'nin TensorFlow uygulamasını öğreneceğiz. Tüm ağın yürütülmesini ve uygun boyutlandırılmasını gerektiren adımlar aşağıda gösterildiği gibidir -
Step 1 - TensorFlow için gerekli modülleri ve CNN modelini hesaplamak için gerekli olan veri seti modüllerini dahil edin.
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
Step 2 - adlı bir işlevi bildirin run_cnn(), veri yer tutucularının bildirimi ile çeşitli parametreleri ve optimizasyon değişkenlerini içeren. Bu optimizasyon değişkenleri eğitim modelini açıklayacaktır.
def run_cnn():
mnist = input_data.read_data_sets("MNIST_data/", one_hot = True)
learning_rate = 0.0001
epochs = 10
batch_size = 50
Step 3 - Bu adımda, eğitim verisi yer tutucularını 28 x 28 piksel = 784 için girdi parametreleriyle ilan edeceğiz. Bu, mnist.train.nextbatch().
Gereksinimlerimize göre tensörü yeniden şekillendirebiliriz. İlk değer (-1), işleve bu boyutu kendisine iletilen veri miktarına göre dinamik olarak şekillendirmesini söyler. İki orta boyut, görüntü boyutuna (yani 28 x 28) ayarlanır.
x = tf.placeholder(tf.float32, [None, 784])
x_shaped = tf.reshape(x, [-1, 28, 28, 1])
y = tf.placeholder(tf.float32, [None, 10])
Step 4 - Şimdi bazı evrişimli katmanlar oluşturmak önemlidir -
layer1 = create_new_conv_layer(x_shaped, 1, 32, [5, 5], [2, 2], name = 'layer1')
layer2 = create_new_conv_layer(layer1, 32, 64, [5, 5], [2, 2], name = 'layer2')
Step 5- Çıktıyı tam olarak bağlı çıktı aşaması için hazır hale getirelim - 28 x 28 boyutlarında, 14 x 14 boyutuna veya minimum 7 x 7 x, y koordinatlarına, ancak 64 çıkış kanalları. "Yoğun" katmanla tam bağlantılı oluşturmak için, yeni şeklin [-1, 7 x 7 x 64] olması gerekir. Bu katman için bazı ağırlıklar ve önyargı değerleri ayarlayabilir, ardından ReLU ile etkinleştirebiliriz.
flattened = tf.reshape(layer2, [-1, 7 * 7 * 64])
wd1 = tf.Variable(tf.truncated_normal([7 * 7 * 64, 1000], stddev = 0.03), name = 'wd1')
bd1 = tf.Variable(tf.truncated_normal([1000], stddev = 0.01), name = 'bd1')
dense_layer1 = tf.matmul(flattened, wd1) + bd1
dense_layer1 = tf.nn.relu(dense_layer1)
Step 6 - Gerekli optimize edici ile belirli softmax etkinleştirmelerine sahip başka bir katman, başlatma operatörünün kurulumunu yapan doğruluk değerlendirmesini tanımlar.
wd2 = tf.Variable(tf.truncated_normal([1000, 10], stddev = 0.03), name = 'wd2')
bd2 = tf.Variable(tf.truncated_normal([10], stddev = 0.01), name = 'bd2')
dense_layer2 = tf.matmul(dense_layer1, wd2) + bd2
y_ = tf.nn.softmax(dense_layer2)
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(logits = dense_layer2, labels = y))
optimiser = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
init_op = tf.global_variables_initializer()
Step 7- Kayıt değişkenlerini ayarlamalıyız. Bu, verilerin doğruluğunu saklamak için bir özet ekler.
tf.summary.scalar('accuracy', accuracy)
merged = tf.summary.merge_all()
writer = tf.summary.FileWriter('E:\TensorFlowProject')
with tf.Session() as sess:
sess.run(init_op)
total_batch = int(len(mnist.train.labels) / batch_size)
for epoch in range(epochs):
avg_cost = 0
for i in range(total_batch):
batch_x, batch_y = mnist.train.next_batch(batch_size = batch_size)
_, c = sess.run([optimiser, cross_entropy], feed_dict = {
x:batch_x, y: batch_y})
avg_cost += c / total_batch
test_acc = sess.run(accuracy, feed_dict = {x: mnist.test.images, y:
mnist.test.labels})
summary = sess.run(merged, feed_dict = {x: mnist.test.images, y:
mnist.test.labels})
writer.add_summary(summary, epoch)
print("\nTraining complete!")
writer.add_graph(sess.graph)
print(sess.run(accuracy, feed_dict = {x: mnist.test.images, y:
mnist.test.labels}))
def create_new_conv_layer(
input_data, num_input_channels, num_filters,filter_shape, pool_shape, name):
conv_filt_shape = [
filter_shape[0], filter_shape[1], num_input_channels, num_filters]
weights = tf.Variable(
tf.truncated_normal(conv_filt_shape, stddev = 0.03), name = name+'_W')
bias = tf.Variable(tf.truncated_normal([num_filters]), name = name+'_b')
#Out layer defines the output
out_layer =
tf.nn.conv2d(input_data, weights, [1, 1, 1, 1], padding = 'SAME')
out_layer += bias
out_layer = tf.nn.relu(out_layer)
ksize = [1, pool_shape[0], pool_shape[1], 1]
strides = [1, 2, 2, 1]
out_layer = tf.nn.max_pool(
out_layer, ksize = ksize, strides = strides, padding = 'SAME')
return out_layer
if __name__ == "__main__":
run_cnn()
Yukarıdaki kod tarafından üretilen çıktı aşağıdadır -
See @{tf.nn.softmax_cross_entropy_with_logits_v2}.
2018-09-19 17:22:58.802268: I
T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140]
Your CPU supports instructions that this TensorFlow binary was not compiled to
use: AVX2
2018-09-19 17:25:41.522845: W
T:\src\github\tensorflow\tensorflow\core\framework\allocator.cc:101] Allocation
of 1003520000 exceeds 10% of system memory.
2018-09-19 17:25:44.630941: W
T:\src\github\tensorflow\tensorflow\core\framework\allocator.cc:101] Allocation
of 501760000 exceeds 10% of system memory.
Epoch: 1 cost = 0.676 test accuracy: 0.940
2018-09-19 17:26:51.987554: W
T:\src\github\tensorflow\tensorflow\core\framework\allocator.cc:101] Allocation
of 1003520000 exceeds 10% of system memory.