Phân loại hình ảnh TensorFlow: CNN (Mạng thần kinh chuyển đổi)

Mục lục:

Anonim

Mạng Neural Convolutions là gì?

Mạng nơ-ron chuyển đổi, còn được gọi là chập hoặc CNN, là một phương pháp nổi tiếng trong các ứng dụng thị giác máy tính. Loại kiến ​​trúc này chiếm ưu thế trong việc nhận dạng các đối tượng từ một bức tranh hoặc video.

Trong hướng dẫn này, bạn sẽ học cách tạo một mạng chập và cách sử dụng TensorFlow để giải quyết tập dữ liệu viết tay.

Trong hướng dẫn này, bạn sẽ học

  • Mạng thần kinh hợp pháp
  • Kiến trúc của một mạng nơ-ron hợp pháp
  • Các thành phần của Convnets
  • Đào tạo CNN với TensorFlow
  • Bước 1: Tải lên tập dữ liệu
  • Bước 2: Lớp đầu vào
  • Bước 3: Lớp chuyển đổi
  • Bước 4: Lớp gộp
  • Bước 5: Lớp chuyển đổi thứ hai và lớp tổng hợp
  • Bước 6: Lớp dày đặc
  • Bước 7: Lớp đăng nhập

Kiến trúc của một mạng nơ-ron hợp pháp

Hãy nghĩ về Facebook cách đây vài năm, sau khi bạn tải một bức ảnh lên trang cá nhân của mình, bạn được yêu cầu thêm tên cho khuôn mặt trên ảnh theo cách thủ công. Ngày nay, Facebook sử dụng mạng chuyển đổi để tự động gắn thẻ bạn bè của bạn trong ảnh.

Một mạng nơ-ron tích tụ không khó hiểu lắm. Hình ảnh đầu vào được xử lý trong giai đoạn tích chập và sau đó được gán cho một nhãn.

Có thể tóm tắt một kiến ​​trúc chập điện điển hình trong hình bên dưới. Trước hết, một hình ảnh được đẩy lên mạng; đây được gọi là hình ảnh đầu vào. Sau đó, hình ảnh đầu vào trải qua vô số bước; đây là phần phức tạp của mạng. Cuối cùng, mạng nơ-ron có thể dự đoán chữ số trên hình ảnh.

Hình ảnh bao gồm một mảng pixel có chiều cao và chiều rộng. Hình ảnh thang độ xám chỉ có một kênh trong khi hình ảnh màu có ba kênh (mỗi kênh cho Đỏ, Xanh lục và Xanh lam). Một kênh được xếp chồng lên nhau. Trong hướng dẫn này, bạn sẽ sử dụng hình ảnh thang độ xám chỉ với một kênh. Mỗi pixel có giá trị từ 0 đến 255 để phản ánh cường độ của màu sắc. Ví dụ: pixel bằng 0 sẽ hiển thị màu trắng trong khi pixel có giá trị gần 255 sẽ tối hơn.

Hãy xem một hình ảnh được lưu trữ trong tập dữ liệu MNIST. Hình dưới đây cho thấy cách biểu diễn hình bên trái ở dạng ma trận. Lưu ý rằng, ma trận ban đầu đã được chuẩn hóa để nằm trong khoảng từ 0 đến 1. Đối với màu tối hơn, giá trị trong ma trận là khoảng 0,9 trong khi các pixel màu trắng có giá trị bằng 0.

Hoạt động hợp pháp

Thành phần quan trọng nhất trong mô hình là lớp chập. Phần này nhằm mục đích giảm kích thước của hình ảnh để tính toán trọng số nhanh hơn và cải thiện tính tổng quát của nó.

Trong phần phức tạp, mạng giữ các tính năng cần thiết của hình ảnh và loại trừ nhiễu không liên quan. Ví dụ: mô hình đang học cách nhận ra một con voi từ một bức ảnh với một ngọn núi ở hậu cảnh. Nếu bạn sử dụng mạng nơ-ron truyền thống, mô hình sẽ ấn định trọng số cho tất cả các pixel, bao gồm cả những pixel từ núi không cần thiết và có thể gây hiểu nhầm cho mạng.

Thay vào đó, một mạng nơ-ron phức hợp sẽ sử dụng một kỹ thuật toán học để chỉ trích xuất các pixel có liên quan nhất. Phép toán này được gọi là phép tích chập. Kỹ thuật này cho phép mạng tìm hiểu các tính năng ngày càng phức tạp ở mỗi lớp. Phép chập chia ma trận thành các phần nhỏ để tìm hiểu hầu hết các yếu tố cần thiết trong mỗi phần.

Các thành phần của Convnets

Có bốn thành phần của một Convnets

  1. Convolution
  2. Không tuyến tính (ReLU)
  3. Tổng hợp hoặc Lấy mẫu phụ
  4. Phân loại (Lớp được kết nối đầy đủ)
  • Convolution

Mục đích của phép tích chập là trích xuất cục bộ các đặc điểm của đối tượng trên ảnh. Nó có nghĩa là mạng sẽ học các mẫu cụ thể trong ảnh và có thể nhận ra nó ở mọi nơi trong ảnh.

Convolution là một phép nhân khôn ngoan nguyên tố. Khái niệm này rất dễ hiểu. Máy tính sẽ quét một phần của hình ảnh, thường có kích thước là 3x3 và nhân nó lên một bộ lọc. Đầu ra của phép nhân khôn ngoan phần tử được gọi là bản đồ đặc trưng. Bước này được lặp lại cho đến khi tất cả hình ảnh được quét. Lưu ý rằng, sau khi tích chập, kích thước của hình ảnh sẽ giảm xuống.

Dưới đây, có một URL để xem hoạt động của phép tích chập hoạt động như thế nào.

Có rất nhiều kênh có sẵn. Dưới đây, chúng tôi liệt kê một số kênh. Bạn có thể thấy rằng mỗi bộ lọc có một mục đích cụ thể. Lưu ý, trong hình dưới đây; Kernel là một từ đồng nghĩa của bộ lọc.

Nguồn

Số học đằng sau tích chập

Giai đoạn phức hợp sẽ áp dụng bộ lọc trên một mảng nhỏ các pixel trong hình ảnh. Bộ lọc sẽ di chuyển dọc theo hình ảnh đầu vào có hình dạng chung là 3x3 hoặc 5x5. Nó có nghĩa là mạng sẽ trượt các cửa sổ này trên tất cả các hình ảnh đầu vào và tính tích chập. Hình ảnh dưới đây cho thấy cách hoạt động của tích chập. Kích thước của bản vá là 3x3 và ma trận đầu ra là kết quả của hoạt động khôn ngoan giữa ma trận hình ảnh và bộ lọc.

Nguồn

Bạn nhận thấy rằng chiều rộng và chiều cao của đầu ra có thể khác với chiều rộng và chiều cao của đầu vào. Nó xảy ra do hiệu ứng đường viền.

Hiệu ứng viền

Hình ảnh có bản đồ tính năng 5x5 và bộ lọc 3x3. Chỉ có một cửa sổ ở trung tâm nơi bộ lọc có thể hiển thị lưới 3x3. Bản đồ tính năng đầu ra sẽ thu nhỏ theo hai ô cùng với kích thước 3x3.

Để có cùng thứ nguyên đầu ra với thứ nguyên đầu vào, bạn cần thêm phần đệm. Phần đệm bao gồm việc thêm đúng số hàng và cột trên mỗi mặt của ma trận. Nó sẽ cho phép tích chập để khớp với mọi ô đầu vào. Trong hình ảnh dưới đây, ma trận đầu vào / đầu ra có cùng kích thước 5x5

Khi bạn xác định mạng, các tính năng được biến đổi được kiểm soát bởi ba tham số:

  1. Độ sâu: Nó xác định số lượng bộ lọc để áp dụng trong quá trình tích chập. Trong ví dụ trước, bạn đã thấy độ sâu là 1, nghĩa là chỉ một bộ lọc được sử dụng. Trong hầu hết các trường hợp, có nhiều hơn một bộ lọc. Hình dưới đây cho thấy các thao tác được thực hiện trong một tình huống có ba bộ lọc

  1. Stride: Nó xác định số "bước nhảy của pixel" giữa hai lát. Nếu sải chân bằng 1, các cửa sổ sẽ di chuyển với độ trải của một pixel. Nếu sải chân bằng hai, các cửa sổ sẽ nhảy thêm 2 pixel. Nếu bạn tăng khoảng cách, bạn sẽ có các bản đồ tính năng nhỏ hơn.

Ví dụ sải chân 1

Bước hình ảnh 2

  1. Zero-padding: Khoảng đệm là thao tác thêm một số hàng và cột tương ứng vào mỗi bên của bản đồ đối tượng địa lý đầu vào. Trong trường hợp này, đầu ra có cùng thứ nguyên với đầu vào.
  2. Không tuyến tính (ReLU)

Khi kết thúc hoạt động tích chập, đầu ra phải tuân theo một hàm kích hoạt để cho phép tính phi tuyến tính. Chức năng kích hoạt thông thường cho mạng chuyển đổi là Relu. Tất cả pixel có giá trị âm sẽ được thay thế bằng 0.

  • Hoạt động gộp tối đa

Bước này rất dễ hiểu. Mục đích của việc gộp là để giảm kích thước của hình ảnh đầu vào. Các bước được thực hiện để giảm độ phức tạp tính toán của hoạt động. Bằng cách giảm kích thước, mạng có trọng số thấp hơn để tính toán, vì vậy nó ngăn chặn việc trang bị quá mức.

Trong giai đoạn này, bạn cần xác định kích thước và sải chân. Một cách tiêu chuẩn để gộp hình ảnh đầu vào là sử dụng giá trị tối đa của bản đồ đối tượng. Nhìn vào hình ảnh dưới đây. "Tổng hợp" sẽ hiển thị bốn ma trận con của bản đồ đối tượng 4x4 và trả về giá trị lớn nhất. Việc tổng hợp lấy giá trị lớn nhất của một mảng 2x2 và sau đó di chuyển các cửa sổ này đi hai pixel. Ví dụ: ma trận con đầu tiên là [3,1,3,2], phép gộp sẽ trả về giá trị lớn nhất, là 3.

Có một hoạt động gộp khác chẳng hạn như giá trị trung bình.

Thao tác này làm giảm kích thước của bản đồ đối tượng một cách mạnh mẽ

  • Các lớp được kết nối đầy đủ

Bước cuối cùng bao gồm xây dựng một mạng nơ-ron nhân tạo truyền thống như bạn đã làm trong hướng dẫn trước. Bạn kết nối tất cả các nơ-ron từ lớp trước với lớp tiếp theo. Bạn sử dụng chức năng kích hoạt softmax để phân loại số trên hình ảnh đầu vào.

Tóm tắt:

Mạng Neural Convolutional biên dịch các lớp khác nhau trước khi đưa ra dự đoán. Mạng nơron có:

  • Một lớp phức hợp
  • Chức năng kích hoạt Relu
  • Lớp gộp
  • Lớp kết nối dày đặc

Các lớp phức hợp áp dụng các bộ lọc khác nhau trên một tiểu vùng của hình ảnh. Chức năng kích hoạt Relu thêm tính không tuyến tính và các lớp gộp làm giảm kích thước của bản đồ đối tượng địa lý.

Tất cả các lớp này trích xuất thông tin cần thiết từ hình ảnh. Cuối cùng, bản đồ đối tượng địa lý được cung cấp cho một lớp chính được kết nối đầy đủ với chức năng softmax để đưa ra dự đoán.

Đào tạo CNN với TensorFlow

Bây giờ bạn đã quen thuộc với khối xây dựng của một chuyển đổi, bạn đã sẵn sàng để xây dựng một chuyển đổi với TensorFlow. Chúng tôi sẽ sử dụng tập dữ liệu MNIST để phân loại hình ảnh.

Việc chuẩn bị dữ liệu giống như hướng dẫn trước. Bạn có thể chạy mã và chuyển trực tiếp đến kiến ​​trúc của CNN.

Bạn sẽ làm theo các bước sau:

Bước 1: Tải lên tập dữ liệu

Bước 2: Lớp đầu vào

Bước 3: Lớp chuyển đổi

Bước 4: Lớp gộp

Bước 5: Lớp chuyển đổi thứ hai và lớp tổng hợp

Bước 6: Lớp dày đặc

Bước 7: Lớp đăng nhập

Bước 1: Tải lên tập dữ liệu

Tập dữ liệu MNIST có sẵn với scikit để tìm hiểu tại URL này. Vui lòng tải xuống và lưu trữ trong Tải xuống. Bạn có thể tải nó lên với fetch_mldata ('MNIST gốc').

Tạo một đoàn tàu / thử nghiệm

Bạn cần tách tập dữ liệu với train_test_split

Quy mô các tính năng

Cuối cùng, bạn có thể mở rộng tính năng với MinMaxScaler

import numpy as npimport tensorflow as tffrom sklearn.datasets import fetch_mldata#Change USERNAME by the username of your machine## Windows USERmnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original')## Mac Usermnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original')print(mnist.data.shape)print(mnist.target.shape)from sklearn.model_selection import train_test_splitX_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 )## resclaefrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()# TrainX_train_scaled = scaler.fit_transform(X_train.astype(np.float64))# testX_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:]

Xác định CNN

CNN sử dụng các bộ lọc trên pixel thô của một hình ảnh để tìm hiểu mẫu chi tiết so với mẫu toàn cầu bằng mạng thần kinh truyền thống. Để tạo CNN, bạn cần xác định:

  1. Một lớp phức hợp: Áp dụng n số bộ lọc cho bản đồ đối tượng địa lý. Sau khi tích chập, bạn cần sử dụng chức năng kích hoạt Relu để thêm tính không tuyến tính vào mạng.
  2. Lớp gộp: Bước tiếp theo sau khi tích chập là giảm mẫu tối đa của đối tượng địa lý. Mục đích là để giảm kích thước của bản đồ đối tượng để tránh trang bị quá nhiều và cải thiện tốc độ tính toán. Tổng hợp tối đa là kỹ thuật thông thường, chia các bản đồ đối tượng địa lý thành các tiểu vùng (thường có kích thước 2x2) và chỉ giữ lại các giá trị lớn nhất.
  3. Các lớp được kết nối đầy đủ: Tất cả các nơ-ron từ các lớp trước được kết nối với các lớp tiếp theo. CNN sẽ phân loại nhãn theo các đặc điểm từ các lớp phức hợp và giảm dần theo lớp tổng hợp.

CNN kiến ​​trúc

  • Lớp Convolutions: Áp dụng 14 bộ lọc 5x5 (trích xuất các vùng con 5x5 pixel), với chức năng kích hoạt ReLU
  • Lớp tổng hợp: Thực hiện tổng hợp tối đa với bộ lọc 2x2 và khoảng cách là 2 (chỉ định rằng các vùng được tổng hợp không chồng chéo)
  • Lớp chuyển đổi: Áp dụng 36 bộ lọc 5x5, với chức năng kích hoạt ReLU
  • Lớp tổng hợp # 2: Một lần nữa, thực hiện tổng hợp tối đa với bộ lọc 2x2 và bước tiến là 2
  • 1.764 tế bào thần kinh, với tỷ lệ bỏ học thường xuyên là 0,4 (xác suất 0,4 rằng bất kỳ phần tử nhất định nào sẽ bị loại bỏ trong quá trình đào tạo)
  • Lớp dày đặc (Logits Layer): 10 tế bào thần kinh, một cho mỗi lớp mục tiêu chữ số (0-9).

Có ba mô-đun quan trọng cần sử dụng để tạo CNN:

  • đối tượng (). Xây dựng một lớp tích chập hai chiều với số lượng bộ lọc, kích thước hạt nhân bộ lọc, phần đệm và hàm kích hoạt làm đối số.
  • max_pooling2d (). Xây dựng lớp tổng hợp hai chiều bằng cách sử dụng thuật toán tổng hợp tối đa.
  • ngu độn(). Xây dựng một lớp dày đặc với các lớp và đơn vị ẩn

Bạn sẽ xác định một chức năng để xây dựng CNN. Chúng ta hãy xem chi tiết cách xây dựng từng khối xây dựng trước để kết hợp mọi thứ lại với nhau trong chức năng.

Bước 2: Lớp đầu vào

def cnn_model_fn(features, labels, mode):input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

Bạn cần xác định một tensor với hình dạng của dữ liệu. Đối với điều đó, bạn có thể sử dụng mô-đun tf.reshape. Trong mô-đun này, bạn cần khai báo tensor để định hình lại và hình dạng của tensor. Đối số đầu tiên là các tính năng của dữ liệu, được định nghĩa trong đối số của hàm.

Hình ảnh có chiều cao, chiều rộng và kênh. Tập dữ liệu MNIST là một bức ảnh đơn sắc có kích thước 28x28. Chúng tôi đặt kích thước lô thành -1 trong đối số hình dạng để nó có hình dạng của các đối tượng ["x"]. Ưu điểm là làm cho các siêu tham số kích thước lô để điều chỉnh. Nếu kích thước lô được đặt thành 7, thì tensor sẽ cung cấp 5.488 giá trị (28 * 28 * 7).

Step 3: Convolutional layer
# first Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=14,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)

Lớp chập đầu tiên có 14 bộ lọc với kích thước hạt nhân là 5x5 với cùng một vùng đệm. Phần đệm giống nhau có nghĩa là cả tensor đầu ra và tensor đầu vào phải có cùng chiều cao và chiều rộng. Tensorflow sẽ thêm số không vào các hàng và cột để đảm bảo có cùng kích thước.

Bạn sử dụng chức năng kích hoạt Relu. Kích thước đầu ra sẽ là [28, 28, 14].

Bước 4: Lớp gộp

Bước tiếp theo sau phép tích chập là tính toán gộp. Tính toán gộp sẽ làm giảm kích thước của dữ liệu. Bạn có thể sử dụng mô-đun max_pooling2d với kích thước 2x2 và sải chân là 2. Bạn sử dụng lớp trước đó làm đầu vào. Kích thước đầu ra sẽ là [batch_size, 14, 14, 14]

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

Bước 5: Lớp chuyển đổi thứ hai và lớp tổng hợp

Lớp chập thứ hai có 32 bộ lọc, với kích thước đầu ra là [batch_size, 14, 14, 32]. Lớp gộp có cùng kích thước như trước và hình dạng đầu ra là [batch_size, 14, 14, 18].

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)

Bước 6: Lớp dày đặc

Sau đó, bạn cần xác định lớp được kết nối đầy đủ. Bản đồ đối tượng địa lý phải được làm phẳng trước khi được kết nối với lớp dày đặc. Bạn có thể sử dụng định hình lại mô-đun với kích thước 7 * 7 * 36.

Lớp dày đặc sẽ kết nối 1764 tế bào thần kinh. Bạn thêm chức năng kích hoạt Relu. Bên cạnh đó, bạn thêm điều khoản quy định bỏ học với tỷ lệ 0,3, nghĩa là 30 phần trăm trọng số sẽ được đặt thành 0. Lưu ý rằng, việc bỏ học chỉ diễn ra trong giai đoạn đào tạo. Hàm cnn_model_fn có một chế độ đối số để khai báo nếu mô hình cần được đào tạo hoặc để đánh giá.

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)

Bước 7: Lớp đăng nhập

Cuối cùng, bạn có thể xác định lớp cuối cùng với dự đoán của mô hình. Hình dạng đầu ra bằng với kích thước lô và 10, tổng số hình ảnh.

# Logits Layerlogits = tf.layers.dense(inputs=dropout, units=10) 

Bạn có thể tạo một từ điển chứa các lớp và xác suất của mỗi lớp. Mô-đun tf.argmax () với trả về giá trị cao nhất nếu các lớp logit. Hàm softmax trả về xác suất của mỗi lớp.

predictions = {# Generate predictions"classes": tf.argmax(input=logits, axis=1),"probabilities": tf.nn.softmax(logits, name="softmax_tensor") }

Bạn chỉ muốn trả về dự đoán nhị nguyên khi chế độ được đặt thành dự đoán. Bạn thêm mã này để loại bỏ các dự đoán

if mode == tf.estimator.ModeKeys.PREDICT:return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

Bước tiếp theo bao gồm tính toán tổn thất của mô hình. Trong hướng dẫn cuối cùng, bạn đã biết rằng hàm mất mát cho mô hình đa thủy tinh là entropy chéo. Sự mất mát được tính toán dễ dàng bằng đoạn mã sau:

# Calculate Loss (for both TRAIN and EVAL modes)loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

Bước cuối cùng là tối ưu hóa mô hình, tức là tìm các giá trị tốt nhất của các trọng số. Đối với điều đó, bạn sử dụng trình tối ưu hóa Gradient descent với tốc độ học là 0,001. Mục tiêu là giảm thiểu tổn thất

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

Bạn đã hoàn thành với CNN. Tuy nhiên, bạn muốn hiển thị số liệu hiệu suất trong chế độ đánh giá. Số liệu hiệu suất cho mô hình đa lớp là số liệu về độ chính xác. Tensorflow được trang bị độ chính xác của mô-đun với hai đối số, nhãn và giá trị dự đoán.

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)

Đó là nó. Bạn đã tạo CNN đầu tiên của mình và bạn đã sẵn sàng gói mọi thứ thành một hàm để sử dụng nó để đào tạo và đánh giá mô hình.

def cnn_model_fn(features, labels, mode):"""Model function for CNN."""# Input Layerinput_layer = tf.reshape(features["x"], [-1, 28, 28, 1])# Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=32,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)# Pooling Layerpool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)# Convolutional Layer #2 and Pooling Layerconv2 = 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 Layerpool2_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 Layerlogits = 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 Lossloss = 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 modeeval_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)

Các bước bên dưới giống như các bài hướng dẫn trước.

Trước hết, bạn xác định một công cụ ước tính với mô hình CNN.

# Create the Estimatormnist_classifier = tf.estimator.Estimator(model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")

Một CNN mất nhiều lần để đào tạo, do đó, bạn tạo một móc ghi nhật ký để lưu trữ các giá trị của các lớp softmax sau mỗi 50 lần lặp.

# Set up logging for predictionstensors_to_log = {"probabilities": "softmax_tensor"}logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)

Bạn đã sẵn sàng để ước tính mô hình. Bạn đặt kích thước lô là 100 và xáo trộn dữ liệu. Lưu ý rằng chúng tôi đặt các bước đào tạo là 16.000, có thể mất rất nhiều thời gian để đào tạo. Kiên nhẫn.

# Train the modeltrain_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])

Bây giờ mô hình đã được đào tạo, bạn có thể đánh giá nó và in kết quả

# Evaluate the model and print resultseval_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:41INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56INFO: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}

Với kiến ​​trúc hiện tại, bạn có độ chính xác là 97%. Bạn có thể thay đổi kiến ​​trúc, kích thước lô và số lần lặp để cải thiện độ chính xác. Mạng nơ-ron CNN đã hoạt động tốt hơn nhiều so với ANN hoặc hồi quy logistic. Trong hướng dẫn về mạng nơ-ron nhân tạo, bạn có độ chính xác là 96%, thấp hơn CNN. Các màn trình diễn của CNN là ấn tượng với một hình ảnh lớn hơn bộ , cả về mặt tính toán tốc độ và độ chính xác.

Tóm lược

Một mạng nơ-ron phức hợp hoạt động rất tốt để đánh giá hình ảnh. Loại kiến ​​trúc này chiếm ưu thế trong việc nhận dạng các đối tượng từ một bức tranh hoặc video.

Để xây dựng một CNN, bạn cần làm theo sáu bước:

Bước 1: Lớp đầu vào:

Bước này định hình lại dữ liệu. Hình dạng bằng căn bậc hai của số pixel. Ví dụ: nếu một hình ảnh có 156 pixel, thì hình dạng đó là 26x26. Bạn cần xác định rõ bức tranh có màu sắc hay không. Nếu có, thì bạn đã có 3 cho hình dạng- 3 cho RGB-, nếu không thì 1.

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

Bước 2: Lớp chuyển đổi

Tiếp theo, bạn cần tạo các lớp phức hợp. Bạn áp dụng các bộ lọc khác nhau để cho phép mạng tìm hiểu tính năng quan trọng. Bạn chỉ định kích thước của hạt nhân và số lượng bộ lọc.

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

Bước 3: Lớp gộp

Trong bước thứ ba, bạn thêm một lớp gộp. Lớp này giảm kích thước của đầu vào. Nó làm như vậy bằng cách lấy giá trị lớn nhất của ma trận con. Ví dụ: nếu ma trận con là [3,1,3,2], việc gộp sẽ trả về giá trị lớn nhất, là 3.

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

Bước 4: Thêm Lớp kết hợp và Lớp tổng hợp

Trong bước này, bạn có thể thêm bao nhiêu tùy ý các lớp đối tượng và các lớp tổng hợp. Google sử dụng kiến ​​trúc với hơn 20 lớp chuyển đổi.

Bước 5: Lớp dày đặc

Bước 5 làm phẳng phần trước để tạo các lớp được kết nối hoàn chỉnh. Trong bước này, bạn có thể sử dụng chức năng kích hoạt khác nhau và thêm hiệu ứng bỏ cuộc.

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)

Bước 6: Lớp đăng nhập

Bước cuối cùng là dự đoán.

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