Khi thực thi mạng nơron truyền thẳng, dữ liệu được truyền đến đối tượng “synapse”. Phương thức run chạy một vòng lặp luôn luôn đợi mẫu dữ liệu mới và sau đó chuyển chúng thành dữ liệu đầu ra, danh sách 2.1 chỉ ra phương thức run hoạt động để nhớ mẫu của lớp Layer.
Danh sách 2.1: Phương thức Layer.run public void run() {
while ( running ) { int dimI = getRows(); int dimO = getDimension();
inps = new double[dimI]; this.fireFwdGet(); if ( m_pattern != null ) { forward(inps); m_pattern.setArray(outs); fireFwdPut(m_pattern); } if ( step != -1 )
// Kiểm tra nếu bước tiếp theo đang được học m_learning = monitor.isLearningCicle(step); else
// Dừng mạng running = false;
//Nếu ((m_learning) && (m_batch != 1)) if ( (m_learning) && (running) )
{ // Học
gradientInps = new double[dimO]; fireRevGet();
backward(gradientInps);
m_pattern = new Pattern(gradientOuts); m_pattern.setCount(step);
fireRevPut(m_pattern); }
} // Kết thúc while (running = false) myThread = null;
}
Phương thức fireFwdPut được gọi để truyền mẫu vào trong “synapse” đầu rạ
forward(inps);
m_pattern.setArray(outs); fireFwdPut(m_pattern);
Khi các phương thức “forward” và “fireFwdPut” được gọi, có ba biến liên quan đó là:
· Các trọng số kết nối · Độ lệch trọng số · Hàm ngưỡng
Phương thức đầu tiên được gọi là phương thức fireFwdGet. Công việc chính của phương thức này là nhận mẫu từ “synapse” đầu vào, và đợi cho đến khi không có mẫu nào được đưa vàọ
Lớp dữ liệu đầu vào chỉ nhận các giá trị {0,1} của mẫu để nhớ. Sau đó, lớp đầu vào sẽ áp dụng hàm ngưỡng, đưa chúng đến lớp tiếp theọ Chúng ta sử dụng kiểu hàm sigmoid trong lớp dữ liệu đầu vào, thực thi hàm sigmoid qua lớp SigmoidLayer. Danh sách 2.2 chỉ ra phương thức SigmoidLayer.forward().
Danh sách 2.2: Phương thức SigmoidLayer.forward public void forward(double[] pattern)
{ int x; double in; int n = getRows(); try { for ( x = 0; x < n; ++x ) { in = pattern[x] + bias.value[x][0]; outs[x] = 1 / (1 + Math.exp(-in)); }
} catch ( Exception aioobe ) { aioobẹprintStackTrace(); }
}
Từ danh sách 2.2 ta thấy, phương thức SigmoidLayer.layer() áp dụng hàm sigmoid cho mỗi nơron trong lớp nàỵ Hàm sigmoid đã được đề cập ở trên.
Phương thức Layer.run đã xử lý dữ liệu đầu vào bằng cách sử dụng hàm ngưỡng sigmoid, lớp này sẵn sàng đưa mẫu tới lớp kế tiếp. Khi mẫu được đưa vào lớp tiếp theo, thì các trọng số thích hợp được cập nhật.
Bây giờ, phương thức Layer.run áp dụng hàm ngưỡng cho mỗi giá trị nơron, lớp phải truyền mẫu lên trên synapsẹ Synapse này áp các trọng số kết nối và gửi mẫu tới lớp tiếp theo, chúng được thể hiện ở phương thức fireFwdPut(). Phương thức fireFwdPut được chỉ ra trong danh sách 2.3.
Danh sách 2.3: Phương thức Layer.fireFwdPut protected void fireFwdPut(Pattern pattern) {
if ( aOutputPatternListener == null ) { return;
};
int currentSize = aOutputPatternListener.size(); OutputPatternListener tempListener = null;
for ( int index = 0; index < currentSize; index++ ){ tempListener = (OutputPatternListener)aOutputPatternListener.elementAt(index); if ( tempListener != null ) { tempListener.fwdPut((Pattern)pattern.clone()); }; }; }
Phương thức Layer.fireFwdPut chịu hai trách nhiệm. Thứ nhất, nó áp các trọng số kết nối giữa các nơron ở lớp hiện thời cho các nơron ở lớp tiếp theọ Thứ hai, nó chuyển mẫu này đến synapsẹ Phương thức này chuyển mẫu đến synapse bằng cách gọi phương thức SynapsẹfireFwdPut. Phương thức SynapsẹfireFwdPut được chỉ ra trong danh sách 2.4.
Danh sách 2.4: Phương thức SynapsẹfireFwdPut public synchronized void fwdPut(Pattern pattern) { if ( isEnabled() ) { count = pattern.getCount(); while ( items > 0 ) { try { wait(); } catch ( InterruptedException e ) { //ẹprintStackTrace(); return; } } m_pattern = pattern; inps = (double[])pattern.getArray(); forward(inps); ++items; notifyAll(); } }
Khi vòng lặp chờ hoàn thành synapse, nó sẽ xử lý dữ liệu đầu vào, và sau đó truyền mẫu tới lớp tiếp theọ Việc xử lý chỉ là synapse sẽ thực hiện trên mẫu để áp độ lệch. Theo các quy trình của phương thức SynapsẹfwdPut, nó sẽ sao chép mẫu mà nó đã truyền vào biến lớp m_pattern.
m_pattern = pattern;
Mảng mẫu sau đó được sao chép tới một mảng hai giá trị để xử lý.
inps = (double[])pattern.getArray();
Sau đó, mảng mẫu hai giá trị được truyền vào phương thức forward. Trong tất cả các lớp, phương thức forward luôn luôn được sử dụng để áp độ lệch.
forward(inps);
Khi độ lệch đã được áp, mẫu được sẵn sàng được xử lý ở lớp tiếp theọ Có nhiều loại synapse được tạo để có thể xử lý độ lệch theo các cách khác nhaụ Bây giờ, chúng ta sẽ xem xét phương thức FullSynapsẹforward áp dụng độ lệch được chỉ ra trong danh sánh 2.5.
Danh sách 2.5: Phương thức FullSynapsẹforward public void forward(double[] pattern) {
int x; double in; int n = getRows(); try { for ( x = 0; x < n; ++x ) { in = pattern[x] + bias.value[x][0]; outs[x] = 1 / (1 + Math.exp(-in)); }
} catch ( Exception aioobe ) { aioobẹprintStackTrace(); }
}
Ta có thể thấy độ lệch được áp cho mỗi phần tử của mẫu, và mẫu sẽ được thêm vào một độ lệch. Giá trị nghịch đảo của tổng này sẽ được trả về phương thức
calling để được truyền tới lớp tiếp theọ Các quá trình này sẽ được lặp lại cho mỗi lớp của mạng nơron. Sau đây ta xem chúng sẽ thực thi lan truyền ngược trở lại như thế nàọ