很多同学都实现了,TensorFlow对于mnist自带的数据集,来训练模型和测试。这里对于tensorflow 自己制作Minist数据集,用训练好的模型来测试准确率。加深你对卷积神经网络的理解。

首先我们需要利用已知的mnist数据集来训练模型,代码和结果如下:

import tensorflow as tf

from tensorflow.keras import layers ,models
from tensorflow.examples.tutorials.mnist import input_data

#读取模型
mnist = input_data.read_data_sets('D:\Program Files (x86)\ANACONDA\Minist_data', one_hot = False)

#创建网络
model = models.Sequential()
#第一个卷积层 28x28x1 change to 24x24x32
model.add(layers.Conv2D(32,kernel_size = [5,5],activation='relu',input_shape=(28,28,1)))
#第一个池化层层24x24x32 change to 12x12x32
model.add(layers.MaxPooling2D([2,2]))
#第二个卷积层 12x12x32 change to 8x8x64
model.add(layers.Conv2D(64,kernel_size = [5,5],activation='relu'))
#第二个池化层 8x8x64 change to 4x4x64
model.add(layers.MaxPooling2D([2,2]))
 #全连接层 4*4*64(每一个特征图4*4,共有64个),变化成一行4*4*64,便于全连接         
model.add(layers.Flatten())
#这个就是全连接层的计算 [1,4x4x64] change to [1, 1024]       
model.add(layers.Dense(1024,activation = 'relu'))
model.add(layers.Dense(10, activation = 'softmax'))
# [1,1024] change to [1, 10]    
model.summary()

#把最有最优算的参数   
check_path = 'D:/研究生资料/tensorflow/1.hdf5'
        # period 每隔5epoch保存一次
save_model_cb = tf.keras.callbacks.ModelCheckpoint(
     check_path,save_best_only=False ,monitor='val_acc',save_weights_only=False, verbose=1, period=1)
#设置模型的优化类型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#填充数据,总共循环10次
model.fit(mnist.train.images.reshape((55000,28,28,1)),mnist.train.labels, epochs = 2, callbacks = [save_model_cb]) 

#根据算的权值,计算准确率
test_loss, test_acc = model.evaluate(mnist.test.images.reshape(10000,28,28,1)
            , mnist.test.labels) 
print('\n')
print('测试集的准确率:')
print("准确率: %.4f,共测试了%d张图片 " % (test_acc,len(mnist.test.images)))

训练结果:
这里只进行了两次大循环!

Epoch 1/2
54944/55000 [============================>.] - ETA: 0s - loss: 0.1083 - acc: 0.9669   
Epoch 00001: saving model to D:/研究生资料/tensorflow/1.hdf5
55000/55000 [==============================] - 83s 2ms/sample - loss: 0.1082 - acc: 0.9669
Epoch 2/2
54944/55000 [============================>.] - ETA: 0s - loss: 0.0371 - acc: 0.9890  
Epoch 00002: saving model to D:/研究生资料/tensorflow/1.hdf5
55000/55000 [==============================] - 75s 1ms/sample - loss: 0.0373 - acc: 0.9890
10000/10000 [==============================] - 3s 349us/sample - loss: 0.0325 - acc: 0.9890

测试集的准确率:
准确率: 0.9890,共测试了10000张图片

程序跑完,在对应的文件夹就会生成我们的模型(这里我们是把模型和权重一起保存下来),如图所示:

tensorflow 模型训练参数 var_list tensorflow简单的模型训练_深度学习

第二步就需要你在网上自己找图片,网上的手写集图片到处都是,把它转换成 28x28的格式,转换格式的代码如下:

from PIL import Image
import numpy as np

def produceImage(file_in, width, height, file_out):
    image = Image.open(file_in)
    resized_image = image.resize((width, height), Image.ANTIALIAS)
    resized_image.save(file_out)
 
if __name__ == '__main__':
  file_in = r'C:\Users\lenovo\Desktop\新建文件夹 (3)\4.jpg'
  width = 28
  height = 28
  file_out = r'C:\Users\lenovo\Desktop\新建文件夹 (3)\4_1.jpg'
  produceImage(file_in, width, height, file_out)
  #把图像转化为黑白的
  im = Image.open(r'C:\Users\lenovo\Desktop\新建文件夹 (3)\4_1.jpg')
  L = im.convert("L")
  L.save(r'C:\Users\lenovo\Desktop\新建文件夹 (3)\4_2.jpg')

我只找了两张照片,转换格式后,4_2,5_1就是对应的检测图片,如下图所示:

tensorflow 模型训练参数 var_list tensorflow简单的模型训练_图像识别_02


最后我们调用模式去测试就可以了!!!

我们就大功告成了!

调用模型的.py文件如下:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from PIL import Image
import numpy as np

mnist = input_data.read_data_sets('D:\Program Files (x86)\ANACONDA\Minist_data', one_hot = False)

im_4 = Image.open(r'C:\Users\lenovo\Desktop\新建文件夹 (3)\4_2.jpg')
im_4 = np.reshape(im_4, [1,28,28,1])
im_5 = Image.open(r'C:\Users\lenovo\Desktop\新建文件夹 (3)\5_1.jpg')
im_5 = np.reshape(im_5, [1,28,28,1])
#因为我们5背景是白的,数字是黑的
#我们训练的时候,数字是白的,背景是黑的,所以需要转换
im_5 = 255 - im_5
#调用模型
new_model =tf.keras.models.load_model('D:/研究生资料/tensorflow/tf_cnn_model/cp.hdf5')
#进行预测
pe_4 = new_model.predict(im_4)
pe_5 = new_model.predict(im_5)
#把最大的坐标找到,因为new_model.predict返回的是[0,0,1,0,0,0,0,0,0,0]这种格式,
#所以需要转换为我们熟悉的格式
pe_4 = tf.argmax(pe_4 ,1)
pe_5 = tf.argmax(pe_5 ,1)

with tf.Session() as sess:
    print(sess.run(pe_4))
    print(sess.run(pe_5))

运行结果:

[4]
[5]

哈哈 结果是对的 说明我们训练的模型挺好的。