Đánh giá cách phân cụm

Một phần của tài liệu Machine Learning Toolbox trong MatLab (Trang 175 - 184)

8 Clustering Phân cụm

8.5 Biểu diễn và đánh giá cách chia cụm

8.5.2 Đánh giá cách phân cụm

Tiến hành đánh giá Silhoutte cho số phân cụm khác nhau cho 1 bộ dữ liệu để đưa ra số cụm hợp lý.

rng(’default’); % For reproducibility

mu1 = [1 1]; sigma1 = [0.9 -0.05; -0.05 0.9]; mu2 = [2 2]; sigma2 = [0.5 0 ; 0 0.3]; mu3 = [-2, -2]; sigma3 = [1 0 ; 0 0.9]; N = 200; X = [mvnrnd(mu1,sigma1,N);... mvnrnd(mu2,sigma2,N);... mvnrnd(mu3,sigma3,N)]; E = evalclusters(X,’kmeans’,’silhouette’,’klist’,[1:6]); figure; plot(E)

Sử dụng cách phân cụm theo thuật toán K-Means với số cụm trong klisttừ 1 đến 6. Ta vẽ được đồ thị thể hiện chỉ số Silhoutte trung bình của bộ dữ liệu theo số cụm K như sau:

8 CLUSTERING- PHÂN CỤM

Khi đó ta chọn số cụm có chỉ số Silhoutte trung bình lớn nhất là 3 làm cách chia cụm dữ liệu tốt nhất.

9 ỨNG DỤNG VÀO PROJECT CỤ THỂ

9 Ứng dụng vào Project cụ thể

9.1 Giới thiệu vấn đề

Neural Style Transfer là một bài toán khá thú vị trong vấn đề xử lý ảnh thuộc khối kiến thức Machine Learning. Bài toán đặt ra là từ 1 ảnh nội dung (content) ta sẽ vẽ lại ảnh đó theo phong cách hội họa hay theo phong cách vẽ tranh (style image) để làm bức ảnh ban đầu trở lên sinh động hơn. Các kết quả ảnh đầu ra của mơ hình thường rất đẹp và đã có nhiều bức ảnh được đấu giá lên tới nghìn đơ la Mỹ.

9 ỨNG DỤNG VÀO PROJECT CỤ THỂ

9.2 Lý thuyết chung

9.2.1 Mơ hình VGG 19

Mơ hình VGG 19 là một trong các mơ hình xử lý ảnh, phân loại ảnh rất nổi tiếng. Gồm các lớp nhân tích chập (convolution layer), lớp xử lý pooling, các hàm activation như Relu hay Softmax với đầu ra cuối cùng là phân loại ảnh vào đúng nhãn.

Mơ hình VGG 19 đã được training với bộ dữ liệu ảnh khổng lồ để đưa ra các tham số tối ưu cho các hàm activation, các tham số của mơ hình được cập nhật qua số lần epoch tương đối lớn (epoch là 1 lần chạy foward mơ hình + backward mơ hình).

Mơ hình VGG19 có thể học được các đường nét các đặc điểm của các ảnh qua từng Layer, các Layer đầu tiên mơ hình học các đường nét của ảnh, các Layer sâu hơn sẽ học đến các đặc diểm phức tạp trong ảnh như trong ảnh có những gì (người,đồ vật, con vật,...) và cuối cùng sẽ đi qua 2 lớp Fully Connected chuyển đổi các khối ma trận thành các vecto node kết nối với nhau và đi qua hàm activation Softmax để phân loại ảnh vào các nhãn.

Trong bài tốn này, ta sẽ cài đặt mơ hình VGG 19 đã được traing với bộ dữ liệu lớn để xử lý vấn đề "học" các đường nét của ảnh. Bài toán này sẽ bỏ đi các lớp Fully Connected những Layer cuối của mơ hình vì đầu ra khơng phải là phân loại ảnh. Đầu vào là 3 ảnh content, style và 1 ảnh được khởi tạo với các pixel ngẫu nhiên. Sau mỗi lần epoch ảnh khởi tạo sẽ học được những đường nét của cả ảnh content và ảnh style.

9 ỨNG DỤNG VÀO PROJECT CỤ THỂ

Ý tưởng chínhHàm mất mát:

J(G) =αJcontent(C,G) +βJstyle(S,G).

Dùng thuật tốn Gradient Decent để tìmminJ(G).

Sau 1 số lần epoch nhất định ảnh đầu ra sẽ là sự kết hợp của ảnh content và ảnh style.

9.3 Các bước tiến hành

Một bài tốn Machine Learning sẽ tn thủ các q trình: Xử lý dữ liệu, xây dựng mơ hình, huấn luyện mơ hình, đánh giá và cập nhật mơ hình.

Bước 1 Xử lý dữ liệu

styleImage = im2double(imread(’starryNight.jpg’)); contentImage = imread(’lighthouse.png’);

imshow(imtile({styleImage,contentImage},’BackgroundColor’,’w’));

Ta dùng 2 ảnh đầu vào là ảnh hải đăng và bức họa Starry Night của họa sĩ Van Goch làm ảnh content và ảnh style

9 ỨNG DỤNG VÀO PROJECT CỤ THỂ

float trong khoảng[0,255]nên ta cần chỉnh lại kích thước ảnh và chuyển các giá trị của pixel về đúng kiểu và khoảng giá trị.

imageSize = [224,224]; %size model %resize image

styleImg = imresize(styleImage,imageSize); contentImg = imresize(contentImage,imageSize);

Sau khi đã chuyển về đúng kích cỡ input của mơ hình. Ta sẽ tiến hành chuẩn hóa ảnh. Vì VGG19 đã được training với bộ dữ liệu ảnh rất lớn, đa dạng nên ta cần chuẩn hóa các ảnh đầu vào để mơ hình học dễ dàng hơn, sử dụng cách thức chuẩn hóa của thống kê(x−µ

σ ), ta có:

imgInputLayer = lgraph.Layers(1);

meanVggNet = imgInputLayer.Mean(1,1,:);

styleImg = rescale(single(styleImg),0,255) - meanVggNet; contentImg = rescale(single(contentImg),0,255) - meanVggNet;

Ta đã tiến hành nạp 2 ảnh content và style, tiếp theo ta khởi tạo ngẫu nhiên 1 ảnh (generation). Ảnh này sẽ học các đường nét của 2 ảnh trên.

noiseRatio = 0.7; %random pixel

randImage = randi([-20,20],[imageSize 3]);

transferImage = noiseRatio.*randImage + (1-noiseRatio).*contentImg; %base on content image

Bước 2: Xây dựng mơ hình

Mơ hình VGG19 đã được cài đặt trong gói Machine Learning, Deep Learning Toolbox nên ta hồn tồn có thể sử dụng nó, bỏ đi các layer fully connected và softmax ta có:

net=vgg19;

lastFeatureLayerIdx = 38; layers = net.Layers;

layers = layers(1:lastFeatureLayerIdx); %delete last layers

lgraph = layerGraph(layers);

%plot(lgraph)

dlnet = dlnetwork(lgraph);

Để training mơ hình với các tham số hiệu chỉnh, ta cần chuyển mơ hình về dạng dlnetwork. Tất cả các tham số hiệu chỉnh của mơ hình sẽ được cài đặt trong 1 struct là styleTransferOptions.

Định nghĩa hàm mất mát

9 ỨNG DỤNG VÀO PROJECT CỤ THỂ

phức tạp của ảnh content thì ta cần chọn những layer sâu của mơ hình. Ta định nghĩa hàm

Jcontent =∑ l Wcl. 1 H.W.C∑ i,j Yli,j−Yi,lj 2 .

với các tham số H,W,C lần lượt là 3 thông số đầu vào của layerl.Yl,Ylần lươt là2đầu ra của ảnh content và ảnh generation qua layerl. Trọng số của layer làWc. Để đơn giản mơ hình hơn ta sẽ chỉ chọn 1 layer sâu làconv4_2và cài đặt trọng số cho layer đó bằng1.

styleTransferOptions.contentFeatureLayerNames = {’conv4_2’}; styleTransferOptions.contentFeatureLayerWeights = 1;

Hàm mất mát cho việc so sánh ảnh style và ảnh generation phức tạp hơn. Các đường nét trong 1 bức ảnh nghệ thuật ln có sự liên kết với nhau khi đó ta khơng thể chỉ đánh giá dựa vào các tham số đầu ra của mơ hình. Đầu tiên ta chuyển ma trận 3 chiều input output của mơ hình thành ma trận 2 chiều có kích thức(HxW,C). Ta sử dụng ma trận Gram (AT.Avới A là các ma trận 2 chiều) để định nghĩa cho style loss function như sau:

GZ=Zi,j.Zj,i GZ =Zi,j.Zj,i Lstyle=∑ l Wsl 1 (2HWC)2∑(GlZ−GlZ)2

VớiWl là trọng số của các layer ảnh generation học đường nét từ ảnh style,Z,Z là đầu ra của các layer đó từ ảnh style và ảnh generation. Ta tiến hành chọn các layers và trọng số như sau đối với 2 ảnh

styleTransferOptions.styleFeatureLayerNames =

{’conv1_1’,’conv2_1’,’conv3_1’,’conv4_1’,’conv5_1’};

styleTransferOptions.styleFeatureLayerWeights = [0.5,1.0,1.5,3.0,4.0];

Hàm mất mát cuối cùng được định nghĩa:

J(G) =αJcontent(C,G) +βJstyle(S,G).

Ta chọn 2 tham sốα,β thích hợp và cài đặt như sau:

styleTransferOptions.alpha = 1; styleTransferOptions.beta = 1e3;

Tiếp theo để update các tham số của mơ hình (khơng phải các trọng sốW), ta cần trích xuất các đặc điểm của các ảnh qua các layer khi huấn luyện mơ hình

9 ỨNG DỤNG VÀO PROJECT CỤ THỂ

%change data to dlarray data type for training

dlStyle = dlarray(styleImg,’SSC’); dlContent = dlarray(contentImg,’SSC’); dlTransfer = dlarray(transferImage,’SSC’);

%Content Features Layers

contentFeatures =

{forward(dlnet,dlContent,’Outputs’,styleTransferOptions.contentFeatureLayerNames)};

%Style Feature Layers

numStyleFeatureLayers = numel(styleTransferOptions.styleFeatureLayerNames); styleFeatures = cell(1,numStyleFeatureLayers);

[styleFeatures{:}] =

forward(dlnet,dlStyle,’Outputs’,styleTransferOptions.styleFeatureLayerNames);

Bước 3+ Bước 4: Huấn luyện mơ hình và Cập nhật mơ hình

Thiết lập số lần epoch và learning rate cho thuật toán gradient decent như sau:

numIterations = 2500;

learningRate = 2; %fast convergence

trailingAvg = []; trailingAvgSq = [];

Tiến hành huấn luyện và cập nhật

figure

minimumLoss = inf;

for iteration = 1:numIterations

% Evaluate the transfer image gradients and state using dlfeval and the % imageGradients function listed at the end of the example.

[grad,losses] = dlfeval(@imageGradients,dlnet,dlTransfer,contentFeatures,styleFeatures,styleTransferOptions); [dlTransfer,trailingAvg,trailingAvgSq] = adamupdate(dlTransfer,grad,trailingAvg,trailingAvgSq,iteration,learningRate); if losses.totalLoss < minimumLoss minimumLoss = losses.totalLoss; dlOutput = dlTransfer; end

% Display the transfer image on the first iteration and after every 50 % iterations. The postprocessing steps are described in the "Postprocess % Transfer Image for Display" section of this example.

if mod(iteration,50) == 0 || (iteration == 1)

9 ỨNG DỤNG VÀO PROJECT CỤ THỂ

transferImage = transferImage + meanVggNet; transferImage = uint8(transferImage);

transferImage = imresize(transferImage,size(contentImage,[1 2]));

image(transferImage)

title([’Transfer Image After Iteration ’,num2str(iteration)]) axis off image

drawnow end

end

9 ỨNG DỤNG VÀO PROJECT CỤ THỂ

Tài liệu tham khảo

[1] ©1994-2022 The MathWorks, Inc,Statistics and Machine Learning Toolbox, lấy từhttps: //www.mathworks.com/help/stats/index.html.

[2] Richard A. Johnson, Dean W. Wichern (2007),Applied Multivariate Statistical Analysis,

Prentice Hall

Một phần của tài liệu Machine Learning Toolbox trong MatLab (Trang 175 - 184)

Tải bản đầy đủ (PDF)

(184 trang)