Xét bài toán phục hồi ảnh đen trắng kích cỡ 4 x 4. Như vậy mỗi ảnh sẽ có 16 điểm ảnh. Ta thiết kế một mạng neural hopfield với 16 neural vào và 16 neural ra.
Hình 3.1: Mạng neural hopfield với 16 neural vào và 16neural ra với n = 256neural.
Giả sử ban đầu ta có mẫu sau:
P = (0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1)
Đầu vào của mạng nhận được từ ma trận ảnh trên, lấy từng dòng một, những điểm ảnh có giá trị là 1 thì ta đổi thành -1, điểm ảnh có giá trị là 0 đổi thành 1, ta được đầu vào như sau:
P’ =(1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, -1,-1,-1) Đoạn code sau thực hiện công việc trên:
Bitmap b = newBitmap(imgPattern);
patternPixels = newint[imageDim, imageDim];
List<Neuron> pattern = newList<Neuron>(imageDim * imageDim);
for (int j = 0; j < imageDim; j++) {
Neuron n = newNeuron();
p = Math.Abs(b.GetPixel(i, j).ToArgb()); if (p < midColor)
{
b.SetPixel(i, j, Color.White);
n.State = NeuronStates.AlongField;//1
} else
{
b.SetPixel(i, j, Color.Black);
n.State = NeuronStates.AgainstField;//-1
}
pattern.Add(n);// add cac neural
}
Từ đầu vào của mạng ta tính ma trận trọng số dựa vào công thức (3.1): M si sj s 1 ij x x NÕu i j W NÕui j 0
Đoạn code sau thực hiện tính ma trận trọng số của mạng. Ở đây ma trận trọng số được lưu vào ma trận T:
publicvoid AddPattern(List<Neuron> Pattern)
{
for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) {
if (i == j) T[i, j] = 0;
else T[i,j] +=(Pattern[i].State *
m++; }
Tạo mạng neural với kích thước 16 neural như sau:
Ban đầu tạo một số nguyên ngẫu nhiên trong đoạn [0, 1], nếu số đó là 0 thì gán điểm ảnh trong mạng đó là màu đen và trạng thái của neural tại điểm đó sẽ có giá trị là -1. Ngược lại là 1 thì gán điểm ảnh đó là màu trắng và trạng thái của neural tại điểm đó sẽ có giá trị là 1.
privatevoid CreateNNBut_Click(object sender, EventArgs e)
{
NN = newNeuralNetwork(imageDim*imageDim); panelStoredImages.Controls.Clear();
NN.EnergyChanged +=
newEnergyChangedHandler(NN_EnergyChanged);
Random rnd = newRandom(); int r = 0;
imNNState.pixels = newint[imageDim, imageDim]; for (int i = 0; i < imageDim; i++)
for (int j = 0; j < imageDim; j++) { r = rnd.Next(2); if (r == 0)imNNState.pixels[i, j]= Color.Black.ToArgb(); elseif (r == 1) imNNState.pixels[i, j] = Color.White.ToArgb(); } patternSelected = false; butAddPattern.Enabled = true; butRunDynamics.Enabled = false; imNNState.Visible = true; imNNState.Invalidate(); UpdatePropertiesPB();
}
Gán trạng thái cho các neural trong mạng:
List<HopfieldNeuralNetwork.Neuron> initialState = newList<HopfieldNeuralNetwork.Neuron>(NN.N);
for (int i = 0; i < imageDim; i++) for (int j=0;j<imageDim;j++)
{
Neuron neuron = newNeuron();
if (imNNState.pixels[i, j] ==
Color.Black.ToArgb()) neuron.State =
NeuronStates.AgainstField;//-1
elseif (imNNState.pixels[i, j]==
Color.White.ToArgb())
neuron.State = NeuronStates.AlongField;//1 initialState.Add(neuron);
}
Hàm năng lượng của mạng là: (Vì không có tín hiệu bên ngoài nên hệ số bias = 0) E= - i j N j i ijVV W 2 1 , với i, j= 1, 2, ..., N
Tại mỗi thời điểm t mỗi neural i tổng hợp các tín hiệu Vj từ những neural khác: N 1 i ij j j i U W V Ta có: Vi f Ui( i), với fi là hàm kích hoạt. Ở đây ta sử dụng hàm kích hoạt hardlims nên:
1 ,ví i i = 1,...., N (N lµ sè neural trong m¹ng) 1 i V
Năng lượng tại neural i là: Ei = -ViUi
Nếu Ei< 0 thì Vi(t+1) = Vi(t). Nếu Ei> 0 thì Vi(t+1) = -Vi(t).
Mạng đạt trạng thái cân bằng nếu: Vi(t+1) = Vi(t) với i= 1, 2,…, N Thủ tục tính giá trị năng lượng của mạng:
privatevoid CalculateEnergy()
{
doubletempE = 0;
for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (i != j)
tempE += T[i, j] * neurons[i].State * neurons[j].State;
e = -1 * tempE / 2; }
Thủ tục thay đổi trạng thái của neural thứ i tại thời điểm t+1 là (trạng thái của mạng neural được lưu vào biến u):
publicvoid Run(List<Neuron> initialState)
{ this.neurons = initialState; int k = 1;
int u = 0;
while(k != 0)
{ k = 0;
for (int i = 0; i < n; i++) { u = 0;
for (int j = 0; j < n; j++)
u += T[i, j] * (neurons[j].State);// tính năng lượng tại neural thứ i
if (neurons[i].ChangeState(h))//ktra trang thai
{ k++;
OnEnergyChanged(new EnergyEventArgs(e,i)); } } } CalculateEnergy(); }
Thủ tục OnEnergyChanged() được viết như sau: protectedvirtualvoid OnEnergyChanged(EnergyEventArgs e) {
if (EnergyChanged != null) EnergyChanged(this, e); }
Hàm kiểm tra năng lượng tại neural thứ i và thay đổi trạng thái của neural thứ i: public bool ChangeState(Double field) { bool res = false; if (field * this.State < 0) { this.state = -this.state; res = true; } return res; } Thủ tục làm biến dạng ảnh được viết như sau: void im_Click(object sender, EventArgs e) {
ImageMagnifier.ImageMagnifier im = ImageMagnifier.ImageMagnifier)sender; this.imNNState.ImageToMagnify = im.ImageToMagnify;
frmAddDistortion frmaddDistortion = newfrmAddDistortion(); frmaddDistortion.ShowDialog();
Random r = newRandom(); int p=0; int k=0; for(int i = 0;i<frmaddDistortion.DistortionLevel;i++) { p = r.Next(imageDim); k = r.Next(imageDim); if (imNNState.pixels[k, p]== Color.Black.ToArgb()) imNNState.pixels[k, p] = Color.White.ToArgb(); elseif (imNNState.pixels[k, p]== Color.White.ToArgb()) imNNState.pixels[k, p] = Color.Black.ToArgb(); } lblEnergy.Text = "0"; patternSelected = true; imNNState.Invalidate(); }
Thủ tục để khôi phục lại những điểm ảnh bị nhiễu:
private void NN_EnergyChanged(object sender,EnergyEventArgs e)
{
lblEnergy.Text = e.Energy.ToString(); int i = (int)e.NeuronIndex / imageDim;
int j = e.NeuronIndex % imageDim; if (imNNState.pixels[i, j] == Color.White.ToArgb()) imNNState.pixels[i, j] = Color.Black.ToArgb(); else if (imNNState.pixels[i, j] == Color.Black.ToArgb()) imNNState.pixels[i, j] = Color.White.ToArgb(); imNNState.Invalidate(); Application.DoEvents(); System.Threading.Thread.Sleep(100); }
Giả sử ta có 4 mẫu ảnh sau:
X1=(0,0,1,1,0,0,1,1,1,1,0,0,1,1,0,0) X3=(1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1)
X2=(0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0) X4=(1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1) Kết quả thử nghiệm với các ảnh trên có nhiễu tại 2,5,13 điểm ảnh (tương ứng với 13, 31 và 81%) được cho trên hình 3.2. Hơn nữa, với ảnh đầu vào có cùng số điểm ảnh biến dạng có thể dẫn tới những hành vi khác nhau (không hội tụ giống nhau, số vòng lặp khác nhau ...). Nếu có hơn 50% điểm ảnh biến dạng thì ảnh được tái tạo ở đầu ra là âm bản của ảnh gốc.
Mẫu X1 Mẫu X2 Mẫu X3 Mẫu X4
Hình 3.2 Thí nghiệm mạng với ảnh nhiễu.