本文共 6045 字,大约阅读时间需要 20 分钟。
#coding=utf-8import os#图像读取库from PIL import Image#矩阵运算库import numpy as npimport tensorflow as tf# 训练还是测试train = False #True FalseStep_total = 150# 数据文件夹if train: data_dir = "train_35" #data train_35else: data_dir = "test_35"# 模型文件路径model_path = "model35/image_model" #model model35# 从文件夹读取图片和标签到numpy数组中# 标签信息在文件名中,例如1_40.jpg表示该图片的标签为1def read_data(data_dir): datas = [] labels = [] fpaths = [] for fname in os.listdir(data_dir): fpath = os.path.join(data_dir, fname) fpaths.append(fpath) image = Image.open(fpath) print(fpath) data = np.array(image) / 255.0 label = int(fname.split("_")[0]) #label = fname.split("_")[0] datas.append(data) labels.append(label) datas = np.array(datas) labels = np.array(labels) print("shape of datas: {}\tshape of labels: {}".format(datas.shape, labels.shape)) return fpaths, datas, labelsfpaths, datas, labels = read_data(data_dir)# 计算有多少类图片num_classes = len(set(labels))# 定义Placeholder,存放输入和标签datas_placeholder = tf.placeholder(tf.float32, [None, 20, 20, 3])labels_placeholder = tf.placeholder(tf.int32, [None])# 存放DropOut参数的容器,训练时为0.25,测试时为0dropout_placeholdr = tf.placeholder(tf.float32)# 定义卷积层, 20个卷积核, 卷积核大小为5,用Relu激活conv0 = tf.layers.conv2d(datas_placeholder, 20, 5, activation=tf.nn.relu)# 定义max-pooling层,pooling窗口为2x2,步长为2x2pool0 = tf.layers.max_pooling2d(conv0, [2, 2], [2, 2])# 定义卷积层, 40个卷积核, 卷积核大小为4,用Relu激活conv1 = tf.layers.conv2d(pool0, 40, 4, activation=tf.nn.relu)# 定义max-pooling层,pooling窗口为2x2,步长为2x2pool1 = tf.layers.max_pooling2d(conv1, [2, 2], [2, 2])# 将3维特征转换为1维向量flatten = tf.layers.flatten(pool1)# 全连接层,转换为长度为100的特征向量fc = tf.layers.dense(flatten, 400, activation=tf.nn.relu)# 加上DropOut,防止过拟合dropout_fc = tf.layers.dropout(fc, dropout_placeholdr)# 未激活的输出层logits = tf.layers.dense(dropout_fc, num_classes)predicted_labels = tf.arg_max(logits, 1)# 利用交叉熵定义损失losses = tf.nn.softmax_cross_entropy_with_logits( labels=tf.one_hot(labels_placeholder, num_classes), logits=logits)# 平均损失mean_loss = tf.reduce_mean(losses)# 定义优化器,指定要优化的损失函数optimizer = tf.train.AdamOptimizer(learning_rate=1e-2).minimize(losses)# 用于保存和载入模型saver = tf.train.Saver()with tf.Session() as sess: if train: print("训练模式") # 如果是训练,初始化参数 sess.run(tf.global_variables_initializer()) # 定义输入和Label以填充容器,训练时dropout为0.25 train_feed_dict = { datas_placeholder: datas, labels_placeholder: labels, dropout_placeholdr: 0.25 } for step in range(Step_total):#150 _, mean_loss_val = sess.run([optimizer, mean_loss], feed_dict=train_feed_dict) if step % 10 == 0: print("step = {}\tmean loss = {}".format(step, mean_loss_val)) saver.save(sess, model_path) print("训练结束,保存模型到{}".format(model_path)) else: print("测试模式") # 如果是测试,载入参数 saver.restore(sess, model_path) print("从{}载入模型".format(model_path)) # label和名称的对照关系 label_name_dict = { 0: "0", 1: "1", 2: "2", 3: "3", 4: "4", 5: "5", 6: "6", 7: "7", 8: "8", 9: "9", 10: "A", 11: "B", 12: "C", 13: "D", 14: "E", 15: "F", 16: "G", 17: "H", 18: "I", 19: "J", 20: "K", 21: "L", 22: "M", 23: "N", 24: "P", 25: "Q", 26: "R", 27: "S", 28: "T", 29: "U", 30: "V", 31: "W", 32: "X", 33: "Y", 34: "Z" } # 定义输入和Label以填充容器,测试时dropout为0 test_feed_dict = { datas_placeholder: datas, labels_placeholder: labels, dropout_placeholdr: 0 } predicted_labels_val = sess.run(predicted_labels, feed_dict=test_feed_dict) len = predicted_labels_val.shape[0] num = 0 # 真实label与模型预测label for fpath, real_label, predicted_label in zip(fpaths, labels, predicted_labels_val): # 将label id转换为label名 real_label_name = label_name_dict[real_label] predicted_label_name = label_name_dict[predicted_label] print("{}\t{} => {}".format(fpath, real_label_name, predicted_label_name)) if real_label == predicted_label: num = num + 1 print("正确") else: print("错误***************************************************************************") print("正确率:{}% ,总个数:{},判断正确个数:{}".format(num / len * 100, len, num))
测试集如图:
2019-06-26 18:32:27.031947: I tensorflow/core/common_runtime/process_util.cc:69] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.测试模式从model35/image_model载入模型test_35\0_1.jpg 0 => 0正确test_35\10_2.jpg A => A正确test_35\11_0.jpg B => E错误***************************************************************************test_35\12_0.jpg C => C正确test_35\13_0.jpg D => D正确test_35\14_0.jpg E => E正确test_35\15_0.jpg F => F正确test_35\16_0.jpg G => G正确test_35\17_0.jpg H => H正确test_35\18_0.jpg I => I正确test_35\19_0.jpg J => J正确test_35\1_0.jpg 1 => 1正确test_35\20_1.jpg K => K正确test_35\21_0.jpg L => L正确test_35\22_0.jpg M => M正确test_35\22_1.jpg M => M正确test_35\23_0.jpg N => N正确test_35\24_0.jpg P => P正确test_35\25_0.jpg Q => Q正确test_35\26_0.jpg R => R正确test_35\27_0.jpg S => S正确test_35\28_0.jpg T => T正确test_35\29_0.jpg U => U正确test_35\2_1.jpg 2 => 2正确test_35\30_0.jpg V => V正确test_35\31_0.jpg W => W正确test_35\32_0.jpg X => X正确test_35\33_0.jpg Y => Y正确test_35\34_0.jpg Z => Z正确test_35\3_5.jpg 3 => 3正确test_35\4_0.jpg 4 => 4正确test_35\4_1.jpg 4 => 4正确test_35\4_17.jpg 4 => 4正确test_35\5_2.jpg 5 => 5正确test_35\6_1.jpg 6 => 6正确test_35\7_1.jpg 7 => 7正确test_35\8_2.jpg 8 => 8正确test_35\8_4.jpg 8 => 8正确test_35\9_12.jpg 9 => 9正确正确率:97.43589743589743% ,总个数:39,判断正确个数:38Process finished with exit code 0
转载地址:http://elsws.baihongyu.com/