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!

 

posted @ 2022-11-21 18:36  asandstar  阅读(64)  评论(0编辑  收藏  举报