• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

机器学习 逆向传播探索神经网络(人工神经网络到底学到了什么)

人工智能 猫猫虫(——) 1787次浏览 0个评论

本文参考《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

机器学习 逆向传播探索神经网络(人工神经网络到底学到了什么)

可以看出和我们想象的结果是一致的 ,人工神经网络最终学到了,样例的一般特点(属性),所以从大体上可以看出逆推出来的是什么,但是又受到不同样例的特有特点(属性)的影响,所以逆推结果的边界十分模。

不得不感慨人工智能,机器学习中的种种算法是多么的有趣,多么的神奇啊


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明机器学习 逆向传播探索神经网络(人工神经网络到底学到了什么)
喜欢 (0)

您必须 登录 才能发表评论!

加载中……