TensorFlow - Mạng thần kinh chuyển đổi
Sau khi hiểu các khái niệm học máy, giờ đây chúng ta có thể chuyển trọng tâm sang các khái niệm học sâu. Học sâu là một bộ phận của học máy và được các nhà nghiên cứu coi là một bước quan trọng trong những thập kỷ gần đây. Các ví dụ về triển khai học sâu bao gồm các ứng dụng như nhận dạng hình ảnh và nhận dạng giọng nói.
Sau đây là hai loại mạng nơ-ron sâu quan trọng:
- Mạng thần kinh chuyển đổi
- Mạng thần kinh tái diễn
Trong chương này, chúng ta sẽ tập trung vào CNN, Mạng thần kinh chuyển đổi.
Mạng thần kinh chuyển đổi
Mạng Neural Convolutions được thiết kế để xử lý dữ liệu thông qua nhiều lớp mảng. Loại mạng nơ-ron này được sử dụng trong các ứng dụng như nhận dạng hình ảnh hoặc nhận dạng khuôn mặt. Sự khác biệt cơ bản giữa CNN và bất kỳ mạng nơ-ron thông thường nào khác là CNN nhận đầu vào là một mảng hai chiều và hoạt động trực tiếp trên hình ảnh thay vì tập trung vào việc trích xuất tính năng mà các mạng nơ-ron khác tập trung vào.
Cách tiếp cận chủ đạo của CNN bao gồm các giải pháp cho các vấn đề về nhận dạng. Các công ty hàng đầu như Google và Facebook đã đầu tư vào nghiên cứu và phát triển theo hướng các dự án công nhận để hoàn thành các hoạt động với tốc độ nhanh hơn.
Một mạng nơ-ron tích tụ sử dụng ba ý tưởng cơ bản:
- Các trường tương ứng địa phương
- Convolution
- Pooling
Hãy để chúng tôi hiểu những ý tưởng này một cách chi tiết.
CNN sử dụng các mối tương quan không gian tồn tại trong dữ liệu đầu vào. Mỗi lớp đồng thời của mạng nơ-ron kết nối một số nơ-ron đầu vào. Vùng cụ thể này được gọi là trường tiếp nhận cục bộ. Trường tiếp nhận cục bộ tập trung vào các tế bào thần kinh ẩn. Các nơ-ron ẩn xử lý dữ liệu đầu vào bên trong trường được đề cập không nhận ra những thay đổi bên ngoài ranh giới cụ thể.
Sau đây là biểu đồ biểu diễn tạo các trường tương ứng cục bộ:
Nếu chúng ta quan sát sự biểu diễn ở trên, mỗi kết nối học được một trọng số của nơ-ron ẩn với một kết nối liên quan với chuyển động từ lớp này sang lớp khác. Tại đây, các tế bào thần kinh riêng lẻ thực hiện sự thay đổi theo thời gian. Quá trình này được gọi là "tích chập".
Ánh xạ các kết nối từ lớp đầu vào đến bản đồ đối tượng ẩn được định nghĩa là "trọng số được chia sẻ" và thiên vị bao gồm được gọi là "thiên vị được chia sẻ".
CNN hoặc mạng nơ-ron tích hợp sử dụng các lớp gộp, là các lớp, được định vị ngay sau khai báo CNN. Nó lấy dữ liệu đầu vào từ người dùng dưới dạng một bản đồ tính năng xuất phát từ các mạng phức hợp và chuẩn bị một bản đồ tính năng cô đọng. Việc gộp các lớp giúp tạo các lớp với các nơ-ron của các lớp trước đó.
Triển khai TensorFlow của CNN
Trong phần này, chúng ta sẽ tìm hiểu về việc triển khai TensorFlow của CNN. Các bước, yêu cầu thực hiện và kích thước thích hợp của toàn bộ mạng, như được minh họa bên dưới -
Step 1 - Bao gồm các mô-đun cần thiết cho TensorFlow và các mô-đun tập dữ liệu, cần thiết để tính toán mô hình CNN.
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
Step 2 - Khai báo một hàm được gọi là run_cnn(), bao gồm các tham số và biến tối ưu hóa khác nhau với khai báo các trình giữ chỗ dữ liệu. Các biến tối ưu hóa này sẽ khai báo mẫu đào tạo.
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 - Trong bước này, chúng tôi sẽ khai báo các trình giữ chỗ dữ liệu huấn luyện với các tham số đầu vào - cho 28 x 28 pixel = 784. Đây là dữ liệu hình ảnh phẳng được lấy từ mnist.train.nextbatch().
Chúng tôi có thể định hình lại tensor theo yêu cầu của chúng tôi. Giá trị đầu tiên (-1) cho hàm biết để định hình động thứ nguyên đó dựa trên lượng dữ liệu được truyền vào nó. Hai kích thước giữa được đặt thành kích thước hình ảnh (tức là 28 x 28).
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 - Bây giờ điều quan trọng là tạo một số lớp phức hợp -
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- Hãy để chúng tôi làm phẳng đầu ra sẵn sàng cho giai đoạn đầu ra được kết nối đầy đủ - sau hai lớp của bước 2 gộp lại với kích thước 28 x 28, thành kích thước 14 x 14 hoặc tọa độ tối thiểu 7 x 7 x, y, nhưng với 64 các kênh đầu ra. Để tạo kết nối đầy đủ với lớp "dày đặc", hình dạng mới cần phải là [-1, 7 x 7 x 64]. Chúng ta có thể thiết lập một số trọng số và giá trị thiên vị cho lớp này, sau đó kích hoạt bằng ReLU.
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 - Một lớp khác với các kích hoạt softmax cụ thể với trình tối ưu hóa được yêu cầu xác định đánh giá độ chính xác, giúp thiết lập toán tử khởi tạo.
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- Chúng ta nên thiết lập các biến ghi. Điều này bổ sung một bản tóm tắt để lưu trữ độ chính xác của dữ liệu.
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()
Sau đây là kết quả được tạo bởi đoạn mã trên:
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.