import os import random import numpy as np import tensorflow as tf import matplotlib.pyplot as plt def ReadData(path): x, y = [], [] size=int(len(os.listdir(path))*0.1) dirs = os.listdir(path)[:size] for dir in dirs: x.append(plt.imread(os.path.join(path, dir))[:,:,:1]/ 127.5 - 1) num1,num2=np.eye(10)[int(dir[0:1])],np.eye(10)[int(dir[1:2])] num3,num4=np.eye(10)[int(dir[2:3])],np.eye(10)[int(dir[3:4])] y.append(np.r_[num1, num2, num3, num4]) return np.array(x), np.array(y) def Conv(input, size_in, size_out): W = tf.Variable(tf.truncated_normal([3, 3, size_in, size_out], stddev=0.1)) b = tf.Variable(tf.constant(0.1, shape=[size_out])) conv = tf.nn.conv2d(input, W, [1, 1, 1, 1], 'SAME') a = tf.nn.relu(conv + b) return a def Fc(input, size_in, size_out): W = tf.Variable(tf.truncated_normal([size_in, size_out], stddev=0.1)) b = tf.Variable(tf.constant(0.1, shape=[size_out])) z = tf.matmul(input, W) + b return z def Main(train_path, test_path): X = tf.placeholder(tf.float32, [None, 60, 160,1]) Y = tf.placeholder(tf.float32, [None, 40]) conv1 = Conv(X, 1, 16) conv1_pool = tf.nn.max_pool(conv1, [1, 2, 2, 1], [1, 2, 2, 1], 'SAME') conv2 = Conv(conv1_pool, 16, 64) conv2_pool = tf.nn.max_pool(conv2, [1, 2, 2, 1], [1, 2, 2, 1], 'SAME') flatten=tf.reshape(conv2_pool,[-1,15*40*64]) f3=tf.nn.relu(Fc(flatten,15*40*64,128)) logits=Fc(f3,128,40) loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits,labels=Y)) optimizer=tf.train.AdamOptimizer(0.01).minimize(loss) predict=tf.argmax(tf.reshape(logits,[-1, 4, 10]),2) labels=tf.argmax(tf.reshape(Y, [-1, 4, 10]), 2) correct = tf.equal(predict,labels) accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) x_train,y_train=ReadData(train_path) x_test,y_test=ReadData(test_path) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) epoch,batch=10,10 for e in range(epoch): avg_loss,s=0,0 total_batch=len(y_train)//batch for b in range(total_batch): l,_=sess.run([loss,optimizer],{X:x_train[s:s+batch],Y:y_train[s:s+batch]}) avg_loss+=l/total_batch s+=batch print('loss:',avg_loss) print('accuracy:',sess.run(accuracy, {X: x_test, Y: y_test})) for i in range(10): r=random.randint(0,len(y_test)-1) print('labels:{} predict:{}'.format(sess.run(labels, {Y: y_test[r:r + 1]}),sess.run(predict, {X: x_test[r:r + 1]}))) if __name__ == '__main__': test_path = r"C:\Users\lenovo\Desktop\各种\深度1\代码\test" train_path = r"C:\Users\lenovo\Desktop\各种\深度1\代码\train" Main(train_path,test_path)
test里面是1000个四位数字验证码,而train里是从0001一直到9999的四位数字验证 为啥最后的精准率只有0.3