python神经网络编程3之一些有趣的尝试
【自己的手写数字】
1.创建较小的PNG图片,把它们调整到28*28像素,从而可以匹配用过的来自MNIST数据集的图片
2.从常见图像文件格式读取和解码数据
import scipy.misc#导入库 img_array=scripy.misc.imread(image_file_name,flatten=True) #scripy.misc.imread从png或jpg或其他图像文件中读数据 #flatten=True把图像变成简单的浮点数数组,彩图变灰度图 img_data=255.0-img_array.reshape(784) #重塑28*28方块为一串数值 #将数组的值减去255(MNIST不同寻常,用0表白色,255表黑色) img_data=(img_data/255.0*0.99)+0.01#将数据值范围缩放至0.01-1.0
【神经网络大脑内部】
训练并测试好的神经网络是一个新生的黑盒子——不知道黑盒子咋算出答案,但它就是能算出来
虽然黑盒子神经网络已学会求解问题的方法,但学到的知识不能转化成对问题的理解和智慧
神经网络的工作方式是:将学习分布到不同的链接权重中,使神经网络对损坏有弹性,删除一个甚至多个节点,都不太可能彻底破坏神经网络的工作能力
——————————
如果给一个标签到输出节点,通过已受训练的网络反向输入信号,直到输入节点弹出一个图像,会怎么样?
若$y=f(x)$是正向激活函数,
则函数的逆$x=g(y)$
#举个栗子
若$\displaystyle{y=\frac{1}{1+e^{-x}}}$,
则$\displaystyle{1+e^{-x}=\frac{1}{y}}$,
则$\displaystyle{e^{-x}=\frac{1}{y}-1=\frac{1-y}{y}}$,
则$\displaystyle{-x=ln\frac{1-y}{y}}$
故$\displaystyle{x=ln\frac{y}{1-y}}$,即所谓的对数函数
python的scipy.special库为逻辑S函数提供了scipy.special.expit(),也为对数函数提供了函数special.logit()
如果向输出节点展示一些值,它可能会弹出和标签匹配的图像
【创建新的训练数据:数据增强 eg.旋转图像】
神经网络必须尽可能多学习变化的类型,有的被压扁,有的很宽,有的旋转了,有的顶部开了,有的顶部闭着——这种多样的类型对神经网络的学习有好处!
用python拓展包和程序库做数据增强
#ndimage.interpolation rotate()将数组转过给定角度 #设得到了先前的scaled_input数组 #create rotated variation #rotated anticlockwise by 10 degrees inputs_plus10_img=scipy.ndimage.interpolation.rotate(scaled_input.reshape(28,28),10,cval=0.01,reshape=False) #rotated clockwise by 10 degrees inputs_minus10_img=scipy.ndimage.interpolation.rotate(scaled_input.reshape(28,28),-10,cval=0.01,reshape=False)
在10个epochs的情况下,神经网络的性能会出现峰值,最佳状态接近98%!nice!