首先,下载官网自带数据集:
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("路径名", one_hot=True)
接着将下载好的数据解码为图片:
from PIL import Image
import struct
def read_image(filename):
f = open(filename, 'rb')
index = 0
buf = f.read()
f.close()
magic, images, rows, columns = struct.unpack_from('>IIII' , buf , index)
index += struct.calcsize('>IIII')
for i in range(images):
#for i in xrange(2000):
image = Image.new('L', (columns, rows))
for x in range(rows):
for y in range(columns):
image.putpixel((y, x), int(struct.unpack_from('>B', buf, index)[0]))
index += struct.calcsize('>B')
print ('save ' + str(i) + 'image')
image.save('保存路径' + str(i) + '.png')
def read_label(filename, saveFilename):
f = open(filename, 'rb')
index = 0
buf = f.read()
f.close()
magic, labels = struct.unpack_from('>II' , buf , index)
index += struct.calcsize('>II')
labelArr = [0] * labels
#labelArr = [0] * 2000
for x in range(labels):
#for x in xrange(2000):
labelArr[x] = int(struct.unpack_from('>B', buf, index)[0])
index += struct.calcsize('>B')
save = open(saveFilename, 'w')
save.write(','.join(map(lambda x: str(x), labelArr)))
save.write('\n')
save.close()
print ('save labels success')
if __name__ == '__main__':
read_image('./t10k-images.idx3-ubyte')
read_label('./t10k-labels.idx1-ubyte', './label.txt')
然后这里我训练了100张图片,迭代了100次,所以准确率上可能会不是很好:
#minist
import tensorflow as tf
import numpy as np
import time
import os
import matplotlib.image as mgimg
from sklearn.preprocessing import OneHotEncoder
def read_label():
label=[]
with open("./pic/test/label.txt","r") as f:
for labels in f:
for one in labels:
if one !="," and one !="\n":
label.append(int(one))
return label
def read_pic_data(path,i):
data = []
full_path = path + '%d'%i + ".png"
data = mgimg.imread(full_path)
return data #28*28
label1=read_label()
label=np.array(label1)
label=label.reshape(-1,1)
label.astype("float32")
label=OneHotEncoder().fit_transform(label).todense()
data=[]
path="路径"
for i in range(100):
Data=read_pic_data(path,i)
data.append(Data)
data=np.array(data)
data.astype("float32")
data=data.reshape(-1,28,28,1)
data1=[]
for i in range(100,200):
Data=read_pic_data(path,i)
data1.append(Data)
data1=np.array(data1)
data1.astype("float32")
data1=data1.reshape(-1,28,28,1)
x=tf.placeholder(tf.float32,shape=[None,28,28,1])
y_actual=tf.placeholder(tf.float32,shape=[None,10])
#构建网络
#卷积
w1=tf.Variable(tf.truncated_normal(shape=[5,5,1,32], stddev=0.1))
b1=tf.Variable(tf.constant(0.1, shape=[32]))
#卷积+激励
conv1=tf.nn.relu(tf.nn.conv2d(x, w1, strides=[1, 1, 1, 1], padding='SAME')+b1)
#池化
pool1=tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')
w2=tf.Variable(tf.truncated_normal(shape=[5,5,32,64], stddev=0.1))
b2=tf.Variable(tf.constant(0.1, shape=[64]))
#卷积+激励
conv2=tf.nn.relu(tf.nn.conv2d(pool1, w2, strides=[1, 1, 1, 1], padding='SAME')+b2)
#池化
pool2=tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')
#第一个全连接
w_f1=tf.Variable(tf.truncated_normal(shape=[7*7*64,1024], stddev=0.1))
b_f1=tf.Variable(tf.constant(0.1, shape=[1024]))
h_pool1=tf.reshape(pool2,[-1,7*7*64])
h_fc1=tf.nn.relu(tf.matmul(h_pool1,w_f1)+b_f1)
#全连接层
w_f2=tf.Variable(tf.truncated_normal(shape=[1024,10], stddev=0.1))
b_f2=tf.Variable(tf.constant(0.1, shape=[10]))
pre=tf.nn.softmax(tf.matmul(h_fc1,w_f2)+b_f2)
#交叉熵loss
loss=-tf.reduce_sum(y_actual*tf.log(pre))
#梯度下降
train_step = tf.train.AdamOptimizer(1e-3).minimize(loss)
#准确率
cor = tf.equal(tf.argmax(pre,1), tf.argmax(y_actual,1))
accuracy = tf.reduce_mean(tf.cast(cor, tf.float32))
def train():
saver=tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
saver=tf.train.Saver(max_to_keep=0)
model_path=r"./train2"
for epoch in range(100):
train=sess.run(train_step,feed_dict={x:data,y_actual:label[0:100]})
if(epoch%10==0):
res=sess.run(accuracy,feed_dict={x:data,y_actual:label[0:100]})
print("epoch=",epoch," module:",res)
if(epoch==99):
output=sess.run(pre,feed_dict={x:data})
save_path=saver.save(sess,model_path)
print("epoch=100",epoch)
def test():
saver=tf.train.Saver()
with tf.Session() as sess:
saver.restore(sess,tf.train.latest_checkpoint("."))
#res=sess.run(accuracy,feed_dict={x:data,y_actual:label[0:100]})
#print("model:",res)
output=sess.run(pre,feed_dict={x:data1})
start=100
for a in output:
lit=[]
for b in a:
lit.append(b)
print(lit.index(max(lit))," ",label1[start])
start+=1
#train()
test()