tek4

Phát Triển Mô Hình Mạng Neural Tích Chập – Keras Cơ Bản

by - September. 26, 2021
Học
Kiến thức
Machine Learning
<p style="text-align: justify;">Ch&agrave;o mừng c&aacute;c bạn quay trở lại với loạt b&agrave;i về&nbsp;<a href="../../../keras-co-ban-bat-dau-hoc-sau-voi-tf-keras/" target="_blank" rel="noopener">Keras Cơ Bản</a>&nbsp;của<a href="../../../" target="_blank" rel="noopener">&nbsp;tek4.vn</a>. Như ti&ecirc;u đề của b&agrave;i viết, trong b&agrave;i n&agrave;y ch&uacute;ng ta sẽ c&ugrave;ng nhau t&igrave;m hiểu về c&aacute;ch ph&aacute;t triển m&ocirc; h&igrave;nh mạng neural t&iacute;ch chập. Bắt đầu th&ocirc;i!</p> <p style="text-align: justify;">Xem th&ecirc;m b&agrave;i viết trước:&nbsp;<a href="../../../phat-trien-cac-mo-hinh-multilayer-perceptron-keras-co-ban/" target="_blank" rel="noopener">Ph&aacute;t Triển C&aacute;c M&ocirc; H&igrave;nh Multilayer Perceptron</a>.</p> <p><img style="width: 657px; display: block; margin-left: auto; margin-right: auto;" src="http://tek4vn.2soft.top/public_files/47-png" alt="47" height="341" /></p> <p style="text-align: justify;">Mạng Neural t&iacute;ch chập, hay gọi tắt l&agrave; CNN, l&agrave; một loại mạng được thiết kế cho đầu v&agrave;o l&agrave; c&aacute;c h&igrave;nh ảnh.</p> <p style="text-align: justify;">Ch&uacute;ng bao gồm c&aacute;c m&ocirc; h&igrave;nh với c&aacute;c convolutional layers tr&iacute;ch xuất c&aacute;c đặc trưng (được gọi l&agrave; feature maps) v&agrave; c&aacute;c &nbsp;pooling layers chắt lọc c&aacute;c đặc trưng th&agrave;nh c&aacute;c yếu tố nổi bật nhất.</p> <p style="text-align: justify;">CNNs ph&ugrave; hợp nhất với c&aacute;c nhiệm vụ ph&acirc;n loại h&igrave;nh ảnh, mặc d&ugrave; ch&uacute;ng c&oacute; thể được sử dụng cho một loạt c&aacute;c nhiệm vụ lấy h&igrave;nh ảnh l&agrave;m đầu v&agrave;o.</p> <p style="text-align: justify;">Một nhiệm vụ ph&acirc;n loại h&igrave;nh ảnh phổ biến l&agrave; ph&acirc;n loại&nbsp;<a href="https://en.wikipedia.org/wiki/MNIST_database" target="_blank" rel="noopener">chữ số viết tay MNIST</a>. N&oacute; li&ecirc;n quan đến h&agrave;ng chục ngh&igrave;n chữ số viết tay phải được ph&acirc;n loại l&agrave; một số từ 0 đến 9.</p> <p style="text-align: justify;">API tf.keras cung cấp một h&agrave;m tiện lợi để tải xuống v&agrave; load trực tiếp tập dữ liệu n&agrave;y.</p> <p style="text-align: justify;">V&iacute; dụ b&ecirc;n dưới load tập dữ liệu v&agrave; vẽ một v&agrave;i h&igrave;nh ảnh đầu ti&ecirc;n.</p> <pre class="language-python"><code># example of loading and plotting the mnist dataset from tensorflow.keras.datasets.mnist import load_data from matplotlib import pyplot # load dataset (trainX, trainy), (testX, testy) = load_data() # summarize loaded dataset print('Train: X=%s, y=%s' % (trainX.shape, trainy.shape)) print('Test: X=%s, y=%s' % (testX.shape, testy.shape)) # plot first few images for i in range(25): # define subplot pyplot.subplot(5, 5, i+1) # plot raw pixel data pyplot.imshow(trainX[i], cmap=pyplot.get_cmap('gray')) # show the figure pyplot.show()</code></pre> <p style="text-align: justify;">Chạy v&iacute; dụ sẽ load tập dữ liệu MNIST, sau đ&oacute; t&oacute;m tắt tập dữ liệu test v&agrave; train mặc định.</p> <pre class="language-python"><code>Train: X=(60000, 28, 28), y=(60000,) Test: X=(10000, 28, 28), y=(10000,)</code></pre> <p style="text-align: justify;">Sau đ&oacute;, một biểu đồ được tạo hiển thị một dưới dạng lưới c&aacute;c v&iacute; dụ về h&igrave;nh ảnh viết tay trong tập dữ liệu đ&agrave;o tạo.</p> <p><img style="width: 694px; display: block; margin-left: auto; margin-right: auto;" src="http://tek4vn.2soft.top/public_files/47_1-png" alt="47_1" height="522" /></p> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể đ&agrave;o tạo một m&ocirc; h&igrave;nh CNN để ph&acirc;n loại c&aacute;c h&igrave;nh ảnh trong tập dữ liệu MNIST.</p> <p style="text-align: justify;">Lưu &yacute; rằng h&igrave;nh ảnh l&agrave; mảng dữ liệu pixel thang độ x&aacute;m. Do đ&oacute;, ch&uacute;ng ta phải th&ecirc;m channel dimension v&agrave;o dữ liệu trước khi c&oacute; thể sử dụng h&igrave;nh ảnh l&agrave;m đầu v&agrave;o cho m&ocirc; h&igrave;nh. L&yacute; do l&agrave; c&aacute;c m&ocirc; h&igrave;nh CNN mong đợi h&igrave;nh ảnh ở định dạng channels-last, tức l&agrave; mỗi v&iacute; dụ cho mạng c&oacute; shape [h&agrave;ng, cột, k&ecirc;nh], trong đ&oacute; c&aacute;c k&ecirc;nh đại diện cho c&aacute;c k&ecirc;nh m&agrave;u của dữ liệu h&igrave;nh ảnh.</p> <p style="text-align: justify;">Bạn cũng n&ecirc;n chia tỷ lệ c&aacute;c gi&aacute; trị pixel từ phạm vi mặc định l&agrave; 0-255 th&agrave;nh 0-1 khi đ&agrave;o tạo CNN.</p> <p style="text-align: justify;">Dưới đ&acirc;y l&agrave; v&iacute; dụ đầy đủ về việc điều chỉnh v&agrave; đ&aacute;nh gi&aacute; m&ocirc; h&igrave;nh CNN tr&ecirc;n tập dữ liệu MNIST.</p> <pre class="language-python"><code># example of a cnn for image classification from numpy import asarray from numpy import unique from numpy import argmax from tensorflow.keras.datasets.mnist import load_data from tensorflow.keras import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.layers import Conv2D from tensorflow.keras.layers import MaxPool2D from tensorflow.keras.layers import Flatten from tensorflow.keras.layers import Dropout # load dataset (x_train, y_train), (x_test, y_test) = load_data() # reshape data to have a single channel x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], x_train.shape[2], 1)) x_test = x_test.reshape((x_test.shape[0], x_test.shape[1], x_test.shape[2], 1)) # determine the shape of the input images in_shape = x_train.shape[1:] # determine the number of classes n_classes = len(unique(y_train)) print(in_shape, n_classes) # normalize pixel values x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 # define model model = Sequential() model.add(Conv2D(32, (3,3), activation='relu', kernel_initializer='he_uniform', input_shape=in_shape)) model.add(MaxPool2D((2, 2))) model.add(Flatten()) model.add(Dense(100, activation='relu', kernel_initializer='he_uniform')) model.add(Dropout(0.5)) model.add(Dense(n_classes, activation='softmax')) # define loss and optimizer model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # fit the model model.fit(x_train, y_train, epochs=10, batch_size=128, verbose=0) # evaluate the model loss, acc = model.evaluate(x_test, y_test, verbose=0) print('Accuracy: %.3f' % acc) # make a prediction image = x_train[0] yhat = model.predict(asarray([image])) print('Predicted: class=%d' % argmax(yhat))</code></pre> <p style="text-align: justify;">Chạy v&iacute; dụ trước ti&ecirc;n b&aacute;o c&aacute;o shape của tập dữ liệu, sau đ&oacute; fit m&ocirc; h&igrave;nh v&agrave; đ&aacute;nh gi&aacute; n&oacute; tr&ecirc;n tập dữ liệu thử nghiệm. Cuối c&ugrave;ng, một dự đo&aacute;n được đưa ra cho một h&agrave;ng dữ liệu.</p> <p style="text-align: justify;">Lưu &yacute;: Kết quả của bạn c&oacute; thể thay đổi do bản chất ngẫu nhi&ecirc;n của thuật to&aacute;n hoặc quy tr&igrave;nh đ&aacute;nh gi&aacute;, hoặc sự kh&aacute;c biệt về độ ch&iacute;nh x&aacute;c số. H&atilde;y xem x&eacute;t chạy v&iacute; dụ một v&agrave;i lần v&agrave; so s&aacute;nh kết quả trung b&igrave;nh.</p> <p style="text-align: justify;"><strong>Bạn nhận được kết quả g&igrave;?&nbsp;</strong>Bạn c&oacute; thể thay đổi m&ocirc; h&igrave;nh để l&agrave;m tốt hơn kh&ocirc;ng? H&atilde;y b&igrave;nh luận kết quả của bạn ở ph&iacute;a dưới b&agrave;i viết.</p> <p style="text-align: justify;">Đầu ti&ecirc;n, shape của mỗi h&igrave;nh ảnh được b&aacute;o c&aacute;o c&ugrave;ng với số lớp. Ch&uacute;ng ta c&oacute; thể thấy rằng mỗi h&igrave;nh ảnh l&agrave; 28 &times; 28 pixel v&agrave; c&oacute; 10 lớp như ch&uacute;ng ta mong đợi.</p> <p style="text-align: justify;">Trong trường hợp n&agrave;y, ch&uacute;ng ta c&oacute; thể thấy rằng m&ocirc; h&igrave;nh đạt được độ ch&iacute;nh x&aacute;c ph&acirc;n loại khoảng 98% tr&ecirc;n tập dữ liệu thử nghiệm. Sau đ&oacute;, ch&uacute;ng ta c&oacute; thể thấy rằng m&ocirc; h&igrave;nh đ&atilde; dự đo&aacute;n lớp 5 cho h&igrave;nh ảnh đầu ti&ecirc;n trong tập huấn luyện.</p> <pre class="language-python"><code>(28, 28, 1) 10 Accuracy: 0.987 Predicted: class=5</code></pre> <p>B&agrave;i viết tiếp theo:&nbsp;<a href="../../../phat-trien-mo-hinh-mang-neural-hoi-quy-keras-co-ban/" target="_blank" rel="noopener">Ph&aacute;t triển c&aacute;c m&ocirc; h&igrave;nh mạng nơ ron hồi quy</a></p> <hr /> <p style="text-align: center;"><em><strong>Fanpage Facebook:</strong>&nbsp;<a href="https://www.facebook.com/tek4.vn/">TEK4.VN</a></em>&nbsp;</p> <p style="text-align: center;"><em><strong>Tham gia cộng đồng để chia sẻ, trao đổi v&agrave; thảo luận:</strong>&nbsp;<a href="https://www.facebook.com/groups/tek4.vn/">TEK4.VN - Học Lập Tr&igrave;nh Miễn Ph&iacute;</a></em></p>