2023年6月29日发(作者:)
30⾏代码就可以实现看图识字!python使⽤搭建简单神经⽹络⽂章⽬录⼤概⼏个⽉前,神经⽹络、⼈⼯智能等概念在我⼼⾥仍⾼不可攀,直到⾃⼰亲⾝上⼿之后,才发现搭建神经⽹络并不像⾃⼰想象的那么难。很幸运,我开始学习神经⽹络的时候
Tensorflow2.0已经发布了。Tensorflow2中内置了Keras库,Keras是⼀个由Python编写的开源⼈⼯神经⽹络库,可以作为Tensorflow、Microsoft-CNTK和Theano的⾼阶应⽤程序接⼝,进⾏深度学习模型的设计、调试、评估、应⽤和可视化。⽤Tensorflow2中⾃带的Keras库,会使得搭建神经⽹络变得⾮常简单友好。学习神经⽹络需要的前置知识有:numpy(必需);pandas;matplotlib搭建过程接下来,介绍⽤搭建基本神经⽹络模型的过程:1. 引⼊必需的库import tensorflow as tfimport numpy as np2. 引⼊数据集这⾥的mnist数据集是⾃带的⼿写数据集,⾥⾯存有60000张28x28尺⼨的⿊⽩⼿写数字#引⼊minst(x_train, y_train), (x_test, y_test) = _data()#将读到的每个灰度值除以255进⾏归⼀化,因为keras模型的输⼊值要求在0~1之间x_train, x_test= x_train / 255.0, x_test / 255.03. 搭建神经⽹络层Flatten层⽤于将⼆维数组展开,相当于把图⽚按照每⼀⾏铺平;Dense层就是所谓的全连接神经⽹络层,第⼀个参数是神经元的数量,第⼆个参数是激活函数的类型;relu函数是⼀种线性整流函数,在神经⽹络中有⼴泛的使⽤;softmax是⼀种逻辑回归函数,常⽤于多分类问题,可以使输出值符合概率分布,神经元数量为10,代表会输出10个元素的列表,列表的每个元素相加为1,列表中的每个元素正好符合对应数字的概率(数字有0~9⼗种)model = tial([ #指定输⼊层为Flatten层 n(), #指定第⼆层为Dense层,使⽤relu作为激活函数 (128, activation='relu'), #指定输出层为Dense层,使⽤softmax作为激活函数,使输出概率分布 (10, activation='softmax')])这就是softmax函数,可以看到对于任意x,其对应的y值都在-1~1之间,从⽽实现数据的归⼀化。4. 编译神经⽹络模型第⼀个参数指定优化器为adam,adam结合了⾃适应梯度算法和均⽅根传播,是⼀个⾮常强⼤的优化器指定损失函数的计算⽅法为交叉熵,from_logits=False表⽰数据不是原始输出,即数据满⾜概率分布,因为我们采⽤softmax作为输出层,因此结果是概率分布的指定准确率计算⽅法为多分类准确率 #指定优化器为e(optimizer='adam', #指定损失函数的计算⽅法为交叉熵
loss=CategoricalCrossentropy(from_logits=False), #指定准确率计算⽅法为多分类准确率 metrics=['sparse_categorical_accuracy'])5. 训练模型第⼀个参数表⽰输⼊的训练集,第⼆个参数表⽰训练集本⾝对应的结果,神经⽹络可以通过判断⾃⼰得出的结果与原来给定的结果是否相同,来不断优化⾃⼰的判断;batch_size表⽰每次喂⼊的数据量,mnist数据集中有60000张图⽚,显然不能⼀次喂⼊;epochs表⽰训练次数;validation_data表⽰验证⽤的数据集,验证集并不参与训练,因此⽤验证集判断模型的准确率是客观有效的;validation_freq表⽰验证频率,即多少次训练会做⼀次验证(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_test, y_test), validation_freq=1)到这⾥,⼀个完整的简单神经⽹络就搭建完成了,我们可以欣赏⼀下输出结果,这⾥只截取了第1次和最后2次训练的部分内容,以节省篇幅。可以看到,每次喂⼊数据之后,都显⽰出了训练集的loss误差和accuracy准确率,⽽当每次训练完成时会进⾏⼀次验证,计算出验证集的误差和准确率。我们还发现⼀个现象,第⼀次训练时,每次喂⼊数据都使得loss误差快速下降,正确率上升,⽽到最后⼏次训练时,由于准确率已经很⾼,想要继续优化模型变得困难,准确率便上下波动,不再持续上升:Epoch 1/10 1/1875 [..............................] - ETA: 0s - loss: 2.4223 - sparse_categorical_accuracy: 0.0625 277/1875 [===>..........................] - ETA: 2s - loss: 0.5614 - sparse_categorical_accuracy: 0.8380 567/1875 [========>.....................] - ETA: 1s - loss: 0.4153 - sparse_categorical_accuracy: 0.8792 814/1875 [============>.................] - ETA: 1s - loss: 0.3604 - sparse_categorical_accuracy: 0.89561107/1875 [================>.............] - ETA: 1s - loss: 0.3189 - sparse_categorical_accuracy: 0.90701367/1875 [====================>.........] - ETA: 0s - loss: 0.2925 - sparse_categorical_accuracy: 0.91501592/1875 [========================>.....] - ETA: 0s - loss: 0.2761 - sparse_categorical_accuracy: 0.91971875/1875 [==============================] - 3s 2ms/step - loss: 0.2577 - sparse_categorical_accuracy: 0.9250 - val_loss: 0.1379 - val_sparse_categorical_accuracy: 0.9584Epoch 9/10 1/1875 [..............................] - ETA: 0s - loss: 0.0043 - sparse_categorical_accuracy: 1.0000 347/1875 [====>.........................] - ETA: 2s - loss: 0.0174 - sparse_categorical_accuracy: 0.9986 634/1875 [=========>....................] - ETA: 1s - loss: 0.0173 - sparse_categorical_accuracy: 0.9965 922/1875 [=============>................] - ETA: 1s - loss: 0.0176 - sparse_categorical_accuracy: 0.9945 959/1875 [==============>...............] - ETA: 1s - loss: 0.0177 - sparse_categorical_accuracy: 0.99441286/1875 [===================>..........] - ETA: 0s - loss: 0.0182 - sparse_categorical_accuracy: 0.99431501/1875 [=======================>......] - ETA: 0s - loss: 0.0187 - sparse_categorical_accuracy: 0.99431875/1875 [==============================] - 3s 2ms/step - loss: 0.0193 - sparse_categorical_accuracy: 0.9942 - val_loss: 0.0879 - val_sparse_categorical_accuracy: 0.9763Epoch 10/10 1/1875 [..............................] - ETA: 0s - loss: 0.0164 - sparse_categorical_accuracy: 0.9995 322/1875 [====>.........................] - ETA: 2s - loss: 0.0131 - sparse_categorical_accuracy: 0.9986 610/1875 [========>.....................] - ETA: 1s - loss: 0.0138 - sparse_categorical_accuracy: 0.9976
999/1875 [==============>...............] - ETA: 1s - loss: 0.0146 - sparse_categorical_accuracy: 0.9970
1248/1875 [==================>...........] - ETA: 0s - loss: 0.0147 - sparse_categorical_accuracy: 0.99651285/1875 [===================>..........] - ETA: 0s - loss: 0.0148 - sparse_categorical_accuracy: 0.99591536/1875 [=======================>......] - ETA: 0s - loss: 0.0153 - sparse_categorical_accuracy: 0.99541875/1875 [==============================] - 3s 2ms/step - loss: 0.0157 - sparse_categorical_accuracy: 0.9952 - val_loss: 0.0804 - val_sparse_categorical_accuracy: 0.9789到这⾥,我们的模型就输⼊完成了,只需要提供⼀个输⼊图⽚的函数,便可以完成看图识别数字的任务:import #使⽤PIL库处理图⽚def judge_image(path):"""输⼊图⽚的路径,判断图⽚中的数字是什么""" #打开图⽚ img = (path)
#改变尺⼨为28x28,因为训练集的图⽚⼤⼩就是28x28 img = ((28, 28))
#t⽤于处理图像,L表⽰转换成灰度图 #将灰度图的像素信息排列成array存储 img_array = (t('L')) #遍历每⼀个像素,进⾏⼆值化处理,即把灰度图转换成纯⿊⽩图,以便于模型判断 for row in range(28): for col in range(28): #如果像素偏⽩,就转为纯⿊⾊ if img_array[row][col] < 75: img_array[row][col] = 255 #如果像素偏⿊,就转为纯⽩⾊ else: img_array[row][col] = 0 #将输⼊值归⼀化,满⾜模型输⼊要求 img_array = img_array / 255.0
#由于数据是以batch的形式喂⼊模型,我们需要给数据集添加⼀个维度 #将img_array:(28,28)变为x_predict:(1,28,28),1代表数据量为1张图 x_predict = img_array[s] result = t(x_predict) #利⽤模型进⾏预测 #返回索引为1的值,result中索引为1刚好是预测结果 predict = (result, axis=1) (predict)这样,完整的代码就完成了:import tensorflow as tfimport numpy as npimport PIL(x_train, y_train), (x_test, y_test) = _data()x_train, x_test= x_train / 255.0, x_test / 255.0model = tial([ n(), (128, activation='relu'), (10, activation='softmax')])e(optimizer='adam', loss=CategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy'])(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_test, y_test), validation_freq=1)def judge_image(path): img = (path) img = ((28, 28)) img_array = (t('L')) for row in range(28): for col in range(28): if img_array[row][col] < 75: img_array[row][col] = 255 else: img_array[row][col] = 0 img_array = img_array / 255 x_predict = img_array[s] result = t(x_predict) predict = (result, axis=1) (predict)
效果测试我们来试⼀下预测效果,我准备了⼏张⼿写数字的图⽚:img___ i in 2,5,8: print("The recognized figure of img_%: " % i, end='') judge_image('images/img_%' % i) (1)输出结果为:The recognized figure of img_: [2]The recognized figure of img_: [5]The recognized figure of img_: [8]可以看到,每张图⽚所对应的数字都被识别出来啦!
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687977773a62908.html
评论列表(0条)