三层神经网络的反向查询

前面讲的都是前向传播,已知输入层数据,计算出输出层结果。如果我们已知输出层结果是否可以反向推理出图片的像素值呢。在前面的神经网络基础上面进行修改。

1.训练

训练神经网络和前面讲的一样。

2.定义反向查询函数

1.>定义反向激活函数。利用logit函数

self.inverse_activation_function = lambda x: spc.logit(x)

2.>利用已知结果得到激活之前的输出值,在通过矩阵点乘得到激活之后的隐藏层的值,在通过反向激活函数得到激活之前的隐藏层值,在通过矩阵点乘得到输入值。逻辑和前向传播逻辑相反。

final_output = np.array(target_list, ndmin=2).T
final_input = self.inverse_activation_function(final_output)
hidden_output = np.dot(self.who.T, final_input)
hidden_output -= np.min(hidden_output)
hidden_output /= np.max(hidden_output)
hidden_output *= 0.98
hidden_output += 0.01
hidden_input = self.inverse_activation_function(hidden_output)
inputs = np.dot(self.wih.T, hidden_input)
inputs -= np.min(inputs)
inputs /= np.max(inputs)
inputs *= 0.98
inputs += 0.01

中间有调整点乘之后的矩阵值大小,使其在0.01到1.0之间

3.测试

定义已知结果。输出层为10个节点,默认值为0.01。当已知输入节点为0时,输出层的第1个节点的输出值为0.99

for i in range(10):
target = np.zeros(10) + 0.01
target[i] = 0.99
inputs = mnist.backquery(target)

用图形化显示得到的输入层节点的值

plt.imshow(inputs.reshape(28, 28), cmap='Greys', interpolation='None')
plt.show()

 

 
 

上面的图形化显示的值不太清晰,所以我们可以在用前向传播测试下得到的输入值。

mnist.train2(inputs, target)
final = mnist.query2(inputs)
label = np.argmax(final)
if label == i:
print("i is:", i, "success")
else:
print("i is:", i, "label is:", label, "fail")

输出结果显示如下:

 

可以看到成功率大概在70%

上面代码的地址为:https://github.com/pythonAndAI/nerve-net/blob/master/com/test/otherExercises/backquery.py

转载于:https://www.cnblogs.com/bestExpert/p/10361305.html

以下是三层神经网络反向传播算法的 MATLAB 代码: ``` % 设置输入层、隐藏层和输出层的神经元个数 input_layer_size = 2; % 输入层神经元个数 hidden_layer_size = 4; % 隐藏层神经元个数 num_labels = 1; % 输出层神经元个数 % 初始化权重矩阵 Theta1 = rand(hidden_layer_size, input_layer_size + 1) * 2 - 1; % 隐藏层权重矩阵 Theta2 = rand(num_labels, hidden_layer_size + 1) * 2 - 1; % 输出层权重矩阵 % 加载训练数据 load('data.mat'); % 定义代价函数 function J = costFunction(X, y, Theta1, Theta2) % 前向传播计算输出值 m = size(X, 1); a1 = [ones(m, 1) X]; z2 = a1 * Theta1'; a2 = [ones(m, 1) sigmoid(z2)]; z3 = a2 * Theta2'; h = sigmoid(z3); % 计算代价函数 J = sum(-y .* log(h) - (1 - y) .* log(1 - h)) / m; end % 定义 sigmoid 函数 function g = sigmoid(z) g = 1 ./ (1 + exp(-z)); end % 定义 sigmoid 函数的导数 function g = sigmoidGradient(z) g = sigmoid(z) .* (1 - sigmoid(z)); end % 定义反向传播算法 function [Theta1_grad, Theta2_grad] = backpropagation(X, y, Theta1, Theta2) % 前向传播计算输出值 m = size(X, 1); a1 = [ones(m, 1) X]; z2 = a1 * Theta1'; a2 = [ones(m, 1) sigmoid(z2)]; z3 = a2 * Theta2'; h = sigmoid(z3); % 计算误差 delta3 = h - y; delta2 = delta3 * Theta2 .* sigmoidGradient([ones(m, 1) z2]); delta2 = delta2(:, 2:end); % 计算梯度 Theta1_grad = delta2' * a1 / m; Theta2_grad = delta3' * a2 / m; end % 训练神经网络 options = optimset('MaxIter', 1000); [nn_params, cost] = fmincg(@(p)(costFunction(X, y, reshape(p(1:hidden_layer_size * (input_layer_size + 1)), hidden_layer_size, input_layer_size + 1), reshape(p(hidden_layer_size * (input_layer_size + 1) + 1:end), num_labels, hidden_layer_size + 1))), [Theta1(:); Theta2(:)], options); Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), hidden_layer_size, input_layer_size + 1); Theta2 = reshape(nn_params(hidden_layer_size * (input_layer_size + 1) + 1:end), num_labels, hidden_layer_size + 1); % 预测新样本的输出值 x_new = [1.5, 2.0]; % 新样本的输入值 a1_new = [1 x_new]; z2_new = a1_new * Theta1'; a2_new = [1 sigmoid(z2_new)]; z3_new = a2_new * Theta2'; h_new = sigmoid(z3_new); ``` 注:此代码是一个简单的三层神经网络反向传播算法,只适用于二分类问题,如果要应用到多分类问题中,则需要做一些修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值