完善以下程序:clear all X = [ 0 0 1; 0 1 1; 1 0 1; 1 1 1; ]; D = [ 0 0 1 1 ]; E1 = zeros(1000, 1); E2 = zeros(1000, 1); W11 = 2*rand(4, 3) - 1; % Cross entropy W12 = 2*rand(1, 4) - 1; % W21 = W11; % Sum of squared error W22 = W12; % for epoch = 1:1000 [W11 W12] = BackpropCE(W11, W12, X, D); [W21 W22] = BackpropXOR(W21, W22, X, D); es1 = 0; es2 = 0; N = 4; for k = 1:N x = X(k, :)'; d = D(k); v1 = W11*x; y1 = Sigmoid(v1); v = W12*y1; y = Sigmoid(v); % 填空:es1=? v1 = W21*x; y1 = Sigmoid(v1); v = W22*y1; y = Sigmoid(v); % 填空:es2=? end E1(epoch) = es1 / N; E2(epoch) = es2 / N; end plot(E1, 'r') hold on plot(E2, 'b:') xlabel('Epoch') ylabel('Average of Training error') legend('Cross Entropy', 'Sum of Squared Error')
时间: 2023-06-15 12:04:30 浏览: 70
clear all
X = [ 0 0 1;
0 1 1;
1 0 1;
1 1 1;
];
D = [ 0
0
1
1
];
E1 = zeros(1000, 1);
E2 = zeros(1000, 1);
W11 = 2*rand(4, 3) - 1; % Cross entropy
W12 = 2*rand(1, 4) - 1; %
W21 = W11; % Sum of squared error
W22 = W12; %
for epoch = 1:1000
[W11, W12, es1] = BackpropCE(W11, W12, X, D);
[W21, W22, es2] = BackpropXOR(W21, W22, X, D);
es1 = 0;
es2 = 0;
N = 4;
for k = 1:N
x = X(k, :)';
d = D(k);
v1 = W11*x;
y1 = Sigmoid(v1);
v = W12*y1;
y = Sigmoid(v);
es1 = es1 + CrossEntropy(d, y); % 填空:es1=?
v1 = W21*x;
y1 = Sigmoid(v1);
v = W22*y1;
y = Sigmoid(v);
es2 = es2 + SSE(d, y); % 填空:es2=?
end
E1(epoch) = es1 / N;
E2(epoch) = es2 / N;
end
plot(E1, 'r')
hold on
plot(E2, 'b:')
xlabel('Epoch')
ylabel('Average of Training error')
legend('Cross Entropy', 'Sum of Squared Error')
% 交叉熵损失函数
function [loss] = CrossEntropy(d, y)
loss = -1 * (d * log(y) + (1 - d) * log(1 - y));
end
% 平方误差损失函数
function [loss] = SSE(d, y)
loss = (d - y) ^ 2;
end
% Sigmoid激活函数
function [y] = Sigmoid(x)
y = 1 ./ (1 + exp(-x));
end
% 反向传播算法(Cross Entropy版本)
function [W1, W2, e] = BackpropCE(W1, W2, X, D)
alpha = 0.9;
N = 4;
e = 0;
for k = 1:N
x = X(k, :)';
d = D(k);
v1 = W1 * x;
y1 = Sigmoid(v1);
v = W2 * y1;
y = Sigmoid(v);
e = e + CrossEntropy(d, y);
delta = d - y;
delta1 = y1 .* (1 - y1) .* (W2' * delta);
dW2 = alpha * delta * y1';
dW1 = alpha * delta1 * x';
W2 = W2 + dW2;
W1 = W1 + dW1;
end
end
% 反向传播算法(Sum of Squared Error版本)
function [W1, W2, e] = BackpropXOR(W1, W2, X, D)
alpha = 0.9;
N = 4;
e = 0;
for k = 1:N
x = X(k, :)';
d = D(k);
v1 = W1 * x;
y1 = Sigmoid(v1);
v = W2 * y1;
y = Sigmoid(v);
e = e + SSE(d, y);
delta = (d - y) .* y .* (1 - y);
delta1 = y1 .* (1 - y1) .* (W2' * delta);
dW2 = alpha * delta * y1';
dW1 = alpha * delta1 * x';
W2 = W2 + dW2;
W1 = W1 + dW1;
end
end