Mạng Noron Nhân tạo

22 600 0
Mạng Noron Nhân tạo

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Ngày nay không ai có thể phủ nhận vai trò cực kỳ quan trọng của máy tính trongnghiên cứu khoa học kỹ thuật cũng như trong đời sống. Máy tính đã làm được nhữngđiều kỳ diệu và giải được những vấn đề tưởng chừng nan giải. Càng ngày càng cónhiều người tự hỏi, liệu máy tính đã thông minh hơn con người hay chưa? Chúng tôisẽ không trả lời câu hỏi ấy. Thay vào đó, chúng tôi sẽ nêu ra những khác biệt chủ yếugiữa cách làm việc của máy tính và bộ óc con người.Một máy tính, dù có mạnh đến đâu chăng nữa, đều phải làm việc theo một chươngtrình chính xác đã được hoạch định trước bởi các chuyên gia. Bài toán càng phức tạpthì việc lập trình càng công phu. Trong khi đó con người làm việc bằng cách học tậpvà rèn luyện. Trong khi làm việc con người có khả năng liên tưởng, kết nối sự việcnày với sự việc khác, và quan trọng hơn hết, họ có thể sáng tạo.Do có khả năng liên tưởng, con người có thể dễ dàng làm nhiều điều mà việc lập trìnhcho máy tính đòi hỏi rất nhiều công sức. Chẳng hạn như việc nhận dạng hay trò chơi ôchữ. Một em bé có thể tự học hỏi để nhận dạng và phân loại đồ vật chung quanh mình,biết được cái gì là thức ăn, cái gì là đồ chơi. Một người bình thường cũng có thể đoánđược vài chữ trong một ô chữ. Nhưng thật khó mà dạy cho máy tính làm được nhữngviệc ấy. Bạn hãy thử thiết kế một máy tính có khả năng làm như thế Từ lâu các nhà khoa học đã nhận thấy những ưu điểm ấy của bộ óc con người và tìmcách bắt chước để thực hiện những máy tính có khả năng học tập, nhận dạng và phânloại. Các mạng nơron nhân tạo (Artificial Neural Network, ANN) đã ra đời từ nhữngnỗ lực đó. ANN là một lãnh vực nghiên cứu rộng lớn và chỉ mới phát triển mạnhkhoảng 15 năm gần đây thôi. Tuy có nhiều kết quả khích lệ, nhưng ANN hãy còn xamới đạt được sự hoàn chỉnh như bộ óc con người

Mạng nơron nhân tạo Phần Con người máy tính Ngày không phủ nhận vai trò quan trọng máy tính nghiên cứu khoa học kỹ thuật đời sống Máy tính làm điều kỳ diệu giải vấn đề tưởng chừng nan giải Càng ngày có nhiều người tự hỏi, liệu máy tính thông minh người hay chưa? Chúng không trả lời câu hỏi Thay vào đó, nêu khác biệt chủ yếu cách làm việc máy tính óc người Một máy tính, dù có mạnh đến đâu nữa, phải làm việc theo chương trình xác hoạch định trước chuyên gia Bài toán phức tạp việc lập trình công phu Trong người làm việc cách học tập rèn luyện Trong làm việc người có khả liên tưởng, kết nối việc với việc khác, quan trọng hết, họ sáng tạo Do có khả liên tưởng, người dễ dàng làm nhiều điều mà việc lập trình cho máy tính đòi hỏi nhiều công sức Chẳng hạn việc nhận dạng hay trò chơi ô chữ Một em bé tự học hỏi để nhận dạng phân loại đồ vật chung quanh mình, biết thức ăn, đồ chơi Một người bình thường đoán vài chữ ô chữ Nhưng thật khó mà dạy cho máy tính làm việc Bạn thử thiết kế máy tính có khả làm ! Từ lâu nhà khoa học nhận thấy ưu điểm óc người tìm cách bắt chước để thực máy tính có khả học tập, nhận dạng phân loại Các mạng nơron nhân tạo (Artificial Neural Network, ANN) đời từ nỗ lực ANN lãnh vực nghiên cứu rộng lớn phát triển mạnh khoảng 15 năm gần Tuy có nhiều kết khích lệ, ANN xa đạt hoàn chỉnh óc người Mạng nơron nhân tạo Phần Nơron học tập Sau thành phần cấu trúc nơron:     Soma thân nơron Các dendrites dây mảnh, dài, gắn liền với soma, chúng truyền liệu (dưới dạng xung điện thế) đến cho soma xử lý Bên soma liệu tổng hợp lại Có thể xem gần tổng hợp phép lấy tổng tất liệu mà nơron nhận Một loại dây dẫn tín hiệu khác gắn với soma axon Khác với dendrites, axons có khả phát xung điện thế, chúng dây dẫn tín hiệu từ nơron nơi khác Chỉ điện soma vượt giá trị ngưỡng (threshold) axon phát xung điện thế, không trạng thái nghỉ Axon nối với dendrites nơron khác thông qua mối nối đặc biệt gọi synapse Khi điện synapse tăng lên xung phát từ axon synapse nhả số chất hoá học (neurotransmitters); chất mở "cửa" dendrites ions truyền qua Chính dòng ions làm thay đổi điện dendrites, tạo xung liệu lan truyền tới nơron khác Có thể tóm tắt hoạt động nơron sau: nơron lấy tổng tất điện vào mà nhận được, phát xung điện tổng lớn ngưỡng Các nơron nối với synapses Synapse gọi mạnh cho phép truyền dẫn dễ dàng tín hiệu qua nơron khác Ngược lại, synapse yếu truyền dẫn tín hiệu khó khăn Các synapses đóng vai trò quan trọng học tập Khi học tập hoạt động synapses tăng cường, tạo nên nhiều liên kết mạnh nơron Có thể nói người học giỏi có nhiều synapses synapses mạnh mẽ, hay nói cách khác, liên kết nơron nhiều, nhạy bén Hãy nhớ kỹ nguyên tắc này, dùng việc học tập ANNs Mạng nơron nhân tạo Phần Mô hình nơron Mô hình McCulloch-Pitts (1943) Sau mô hình nơron nhân tạo: Nơron hoạt động sau: giả sử có N inputs, nơron có N weights (trọng số) tương ứng với N đường truyền inputs Nơron lấy tổng cótrọng số tất inputs Nói có nghĩa nơron lấy input thứ nhất, nhân với weight đường input thứ nhất, lấy input thứ hai nhân với weight đường input thứ hai v.v , lấy tổng tất kết thu Đường truyền có weight lớn tín hiệu truyền qua lớn, xem weight đại lượng tương đương với synapse nơron sinh học Có thể viết kết lấy tổng nơron sau: Kết so sánh với threshold t nơron, lớn t nơron cho output 1, nhỏ output Ngoài ta trừ tổng nói cho t, so sánh kết thu với 0, kết dương nơron cho ouput 1, kết âm output Dưới dạng toán học ta viết output nơron sau: Trong f hàm Heaviside: f gọi threshold function hay transfer function nơron, giá trị (-t) gọi bias hay offset nơron Nếu đưa thêm input vào, input thứ 0, có giá trị luôn weight luôn bias (-t) output nơron viết dạng: Lưu ý số tổng trước Nếu bạn quen lập trình, bạn nhận xét dễ dàng viết chương trình ngắn để mô hoạt động nơron nhân tạo nói Các bạn có kiến thức điện tử tạo mạch đơn giản để thực nơron nhân tạo Dạy nơron học ? Giả sử muốn dạy nơron phân biệt chữ A B Khi đưa input A muốn nơron cho output 1, input B nơron phải cho output Hình ảnh hai chữ A B phân tích thành nhiều ô nhỏ sau: Các bạn thấy ví dụ chữ gồm 5x10=50 ô, ô có chứa dấu x hay không chứa Chúng ta mã hóa ô có chứa dấu x số 1, ô trống số Như chữ mã hóa dãy 50 số Nói cách khác, với chữ ta phải dùng 50 đường truyền để đưa 50 inputs số 0, vào nơron Hãy bắt đầu cách cho weights giá trị ngẫu nhiên, lúc nơron chưa biết hết Bây input chữ A Nơron lấy tổng có trọng số inputs so sánh kết với Nếu kết dương output 1, âm output Khả nơron đoán 50%, weights có giá trị hoàn toàn ngẫu nhiên Nếu nơron đoán không cần làm cả, nơron đoán sai (output 0), phải tăng weights inputs hoạt động (các inputs khác không) lên, cho lần tới tổng có trọng số vượt threshold tạo nên output Ngược lại, đưa chữ B vào nơron đoán sai (output 1), ta phải giảm weights inputs hoạt động xuống, cho lần tới tổng có trọng số nhỏ threshold buộc nơron phải cho output Như vậy, dạy chữ B thành công nơron có quên chữ học trước A không ? Không, input chữ khác nhóm đường inputs hoạt động khác không hoàn toàn trùng Nhớ biến đổi weights inputs hoạt động Chúng ta việc lập lập lại trình dạy nơron học thuộc Phương pháp dạy vừa gọi Hebbian Learning, Donald Hebb đề nghị năm 1949 Phương pháp dạy cách biến đổi weights đường truyền có làm bạn liên tưởng tới tăng cường synapses óc người không ? Lưu ý ta lập trình để thực Hebbian Learning máy tính cách dễ dàng Mạng nơron nhân tạo Phần Perceptron Trong phần này, áp dụng kiến thức vừa cho mạng nơron đơn giản Perceptron, Frank Rosenblatt đề nghị năm 1962 Perceptron mạng có lớp nơron (lớp có hay nhiều nơron), có cấu trúc sau: Tạo Perceptron Như nhận xét phần 3, lập trình để mô nơron nhân tạo việc dạy học cho nơron Trong MatLab ta thực điều tương đối dễ dàng Trước hết mở MatLab Trong cửa sổ MatLab (MatLab Command Window) bạn cần gõ dòng lệnh sau để tạo Perceptron tên net, có nơron, nhận input số có giá trị khoảng từ -1 đến 1: net = newp([-1 1],1) Trong MatLab [-1 1] ma trận hàng hai cột, có hai yếu tố -1 Nếu muốn tạo Perceptron có nơron, nhận input cặp số, số thứ có giá trị khoảng -1,1, số thứ hai có giá trị khoảng 0,1, ta viết: net = newp([-1 1;0 1],1) Trong cách viết ma trận dấu ";" dùng để tách hàng, [-1 1;0 1] ma trận có hai hàng hai cột, hàng thứ chứa min, max thành phần input thứ nhất, hàng thứ hai chứa min, max thành phần input thứ hai: -1 1 Sau bạn kết thúc dòng lệnh gõ Enter, MatLab tạo Perceptron, gán cho biến net biểu thị tính chất biến số mạng net Tạm thời không quan tâm tới tính chất biến số Để MatLab không biểu thị chúng ra, ta cần thêm dấu ";" vào cuối dòng lệnh Ví dụ, dòng lệnh sau tạo perceptron có hai nơron, nhận input ba số, số có min, max khoảng từ -10 đến 10, mà không biểu thị kết quả: net = newp([-10 10;-10 10;-10 10],2); Ngoài bạn dùng ";" sau dòng lệnh MatLab để MatLab không biểu thị kết dòng lệnh Trước tiếp tục bạn xóa biến net khỏi nhớ, muốn gõ: clear net Còn muốn xóa tất biến tồn nhớ MatLab, dùng: clear Để xóa hình Command Window bạn dùng: clc Khi bạn viết sai câu lệnh gõ Enter MatLab báo lỗi Tuy nhiên bạn đưa trỏ vào câu lệnh để sửa chữa đâu Bạn phải nhấn nút mũi tên lên bàn phím để MatLab hiển thị câu lệnh gõ trước Khi tới câu lệnh cần sửa đổi bạn ngừng lại để sửa Cho Perceptron hoạt động Bây MatLab Command Window bạn tạo Perceptron có nơron, nhận input số thay đổi khoảng từ -100 tới 100, đặt tên cho Bi: Bi = newp([-100 100],1); Perceptron Bi có weights ngẫu nhiên, chưa có kiến thức đặc biệt Hãy đưa số khoảng -100, 100, số 97 chẳng hạn, xem cho output gì: y = sim(Bi,97) Trong dòng lệnh vừa rồi, bạn vừa bảo Bi nhận diện số 97 lệnh sim(Bi,97), gán output Bi cho biến số y, biểu thị y hình Hãy thử bảo Bi nhận diện số inputs khác xem Dạy Bi phân biệt số âm, dương Bây dạy Bi phân biệt số âm, dương khoảng -100, 100 Muốn trước hết ta chọn số âm, dương làm ví dụ để dạy, chẳng hạn gồm hai số -2 65 sau đây: examples = {-2 65} Chúng ta muốn đưa số âm Bi phải trả lời 0, đưa số dương phải trả lời Vì ta phải soạn lời giải tương ứng để dạy cho Bi Trong trường hợp lời giải gồm hai số 1, lời giải tương ứng với ví dụ -2 lời giải tương ứng với ví dụ 65: answers = {0 1} Để dạy cho Bi ví dụ ta gõ sau: Bi = train(Bi,examples,answers); Hàm train dùng ví dụ examples lời giải answers để dạy cho Bi Bi dạy ví dụ nhiều lần cần thiết, chừng hết nhầm lẫn Trong MatLab vòng dạy qua tất ví dụ gọi epoch, nhầm lẫn Bi ước lượng đại lượng ký hiệu MAE (Mean Average Error) Bây Bi học xong, ta thử tài xem Trước hết xem có thuộc hay không cách bảo phân loại trở lại số ví dụ: y = sim(Bi,examples) Cuối thử tài suy đoán Bi cách bảo phân loại số không nằm học: tests = {-78 45 35.3 -24.6 pi 0} y = sim(Bi,tests) Các bạn thấy Bi phân loại hết số vừa rồi, trừ trường hợp số 0, cho số âm ! Nhưng đâu, số số đặc biệt Bi học lý luận Chắc bạn biết phép toán logic OR, dạy cho Bi phép toán Cho cặp số nằm khoảng 0,1, kết phép toán OR cho bảng sau: OR 0 1 1 Bộ ví dụ gồm cặp số, cặp cho dạng ma trận hai hàng, cột Do trước hết Bi phải trang bị để đọc inputs gồm số Ngoài ra, lời giải gồm số 0,1 tương ứng với trường hợp ví dụ Ta gõ dòng lệnh sau: clear clc Bi = newp([0 1;0 1],1); examples = {[0;0] [0;1] [1;0] [1;1]} answers = {0 1 1} Bạn dạy cho Bi ví dụ lời giải Sau ôn lại thử tài suy đoán Bi cách làm nhiễu inputs chút sau: tests = {[0.01;0] [0;0.96] [1;0.01] [0.95;0.96]} Một học lý luận khác Bi giỏi phải không bạn ? Các bạn thử dạy Bi phép toán logic XOR (Exclusive OR) xem Sau bảng giá trị XOR: XOR 0 1 Nếu cần bạn tăng số vòng dạy (epochs) lên, để ấn định số epochs 500 chẳng hạn bạn dùng dòng lệnh sau: Bi.trainParam.epochs = 500; Nếu bạn quen với cách lập trình định hướng đối tượng (object-oriented) có lẽ cách viết quen thuộc với bạn Bi Perceptron, thông số dạy học trainParam thuộc tính Bi, để xem xét thông số ta viết: Bi.trainParam Số vòng dạy epochs lại yếu tố thông số dạy học trainParam, để biết giá trị epochs ta dùng dấu "." thêm lần nữa: Bi.trainParam.epochs Các bạn xem câu trả lời tập phần Mạng nơron nhân tạo Phần Mạng Feedforward Thật mạng Perceptron học toán XOR, hạn chế cấu trúc mạng Vì năm 1986 Rumelhart McClelland cải tiến Perceptron thành mạng Perceptron nhiều lớp (MultiLayer Perceptron, MLP), hay gọi mạng Feedforward Mạng Feedforward mạng gồm hay nhiều lớp nơron, dây dẫn tín hiệu truyền theo chiều từ input qua lớp, output Sau ví dụ gồm hai lớp, lớp có hai nơron: Lưu ý lớp input không coi lớp mạng Ngoài mạng Feedforward khác Perceptron chỗ không dùng hàm Heaviside làm transfer function nữa, thay vào hàm sigmoid (tansig hay logsig) Sau dạng hàm tansig (tanh(x/2)): Tạo mạng Feedforward Để tạo mạng Feedforward tên net, nhận input cặp số khoảng 0,1, có hai lớp, lớp có nơron, ta gõ dòng lệnh sau: net = newff([0 1;0 1],[1 1]); Ma trận thứ hai arguments newff giống trường hợp Perceptron, ma trận chứa giá trị min,max hai thành phần input Còn ma trận thứ hai, [1 1], chứa số nơron lớp; ma trận có hai cột mạng có hai lớp, cà hai yếu tố ma trận 1, lớp có chứa nơron Sau cấu trúc net: Ngoài tính chất xác định arguments lệnh newff, tính chất lại mạng cho trước cách (default properties) Nhưng thay đổi tính chất cần thiết Transfer function tất lớp có dạng tansig, để dùng logsig cho lớp thứ tansig cho lớp thứ hai ta dùng: net = newff([0 1;0 1],[1 1],{'logsig' 'tansig'}); Nếu dùng logsig làm transfer function cho hai lớp ta viết: net = newff([0 1;0 1],[1 1],{'logsig' 'logsig'}); Phương pháp dạy học mạng Feedforward trainlm, có trainbfg trainrp Tuỳ theo nội dung học, phương pháp sau hiệu Để dùng trainbfg hay trainrp làm phương pháp giảng dạy ta thêm argument thứ tư vào dòng lệnh vừa rồi: net = newff([0 1;0 1],[1 1],{'logsig' 'logsig'},'trainbfg'); net = newff([0 1;0 1],[1 1],{'logsig' 'logsig'},'trainrp'); Thay đổi tính chất mạng Transfer function phương pháp dạy học hai thuộc tính thay đổi cách thêm argument vào hàm newff Để thay đổi thuộc tính lại ta phải viết lệnh gán trực tiếp, tương tự thay đổi số epochs dạy Perceptron Trong nhóm thông số dạy học, epochs có thông số thông dụng sau:   goal: sai số mà ta muốn mạng đạt học tập, goal có giá trị min_grad: gradient nhỏ sai số học tập, min_grad có giá trị 1e-6 Để đổi goal min_grad mạng thành 1e-12 ta dùng: net.trainParam.goal = 1e-12; net.trainParam.min_grad = 1e-12; Ngoài có hai thuộc tính quan trọng khác inputConnect layerConnect; inputConnect quy định đường truyền từ input tới lớp, layerConnect quy định đường truyền lớp mạng Cả hai thuộc tính ma trận Trong trường hợp inputConnect ma trận hai hàng cột, [1;0], hàng ứng với lớp Yếu tố thứ 1, có nghĩa input nối trực tiếp với lớp thứ nhất, yếu tố thứ hai 0, có nghĩa input không nối trực tiếp với lớp thứ hai Để hai lớp net nối trực tiếp với input ta viết dòng lệnh sau: net.inputConnect = [1;1]; Còn layerConnect ma trận có hai hàng hai cột, [0 0;1 0] (nếu số lớp nơron n ma trận nxn) Yếu tố (i,j) ma trận này, ký hiệu layerConnect(i,j) lấy hai giá trị hay 1; layerConnect(i,j) bằng:   đường truyền từ lớp j tới lớp i; có đường truyền từ lớp j tới lớp i Bài tập: Phép toán XOR Các bạn thiết kế mạng Feedforward học phép toán XOR Nhớ không cần dùng lớp nơron, Kolmogorov chứng minh mạng lớp thực toán phân loại Rất tiếc Kolmogorov cho biết lớp phải có nơron Đây dẫn: từ đơn giản tới phức tạp, đừng bắt tay vào xây dựng mạng có nhiều nơron, hay lớp, lớp có hay nơron; ý tới liên kết input lớp mạng Mạng nơron nhân tạo Phần Mạng Feedforward (tiếp theo) Bài tập: Nhận dạng chữ số Sau chữ số từ đến 9: Mỗi số ma trận 7x5, có yếu tố ký tự 'o' hay dấu trống ' ' Mỗi ma trận coi tương đương với ảnh có 7x5 pixels Các bạn thiết kế mạng Feedforward dạy cho đọc chữ số Tất nhiên, trước hết phải xây dựng ví dụ lời giải Để bạn tập trung vào việc thiết kế mạng, giúp bạn xây dựng ví dụ lời giải Dưới chút bạn thấy liên kết tới file tên digits.m, muốn bạn save file vào folder làm việc bạn Nhưng trước hết bạn đọc kỹ hướng dẫn sau Để chép digits.m click vào liên kết chọn Save it to disk dialog xuất sau đó, browse tới folder làm việc bạn click Save Cũng Internet Explorer setup để mở file digits.m mà không hỏi xem bạn có muốn save hay không Trong trường hợp right-click vào liên kết chọn Save Target As popup menu xuất sau Chú ý tùy theo version Internet Explorer, mục tiếng Anh vừa khác đôi chút > digits.m Digits.m script file MatLab (script file: file có chứa dòng lệnh MatLab) Trong digits.m có lệnh để tạo ma trận bảng nói trên, để xây dựng ví dụ lời giải Để xem nội dung digits.m, click nút toolbar MatLab Command Window Sau browse tới thư mục chứa digits.m (thư mục làm việc bạn), chọn chọn file digits.m, click Open File digits.m mở cửa sổ khác MatLab, gọi MatLab Editor Trong digits.m ma trận ký tự bảng đặt tên one, two, three, , nine, tập hợp ma trận đặt tên digits Để dạy cho mạng đọc số vừa rồi, tạo ví dụ gồm số Để dùng lệnh train ta phải biến đổi ma trận 7x5 nói thành ma trận có cột 35 hàng Muốn thế, cần xếp hàng ma trận 7x5 vào ma trận cột Ngoài ta phải thay ký tự 'o' ' ' số, input mạng nơron phải số Tôi quy ước dùng số để thay 'o' số -1 để thay ' ' Bộ ví dụ xây dựng đặt tên bitmaps Như thành phần bitmaps, ký hiệu bitmaps{i}, với i = 1, 2, , 10, tương ứng với ảnh số từ Cuối digits.m ta xây dựng lời giải, đặt tên answers, gồm lời giải answers{i}, i = 1, 2, , 10 Để phân biệt 10 câu trả lời khác nhau, dùng ma trận cột (10x1) cho câu trả lời Trong câu trả lời thứ i có yếu tố thứ i 1, tất yếu tố lại -1 Các bạn chép hay nhiều dòng lệnh digits.m từ MatLab Editor qua MatLab Command Window thực chúng Hay đơn giản hơn, bạn vào File, chọn Set Path Trong dialog box xuất sau đó, bạn nhấn nút Add Folder Sau bạn chọn folder làm việc nhấn OK Như MatLab thêm folder làm việc bạn vào danh mục nơi cần tìm script files Bây bạn viết: digits Thì sau gõ Enter MatLab thực toàn lệnh digits.m, tạo ví dụ bitmaps lời giải answers dùm bạn Để xem chữ số, ví dụ hay lời giải (chữ số, ví dụ lời giải thứ chẳng hạn), bạn viết tiếp dòng sau: digits{4} bitmaps{4} answers{4} bitmaps{4} ma trận có 35 hàng, bất tiện cho bạn xem Bạn xem dạng chuyển vị sau: bitmaps{4}' Trong MatLab, ký tự ' đặt sau ma trận để biến đổi thành ma trận chuyển vị Tới bạn tạo xong ví dụ bitmaps, lời giải answers làm quen với dạng ma trận chúng Hãy bắt đầu xây dựng mạng dạy ! Bạn xây dựng mạng có ba lớp, ý lớp thứ ba (output) phải có 10 nơron, lời giải gồm 10 số Đối với lớp bạn dùng từ 10 nơron trở lên Ngoài argument newff (xác định min, max inputs) ma trận 35x2, có 35 số cho input Để tránh gõ dòng dài, bạn tạo ma trận sau (bỏ qua các dòng bắt đầu ký tự %, chúng thích): % tao mot ma tran don vi co 35 hang, cot, gan cho bien range range = ones(35,2); % cot thu nhat cua range bang -1 range(:,1) = -1; sau dùng range làm argument thứ newff Nếu thành công, bạn thiết kế mạng đọc chữ viết (tạm thời chữ số từ tới thôi) Tương tự vậy, bạn mở rộng mạng, bổ sung ví dụ lời giải để đọc chữ cái, chí đọc chữ viết tay nhiều người khác ! Mạng nơron nhân tạo Phần Mạng Hopfield Các bạn quan sát kỹ mẫu trang trí sau đây: Và mẫu khác nữa: Trông mẫu sau quen quen phải không bạn? Đúng vậy, thật chúng ảnh bị nhiễu mẫu trang trí Bạn cho biết mẫu tương ứng với mẫu không? Nhưng thôi, khoan nói đã, chút bạn so sánh ý kiến với ý kiến mạng Hopfield Mạng Hopfield John Hopfield đề nghị năm 1980 Về mặt cấu trúc mạng Hopfield mạng có lớp nơron, nơron nối với tất nơron lại: Chắc bạn nhận xét mạng lớp input output mạng tìm hiểu trước Lớp nơron mạng nơi nhận input và phát output Như số nơron mạng phải số thành phần input số thành phần output Ngoài mạng Hopfield nhận inputs -1 hay Transfer function mạng hàm satlins: Tạo mạng Hopfield Ngay tạo mạng Hopfield ta phải cho mạng biết ví dụ dạng ma trận, cột ví dụ Trong ví dụ sau T gồm hai ví dụ, ví dụ ba số, cụ thể {-1 -1 1} {1 -1 1} Vì input có thành phần nên mạng Hopfield mang tên net có nơron: T = [-1 -1 1; -1 1]' net = newhop(T); Các mạng Perceptron Feedforward tạo có weights ngẫu nhiên Còn mạng Hopfield weights ban đầu xác định theo ví dụ mà ta cung cấp Giả sử có M ví dụ, ví dụ có N thành phần (như số nơron mạng N), quy luật xác định weights mạng Hopfield sau: Trong w(i,j) weight đường truyền hai nơron i j, x(s,j) thành phần thứ j ví dụ thứ s Sau xem xét hiểu công thức tạm thời quên đi, hàm newhop xác định weights ban đầu theo công thức dùm Như nói hình thành, mạng Hopfield ghi nhớ ví dụ mà ta cung cấp Mạng Hopfield làm điều theo cách riêng nó, cách ghi thông tin ví dụ weights Trở lại với mẫu trang trí đầu Chúng ta tạo mạng Hopfield đưa mẫu trang trí vào nhớ mạng Trước hết, giống chữ số phần trước, biến đổi chúng thành dạng thích hợp để mạng hiểu Mỗi mẫu ma trận 10x10 gồm yếu tố ký tự 'O' dấu trống ' ', coi ảnh có 10x10 pixels Cần phải biến đổi ảnh thành ma trận cột có 100 dòng, với yếu tố số -1 1; tương ứng với ký tự 'O' -1 tương ứng với dấu trống ' ' Sau ghép tất ma trận cột lại thành ma trận chứa ví dụ Tôi viết script file, images.m, để xây dựng ma trận ví dụ Các bạn save file vào folder làm việc Sau viết dòng lệnh sau: % tao bo vi du bitmaps images % tao mang net (co 100 noron) va dua bitmaps vao bo nho cua net net = newhop(bitmaps); Trong images.m, mẫu trang trí gọi images, ví dụ xây dựng từ chúng gọi bitmaps Để xem mẫu hay ví dụ bạn gọi trực tiếp thành phần images{i} mẫu images hay cột bitmaps(:,i) ma trận bitmaps Đừng quên bitmaps(:,i) ma trận cột có tới 100 hàng ! % anh thu ba bo anh images images{3} % chuyen vi cua cot thu ba (vi du thu ba) bo vi du bitmaps bitmaps(:,3)' Cho mạng Hopfield hoạt động Tới cho mạng Hopfield làm việc mà không cần phải dạy Cách thức làm việc mạng Hopfield này:   Đưa mẫu mới, không nằm ví dụ, cho mạng xem Trong trường hợp này, mẫu bị nhiễu làm cho biến dạng mẫu thứ hai Để cho mạng có thời gian suy nghĩ Mạng thực hay nhiều bước lặp suy nghĩ ổn định, không thay đổi Mỗi bước lặp gọi timestep Tại timestep, mạng nhận output timestep trước làm input cho ouput, output dùng làm input cho timestep Cứ output mạng không thay đổi  Thông thường ouput cuối mạng Hopfield ảnh nguyên vẹn mẫu chưa bị nhiễu Như mạng có khả khôi phục lại ảnh bị nhiễu làm cho biến dạng Script file images.m biến đổi mẫu thứ hai thành bitmaps mà mạng Hopfield đọc Bộ mẫu đặt tên images_1, mẫu dạng ma trận bitmaps_1 Để đưa ảnh thứ hai mẫu bị nhiễu cho mạng net xem xét, dành 10 timesteps cho mạng suy nghĩ, sau ghi lại output tất timesteps biến y, ta viết: y = sim(net,{1 10},{},{bitmaps_1(:,2)}); Trong lệnh argument thứ sim tên mạng (net); argument thứ hai hai số, số thứ số mẫu mà ta đưa cho mạng nhận dạng, trường hợp ta đưa mẫu, số thứ hai số timesteps cho mạng làm việc (nếu output mạng chưa ổn định sau 10 timesteps bạn phải tăng số lên); argument thứ ba, gọi Final Input Delay Conditions, để trống, mạng Hopfield không dùng argument này; argument cuối input, cho dạng ma trận cột, nhớ đặt ngoặc nhọn {} ! Suy nghĩ mạng timestep Để xem xét output y{i} mạng timestep trước hết cần hàm để biến đổi y{i} thành ảnh, y{i} ma trận cột chứa -1 Tôi có viết hàm vậy, gọi img, script file img.m Các bạn save img.m vào folder làm việc mình, sau viết dòng lệnh sau: % vong lap 10 buoc de bien doi y{i} anh z{i} for i=1:10 z{i}=img(y{i}); end % xem output cua timestep 1,2, z{1} z{2} % tiep tuc den timestep thu 10 z{9} z{10} Trong trường hợp xem thấy output mạng ổn định sau timesteps, bạn xem sau input ban đầu khôi phục ảnh qua timesteps: Các bạn thấy nào? Hãy tiếp tục nhờ mạng nhận dạng ảnh bị nhiễu lại so sánh với nhận định ban đầu bạn ảnh Bài tập: Bạn có thấy ba mặt không? Đó smiley, frowny dead, thông dụng trang Web Chúng ảnh 15x15 pixels, sau ảnh phóng to chúng: Hãy tạo mạng Hopfield lưu trữ ảnh vào mạng Sau nhờ mạng nhận diện ảnh bị nhiễu chúng Các bạn tự tạo ảnh bị nhiễu mức độ khác để thử nghiệm khả khôi phục ảnh mạng Hopfield, hay dùng ảnh sau đây: Thay lời kết Để kết thúc phần này, lưu ý mạng Hopfield khôi phục thành công ảnh số ví dụ mà bạn lưu trữ mạng không vượt 0.15N, với N số nơron Ngoài nên nhớ N số thành phần input Chẳng hạn, bạn lưu trữ ảnh 10 số từ tới phần trước, việc khôi phục ảnh bị nhiễu chúng không thành công lắm, mạng có N = 35 nơron (ứng với 35 pixels ảnh) Với kích thước mạng vậy, nên lưu trữ khoảng 0.15x35, tức ảnh mà Mặt khác tăng số nơron lên cách tăng kích thước ảnh lên Nếu ảnh có 10x10 pixels thay 7x5 pixels số nơron tăng từ 35 lên 100, mạng lưu trữ 15 ảnh khôi phục ảnh bị nhiễu chúng ... ma trận ví dụ Các bạn save file vào folder làm việc Sau viết dòng lệnh sau: % tao bo vi du bitmaps images % tao mang net (co 100 noron) va dua bitmaps vao bo nho cua net net = newhop(bitmaps);... gồm hai ví dụ, ví dụ ba số, cụ thể {-1 -1 1} {1 -1 1} Vì input có thành phần nên mạng Hopfield mang tên net có nơron: T = [-1 -1 1; -1 1]' net = newhop(T); Các mạng Perceptron Feedforward tạo... input Để tránh gõ dòng dài, bạn tạo ma trận sau (bỏ qua các dòng bắt đầu ký tự %, chúng thích): % tao mot ma tran don vi co 35 hang, cot, gan cho bien range range = ones(35,2); % cot thu nhat cua

Ngày đăng: 05/04/2017, 00:39

Tài liệu cùng người dùng

Tài liệu liên quan