本文参考《Python神经网络编程》的相关章节
上文中我们使用神经网络实现对手写数字的识别,那我们反向的给出一个标签,即给出[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],从输出反向推导出输入,应该是什么样子呢?
其实可以想象得到,逆推的结果如果将其实例化,应该是对应的数字图片,图片越清晰,越标准,说明我们的学习效果越好。
对数几率函数的反函数(是叫反函数是吧)为:
在上一篇文章中我们使用的是:
import scipy.special as spc
def sigmoid(z):
return spc.expit(z)
它的反函数为:
import scipy.special as spc
def reverse_sigmoid(z):
return spc.logit(z)
编码的详细过程我就不细说了,比较简单,不懂得请参考《Python神经网络编程》相关章节
代码如下:
import numpy as np
import scipy.special as spc
from matplotlib import pyplot as plt
#逆推结果
def reverse_explore(label, weight1, weight2, value1, value2):
final_outputs = np.array(label, ndmin = 2)
final_inputs = reverse_sigmoid(final_outputs) + value2
hidden_outputs = np.dot(final_inputs, weight2.T)
#数值大小调整到0~1之间
hidden_outputs -= np.min(hidden_outputs)
hidden_outputs /= np.max(hidden_outputs)
hidden_outputs *= 0.98
hidden_outputs += 0.01
hidden_inputs = reverse_sigmoid(hidden_outputs) + value1
inputs = np.dot(hidden_inputs, weight1.T)
#数值大小调整到0~1之间
inputs -= np.min(inputs)
inputs /= np.max(inputs)
inputs *= 0.98
inputs += 0.01
return inputs
import scipy.special as spc
def reverse_sigmoid(z):
return spc.logit(z)
#用于读取之前保存的参数文件
def read_parameter(filename):
parameter = []
for i in filename:
fp = open(i, 'r')
dataset = []
for j in fp.readlines():
a = j.strip().split(' ')
dataset.append([float(k) for k in a])
parameter.append(np.array(dataset))
return parameter
if __name__ == '__main__':
#读取训练好的参数
filename = ['weight1.txt', 'weight2.txt', 'value1.txt', 'value2.txt']
parameter = read_parameter(filename)
weight1 = parameter[0]
weight2 = parameter[1]
value1 = parameter[2]
value2 = parameter[3]
#对为一种标签,求其逆推结果
for i in range(10):
label = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
label[i] = 0.99
inputs = reverse_explore(label, weight1, weight2, value1, value2)
#对结果可视化
plt.imshow(inputs.reshape(28, 28), cmap = 'Greys', interpolation = 'None')
plt.show()
其中直接使用已经训练好的参数,大家可以用自己训练出来的参数,如果嫌麻烦,可以下载我的训练结果(文件)
先关文件和源代码已上传至我的资源:https://download.csdn.net/download/qq_41398808/11232517
一下一次列出0~9的逆推结果可视化后的图像:
0
1
2
3
4
5
6
7
8
9
可以看出和我们想象的结果是一致的 ,人工神经网络最终学到了,样例的一般特点(属性),所以从大体上可以看出逆推出来的是什么,但是又受到不同样例的特有特点(属性)的影响,所以逆推结果的边界十分模。
不得不感慨人工智能,机器学习中的种种算法是多么的有趣,多么的神奇啊