'''1---神经网络有单层感知器和多层感知器,多层感知器又叫MLP算法,多层神经网络算法又叫深度学习算法'''
'''2---在生成隐藏层之后要对结果进行非线性矫正(relu)和(tanh)双曲正切处理,都对样本特征进行简化,使神经网络可以学习复杂的非线性数据集'''
'''3---MLP算法中的参数:activation就是对数据进行非线性处理,有四种方法:identity(对样本不做处理),logistic(与tanh类似),tanh,relu。
alpha是用来控制正则化程度的,hidden_layer_sizes默认值是[100],意味着有一个隐藏层,节点数是100,如果是[10,10],就是两层,节点数是10'''
'''4---我们有四种办法来调节模型的复杂程度:
(1)调整神经网络的每一个隐藏层的节点数
(2)调节神经网络的隐藏层的层数
(3)调节activation
(4)通过调整alpha的值来改变模型的正则化程度'''
'''5---在神经网络的算法中,样本的特征权重在模型开始学习前就已经随机生成了,如果不指定随机数,会导致模型的边界不一样,但只要模型复杂程度不变,准确率就不会收到影响'''
代码如下:
#实战训练---手写识别
#使用MNIST数据集训练图像识别
#目前为止,对MNIST数据集错误率最低的学术论文是卷积神经网络
import numpy as np
from sklearn.datasets import fetch_openml
fetch=fetch_openml('mnist_784')
print(fetch)
print('样本的数量和特征数',fetch.data.shape)#(70000, 784)
#进行数据预处理
x=fetch.data/255
y=fetch.target
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=50000,test_size=10000,random_state=62)
#开始训练神经网络
from sklearn.neural_network import MLPClassifier
#lbfgs:quasi-Newton方法的优化器,(relu)非线性矫正,alpha控制正则化程度
mlp=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[100,100],activation='relu',alpha=1e-5,random_state=62)
mlp.fit(x_train,y_train)
print('测试数据集得分是:','%3f'%mlp.score(x_test,y_test))
#进行图像识别
from PIL import Image
image=Image.open('8.jpg').convert('F')#这时候将图片转换成32位的浮点灰色图像,每个像素用32bit表示,0代表黑,255代表白。除于255之后就是,0代表黑色,1代表白色
#调整图像大小
image=image.resize((28,28))
#创建一个空列表
arr=[]
#将图像的像素作为预测数据点的特征
for i in range(28):
for j in range(28):
#在MNIST数据集中,0代表白色,1代表黑色,所以要用1进行相减
pixel=1.0-float(image.getpixel((j,i)))/255#getpixel()函数是用来获取图像中某一点的像素的RGB颜色值,getpixel的参数是一个像素点的坐标。对于图象的不同的模式,getpixel函数返回的值不同。
arr.append(pixel)
arr1=np.array(arr).reshape(1,-1)#数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。
print(mlp.predict(arr1)[0])
手写数字:
运行结果:
样本的数量和特征数 (70000, 784)
测试数据集得分是: 0.976600
8