【补充第一部分的一个问题,你可能会遇见的】起初是没有遇见这个问题的,后来换了系统,重装,在ubuntu14.04和windows8的spyder都出现了这个问题,现在把问题列出来
TensorFlow TypeError: Value passed to parameter input has DataType uint8 not in list of allowed values: float16, float32
https://stackoverflow.com/questions/44822999/tensorflow-typeerror-value-passed-to-parameter-input-has-datatype-uint8-not-in
这个up主给出了很好的处理方式:https://stackoverflow.com/questions/44822999/tensorflow-typeerror-value-passed-to-parameter-input-has-datatype-uint8-not-in
输入管道中的图像起初类型是“uint8"(8位无符号整数),把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。为了节省空间,支持uint8,uint16.但是在运算时最好转化为double类型,或者float类型,这样可以保证计算的精度,也会防止溢出,所以再decode之后面image=tf.cast(image,tf.float32)。当然,如果要显示图像,还是要调整为图像的标准数据格式。
直接点到这里的,先回看系列_1。
那下面就讲最后一个部分,这部分搞定,就可以开始训练我们的样本了!!!
一、train.py训练样本
同样,需要调用的lib
import os
import numpy as np
import tensorflow as tf
import input_data
import model#导入另外两个文件
与前面有一点不一样的是,train.py需要input_data.py和model.py的函数,所有有import input_data import model
下面定义初始常数
#%%
N_CLASSES = 2 #二分类,cat or dog
IMG_W = 208
IMG_H =208
BATCH_SIZE = 16
CAPACITY = 2000
MAX_STEP = 15000#with current parameter,it is suggested to use MAX_STEP>10k
learning_rate = 0.0001#with current parameters,it is suggested to use leaning rate<0.0001
最后,激动人心的,就是定义训练样本的运行函数
二、训练样本的运行函数
#%%
def run_training():
#with tf.Graph().as_default:
train_dir = 'D:/Anaconda3/projects/catsVSdogs/data/train/'
logs_train_dir='D:/Anaconda3/projects/catsVSdogs/logs/train/'
train,train_label = input_data.get_files(train_dir)
train_batch,train_label_batch = input_data.get_batch(train,
train_label,
IMG_W,
IMG_H,
BATCH_SIZE,
CAPACITY)
train_logits = model.inference(train_batch,BATCH_SIZE,N_CLASSES)
train_loss = model.losses(train_logits,train_label_batch)
train_op = model.training(train_loss,learning_rate)
train_acc = model.evaluation(train_logits,train_label_batch)
summary_op = tf.summary.merge_all()#所有的summary弄到一块
sess = tf.Session()
train_writer = tf.summary.FileWriter(logs_train_dir,sess.graph)
saver = tf.train.Saver
sess.run(tf.global_variables_initializer())
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess,coord=coord)
#开始训练
try:
for step in np.arange(MAX_STEP):#定义一个循环
if coord.should_stop():
break
_,tra_loss,tra_acc = sess.run([train_op,train_loss,train_acc])
if step%50==0:
print('Step %d,train loss = %.2f,train accuracy = %.2f%%'%(step,tra_loss,tra_acc*100.0))
summary_str = sess.run(summary_op)
train_writer.add_summary(summary_str,step)
if step %2000 == 0 or (step + 1)==MAX_STEP:
checkpoint_path = os.path.join(logs_train_dir,'model.ckpt')
saver().save(sess,checkpoint_path,global_step=step)
except tf.errors.OutOfRangeError:
print('Done training -- epoch limit reached')
finally:
coord.request_stop()
coord.join(threads)
sess.close()
后面就是利用spyder运算之后和Tensorboard的显示运行结果图
打开这个网页,可发现这些运算之后的数据图谱
可以发现准确率在逐渐上升,损失率在逐渐减少,说明此训练是有效的。
这个结构图自己还没搞懂,等搞懂了专门写个自己的理解吧,就这样,拜拜。
后面还有测试的图像部分,后面再加,先把存放在草稿箱很久的内容公开吧,后面在加3,真拜拜了。