1.cv2.resize(image,(image_size,image_size),0,0,cv2.INTER_LINEAR)
参数说明:image表示输入图片,image_size表示变化后的图片大小,0,0表示dx和dy,cv2.INTER_LINEAR表示插值的方式为线性插值
2.image.get_shape[1:4].num_elements()获得最后三个维度的大小之和
参数说明:image表示输入的图片
3.saver.save(sess,path,global_step=i)进行sess的加载
参数说明:sess表示输入,path表示保存路径,global_step表示路径的结尾
4.saver=tf.train.import_meta_graph('./dog-cats-model/dog-cat.ckpt-3700.meta')#加载训练好的模型的meta值
参数说明:./dog-cats-model/dog-cat.ckpt-3700.meta表示meta的路径
5.saver.restore(sess,ckpt_path)#加载训练好的参数模型
参数说明:sess表示执行函数,ckpt_path表示ckpt的路径
6.graph=tf.get_defualt_graph获得训练好的参数图
7.graph.get_tensor_by_name('x:0')获得模型的占位参数,以便进行模型的预测
参数说明:’x:0‘表示模型在训练过程中,tf.placeholder(name=’x')输入数据设置的名字
代码中的学习点:1.使用cv2.resize对图片的维度进行压缩
2.使用np.zeros(num_classes)构造标签,lable[index]=1构造标签
3.使用image.get_shape[1:4].num_elements获得最后三个维度的大小
4.saver.save(sess,path,global_step=i)进行模型参数的存储
5.save.restore(sess,path)进行模型的加载
猫狗识别的代码:主要分为3个部分,
第一部分:数据的准备
第二部分:构造卷积神经网络,进行模型的训练
第三部分:使用saver.restore加载训练好的参数,进行模型的预测。
第一部分:数据的准备,构建read_train_data函数
第一步:输入的参数是文件的地址,图片的大小(进行图像的矩阵变换),标签,验证集的比例
第二步:对构造一个类dataset,用于存储训练集和验证集
第三步:对标签进行循环,对输入的文件与标签值进行拼接,获得图片文件的地址,使用glob.glob获得每张图片的地址。
第四步:循环图片地址,读入图片
第一步:使用cv2.imread()读入图片
第二步:使用cv2.resize(img,(img_size,img_size),0,0,cv2.Inter)进行图片的维度变换
第三步:使用.astype('float32')对图片进行数据类型的转换
第四步:使用np.multiply(img,1.0/255.0)进行图片数值归一化操作,并将图片加到列表中
第五步:使用np.zeros(num_classes)构造标签的零矩阵
第六步:使用index=classes.index(filed)获得标签值对应的索引,label[index]=1将索引位置赋值为1
第七步:将标签加到列表中
第八步:使用os.path.basename(file)获得图片的名字,添加到列表中,获得标签的名字,添加到列表中
第五步:对图片和标签使用np.array转换为数组类型,并返回图片,标签,名字,类别名
第六步:使用sklearn.utils中的shuffle,对图片,标签,名字和类别名进行清洗
第七步:使用val_size,验证集的比例对训练集和验证集进行分割
第八步:创建类别DataSet,实例化dataset.train和dataset.val,创建.next_batch函数,
第九步:next_batch函数说明:使用一个变量self._epoch_index对start和end进行递增循环,如果end>self._num_image,将start置为0,self._epoch_index置为batch_size。
代码:dataset.py
第一步:参数设置,一二三层卷积的大小和个数,以及全连接层的隐藏层的个数
第二步:使用tf.placeholder设置初始的输入参数x和y_pred,并命名为x和y_pred,使用np.argmax获得预测的索引值
第三步:构建生成卷积过程中参数的函数,tf.Variable(tf.truncate_normal(shape,stddev=0.05))
第四步:构建进行卷积的函数,使用tf.nn.conv2(x,w,stride=[1,2,2,1],padding='SAME'),再加上偏置项b,使用激活层tf.nn.relu构建,使用tf.nn.max_pool构建池化层
第五步:构建进行维度变换的函数,用于进行第一次全连接层的卷积到全连接的维度变换,使用image.get_shape()[1:4].num_elements获得后3个维度的个数之和,即乘积
第六步:构造进行全连接的函数,使用tf.matmul构造全连接函数,这里的话,需要使用tf.nn.dropout进行dropout防止过拟合
第七步:开始进行卷积过程
第一步:第一层卷积
第二步:第二层卷积
第三步:第三次卷积
第四步:第一次全连接,使用conv.get_shape[1:4].num_elements获得维度,构造参数
第五步:第二次全连接
第八步:y_pred=tf.nn.softmax构造y_pred,使用tf.argmax(y_pred,1)输出索引值
第九步:使用tf.nn.softmax_logits构造损失值loss,logits=score,labels=y_true
第十步:使用tf.train.Adaoptimer().minimize自适应梯度下降降低损失值
第十一步:使用tf.equal(y_pred_cls,y_true_cls),tf.reduce_mean构造准确率
第十二步:构建train函数,开始进行训练,首先使用data.train.next_batch获得batch训练样本,使用sess.run训练trainopt降低损失值,进行参数的训练
第十三步:每一个epoch值,获得train的batch,获得val_batch,对训练集和验证集的准确率进行展示
代码:train.py
第三部分:进行模型的预测
第一步:图片的输入,对于输入的图片需要进行与训练样本输入时相同的处理
第一步:使用cv2.imread()进行样本的读取
第二步:使用cv2.resize进行图片的维度变换
第三步:.astype对样本的类型进行变换
第四步:使用np.multipy对样本进行归一化操作
第五步:将图片的维度进行变换,因为是一张图片,维度变化为[1,60,60,3]
第二步:将训练好的模型进行加载
第一步:构建sess=tf.Session()第二步:使用saver=tf.train.import_meta_graph加载模型的meta
第三步:使用saver.restore()加载模型的ckpt-3750
第四步:graph=tf.get_default_graph()获得参数结构图
第五步:使用graph.get_tensor_by_name('y_pred:0')获得预测y_pred
第五步:使用graph.get_tensor_by_name('x:0')获得输入x
第六步:使用graph.get_tensor_by_name('y_pred:0')获得输入标签y_true
第七步:使用np.zeros((1,2))构造输入值得标签
第八步:使用sess.run(y_pred,feed_dict={x:x_batch,y_pred:y_test_img})进行结果的预测
第九步:使用tf.argmax获得标签的索引,使用标签名获得最终的预测结果