环境:python 3.6.1 : Anaconda 4.4.0 tf 1.2.0
这份数据集来源于Kaggle,数据集有12500只猫和12500只狗。在这里简单介绍下整体思路

  1. 处理数据
  2. 设计神经网络
  3. 进行训练测试

1. 数据处理

将图片数据处理为 tf 能够识别的数据格式,并将数据设计批次。

  1. 第一步get_files() 方法读取图片,然后根据图片名,添加猫狗 label,然后再将 image和label 放到 数组中,打乱顺序返回
  2. 将第一步处理好的图片 和label 数组 转化为 tensorflow 能够识别的格式,然后将图片裁剪和补充进行标准化处理,分批次返回。

新建数据处理文件 ,文件名 input_data.py

import tensorflow as tf
import os
import numpy as npdef get_files(file_dir):cats = []label_cats = []dogs = []label_dogs = []for file in os.listdir(file_dir):name = file.split(sep='.')if 'cat' in name[0]:cats.append(file_dir + file)label_cats.append(0)else:if 'dog' in name[0]:dogs.append(file_dir + file)label_dogs.append(1)image_list = np.hstack((cats,dogs))label_list = np.hstack((label_cats,label_dogs))# print('There are %d cats\nThere are %d dogs' %(len(cats), len(dogs)))# 多个种类分别的时候需要把多个种类放在一起,打乱顺序,这里不需要# 把标签和图片都放倒一个 temp 中 然后打乱顺序,然后取出来temp = np.array([image_list,label_list])temp = temp.transpose()# 打乱顺序np.random.shuffle(temp)# 取出第一个元素作为 image 第二个元素作为 labelimage_list = list(temp[:,0])label_list = list(temp[:,1])label_list = [int(i) for i in label_list]  return image_list,label_list# 测试 get_files
# imgs , label = get_files('/Users/yangyibo/GitWork/pythonLean/AI/猫狗识别/testImg/')
# for i in imgs:
#   print("img:",i)# for i in label:
#   print('label:',i)
# 测试 get_files end# image_W ,image_H 指定图片大小,batch_size 每批读取的个数 ,capacity队列中 最多容纳元素的个数
def get_batch(image,label,image_W,image_H,batch_size,capacity):# 转换数据为 ts 能识别的格式image = tf.cast(image,tf.string)label = tf.cast(label, tf.int32)# 将image 和 label 放倒队列里 input_queue = tf.train.slice_input_producer([image,label])label = input_queue[1]# 读取图片的全部信息image_contents = tf.read_file(input_queue[0])# 把图片解码,channels =3 为彩色图片, r,g ,b  黑白图片为 1 ,也可以理解为图片的厚度image = tf.image.decode_jpeg(image_contents,channels =3)# 将图片以图片中心进行裁剪或者扩充为 指定的image_W,image_Himage = tf.image.resize_image_with_crop_or_pad(image, image_W, image_H)# 对数据进行标准化,标准化,就是减去它的均值,除以他的方差image = tf.image.per_image_standardization(image)# 生成批次  num_threads 有多少个线程根据电脑配置设置  capacity 队列中 最多容纳图片的个数  tf.train.shuffle_batch 打乱顺序,image_batch, label_batch = tf.train.batch([image, label],batch_size = batch_size, num_threads = 64, capacity = capacity)# 重新定义下 label_batch 的形状label_batch = tf.reshape(label_batch , [batch_size])# 转化图片image_batch = tf.cast(image_batch,tf.float32)return  image_batch, label_batch# test get_batch
# import matplotlib.pyplot as plt
# BATCH_SIZE = 2
# CAPACITY = 256
# IMG_W = 208
# IMG_H = 208# train_dir = '/Users/yangyibo/GitWork/pythonLean/AI/猫狗识别/testImg/'# image_list, label_list = get_files(train_dir)
# image_batch, label_batch = get_batch(image_list, label_list, IMG_W, IMG_H, BATCH_SIZE, CAPACITY)# with tf.Session() as sess:
#    i = 0
#    #  Coordinator  和 start_queue_runners 监控 queue 的状态,不停的入队出队
#    coord = tf.train.Coordinator()
#    threads = tf.train.start_queue_runners(coord=coord)
#    # coord.should_stop() 返回 true 时也就是 数据读完了应该调用 coord.request_stop()
#    try:
#        while not coord.should_stop() and i<1:
#            # 测试一个步
#            img, label = sess.run([image_batch, label_batch])#            for j in np.arange(BATCH_SIZE):
#                print('label: %d' %label[j])
#                # 因为是个4D 的数据所以第一个为 索引 其他的为冒号就行了
#                plt.imshow(img[j,:,:,:])
#                plt.show()
#            i+=1
#    # 队列中没有数据
#    except tf.errors.OutOfRangeError:
#        print('done!')
#    finally:
#        coord.request_stop()
#    coord.join(threads)# sess.close()

2. 设计神经网络

利用卷积神经网路处理,网络结构为

# conv1   卷积层 1
# pooling1_lrn  池化层 1
# conv2  卷积层 2
# pooling2_lrn 池化层 2
# local3 全连接层 1
# local4 全连接层 2
# softmax 全连接层 3

新建神经网络文件 ,文件名 model.py

#coding=utf-8
import tensorflow as tf  def inference(images, batch_size, n_classes):  with tf.variable_scope('conv1') as scope: # 卷积盒的为 3*3 的卷积盒,图片厚度是3,输出是16个featuremapweights = tf.get_variable('weights',  shape=[3, 3, 3, 16],  dtype=tf.float32,  initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32))  biases = tf.get_variable('biases',  shape=[16],  dtype=tf.float32,  initializer=tf.constant_initializer(0.1))  conv = tf.nn.conv2d(images, weights, strides=[1, 1, 1, 1], padding='SAME')  pre_activation = tf.nn.bias_add(conv, biases)  conv1 = tf.nn.relu(pre_activation, name=scope.name)  with tf.variable_scope('pooling1_lrn') as scope:  pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME', name='pooling1')  norm1 = tf.nn.lrn(pool1, depth_radius=4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='norm1')  with tf.variable_scope('conv2') as scope:  weights = tf.get_variable('weights',  shape=[3, 3, 16, 16],  dtype=tf.float32,  initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32))  biases = tf.get_variable('biases',  shape=[16],  dtype=tf.float32,  initializer=tf.constant_initializer(0.1))  conv = tf.nn.conv2d(norm1, weights, strides=[1, 1, 1, 1], padding='SAME')  pre_activation = tf.nn.bias_add(conv, biases)  conv2 = tf.nn.relu(pre_activation, name='conv2')  # pool2 and norm2  with tf.variable_scope('pooling2_lrn') as scope:  norm2 = tf.nn.lrn(conv2, depth_radius=4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='norm2')  pool2 = tf.nn.max_pool(norm2, ksize=[1, 3, 3, 1], strides=[1, 1, 1, 1], padding='SAME', name='pooling2')  with tf.variable_scope('local3') as scope:  reshape = tf.reshape(pool2, shape=[batch_size, -1])  dim = reshape.get_shape()[1].value  weights = tf.get_variable('weights',  shape=[dim, 128],  dtype=tf.float32,  initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))  biases = tf.get_variable('biases',  shape=[128],  dtype=tf.float32,  initializer=tf.constant_initializer(0.1))  local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name)  # local4  with tf.variable_scope('local4') as scope:  weights = tf.get_variable('weights',  shape=[128, 128],  dtype=tf.float32,  initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))  biases = tf.get_variable('biases',  shape=[128],  dtype=tf.float32,  initializer=tf.constant_initializer(0.1))  local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name='local4')  # softmax  with tf.variable_scope('softmax_linear') as scope:  weights = tf.get_variable('softmax_linear',  shape=[128, n_classes],  dtype=tf.float32,  initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))  biases = tf.get_variable('biases',  shape=[n_classes],  dtype=tf.float32,  initializer=tf.constant_initializer(0.1))  softmax_linear = tf.add(tf.matmul(local4, weights), biases, name='softmax_linear')  return softmax_linear  def losses(logits, labels):  with tf.variable_scope('loss') as scope:  cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits \(logits=logits, labels=labels, name='xentropy_per_example')  loss = tf.reduce_mean(cross_entropy, name='loss')  tf.summary.scalar(scope.name + '/loss', loss)  return loss  def trainning(loss, learning_rate):  with tf.name_scope('optimizer'):  optimizer = tf.train.AdamOptimizer(learning_rate= learning_rate)  global_step = tf.Variable(0, name='global_step', trainable=False)  train_op = optimizer.minimize(loss, global_step= global_step)  return train_op  def evaluation(logits, labels):  with tf.variable_scope('accuracy') as scope:  correct = tf.nn.in_top_k(logits, labels, 1)  correct = tf.cast(correct, tf.float16)  accuracy = tf.reduce_mean(correct)  tf.summary.scalar(scope.name + '/accuracy', accuracy)  return accuracy

3. 训练数据,并将训练的模型存储

import os
import numpy as np
import tensorflow as tf
import input_data
import model  N_CLASSES = 2  # 2个输出神经元,[1,0] 或者 [0,1]猫和狗的概率
IMG_W = 208  # 重新定义图片的大小,图片如果过大则训练比较慢
IMG_H = 208
BATCH_SIZE = 32  #每批数据的大小
CAPACITY = 256
MAX_STEP = 15000 # 训练的步数,应当 >= 10000
learning_rate = 0.0001 # 学习率,建议刚开始的 learning_rate <= 0.0001def run_training():  # 数据集train_dir = '/Users/yangyibo/GitWork/pythonLean/AI/猫狗识别/img/'   #My dir--20170727-csq  #logs_train_dir 存放训练模型的过程的数据,在tensorboard 中查看 logs_train_dir = '/Users/yangyibo/GitWork/pythonLean/AI/猫狗识别/saveNet/'  # 获取图片和标签集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) # 获取 loss train_loss = model.losses(train_logits, train_label_batch)# 训练 train_op = model.trainning(train_loss, learning_rate)# 获取准确率 train__acc = model.evaluation(train_logits, train_label_batch)  # 合并 summarysummary_op = tf.summary.merge_all()  sess = tf.Session()# 保存summarytrain_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:  # 每隔2000步保存一下模型,模型保存在 checkpoint_path 中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()  # train
run_training()

关于保存的模型怎么使用将在下一片博客中 展示。
TensorFlow 卷积神经网络之使用训练好的模型识别猫狗图片
如果需要训练数据集可以评论留下联系方式。

原文完整代码地址:
https://github.com/527515025/My-TensorFlow-tutorials/tree/master/%E7%8C%AB%E7%8B%97%E8%AF%86%E5%88%AB
欢迎 star 欢迎提问。

TensorFlow 卷积神经网络之猫狗识别相关推荐

  1. TensorFlow 卷积神经网络之猫狗识别(二)

    本文是TensorFlow 卷积神经网络之猫狗识别 的姊妹篇,是加载上一篇博客训练好的模型,进行猫狗识别 本文逻辑: 我从网上下载了十几张猫和狗的图片,用于检验我们训练好的模型. 处理我们下载的图片 ...

  2. 基于卷积神经网络的猫狗识别

    卷积神经网络的猫狗识别 任务需求 环境配置 识别猫狗实例 首先导入库 数据预处理: 读取数据: 定义网络: 调整机器学习率 定义训练过程 训练开始 训练结果 用于测试代码 结果 任务需求 按照 htt ...

  3. 【实战】kaggle猫狗大战-卷积神经网络实现猫狗识别

    卷积神经网络:猫狗识别 目录 第一步:导入数据集 第二步:数据预处理 第三步:迁移学习 第四步:模型保存 第五步:模型融合 第一步:导入数据集 kaggle猫狗大战数据集地址:kaggle # 将ka ...

  4. 毕设:基于CNN卷积神经网络的猫狗识别、狗品种识别(Tensorflow、Keras、Kaggle竞赛)

    基于卷积神经网络的图像识别算法及其应用研究 毕业快一年了,拿出来分享给大家,我和网上唯一的区别就是,我能够同时实现两个方案(猫狗识别和狗品种识别),我当时也是网上各种查,花了2,3个月的时间,一个萝卜 ...

  5. 基于卷积神经网络的猫狗识别系统的设计与实现

    1.1 题目的主要研究内容 (1)工作的主要描述 通过卷积网络实现猫狗图像的识别.首先,在数据集中抽取训练集和测试集:其次,对图像进行预处理和特征提取,对图像数据进行图像增强,将图像从.jpg格式转化 ...

  6. 卷积神经网络的猫狗识别

    文章目录 一.准备工作 二.猫狗识别 2.1.下载数据集 2.1.1. 图片分类 2.1.2.图片数量统计 2.2.卷积神经网络CNN 2.2.1.网络模型搭建 2.2.2.图像生成器读取文件中数据 ...

  7. 使用卷积神经网络处理猫狗识别数据集_v1

    说明 采用pytorch框架实现猫狗识别. 数据集下载 猫狗识别数据集下载: 链接:https://pan.baidu.com/s/1hfzSacJbNBUhcDDtPnzlsg  提取码:fu74 ...

  8. 第十二章 卷积神经网络实战--猫狗识别

    1.介绍 我们已经学习了如何用传统的神经网络进行机器学习,在本章我们学习一下如何使用简单的神经网络进行图像分类.数据集用的是Kaggle的猫狗数据集.这里只有前100张,如果需要更多的可以去Kaggl ...

  9. Pytorch基于卷积神经网络的猫狗识别

    实验环境 Pytorch 1.4.0 conda 4.7.12 Jupyter Notebook 6.0.1 Python 3.7 数据集介绍 实验采用的猫和狗的图片来自 Kaggle 竞赛的一个赛题 ...

  10. (人工智能)基于卷积神经网络的猫狗识别

    目录 一.实验条件 二.狗猫数据集的分类实验 1.运行程序:根据命名对图片分类 2.统计图片数量 三.猫狗分类的实例 1.导入相应的库 2.设置超参数 3.图像处理与图像增强 4.读取数据集和导入数据 ...

最新文章

  1. 九度 题目1044:Pre-Post
  2. Java 帝国之消息队列
  3. 合租房资金管理系统--会议纪要
  4. mysqldump 备份原理8
  5. TME上市两周年|为2020甜蜜发糖,收获2021的希望
  6. 计算机系统应用系统,计算机系统应用.pdf
  7. CentOS系统优化
  8. 对于集成SP3后后不能激活的解释
  9. hdu2084数塔----DP入门
  10. lan speed test怎么用_别浪费,你家的200M光纤真的用起来了吗?
  11. deepin下安装QT
  12. 免费正确使用计算机ppt,计算机基础课件ppt
  13. python:IndentationError:expected an indented block
  14. 第6堂视频课:看到词句就会读-下
  15. Java集成DataX
  16. 分享一个简单、便宜配置https安全证书的方法(10元/年)
  17. 设计模式-业务代表模式-个人思考
  18. structure-from-motion revisited论文笔记
  19. 关于更新win11后校园网卡顿问题(WLAN上网)
  20. 时间都去哪儿了?互联网3.0时代,好多东西都已“碎片化”

热门文章

  1. ABC分析做法、步骤、Pareto图制作方法解说
  2. 手机便签记事本下载,好用的手机便签记事本软件
  3. 4星|《经济学通识课》:深入浅出的经济学思想发展简史
  4. MySQL-innobackupex备份工具
  5. 终极选择---老男孩教育
  6. 如何用微信小程序,每天给自己赚个鸡腿?
  7. Hibernate中@Embedded和@Embeddable注解的使用
  8. 软工专硕考研_软件工程考研:专硕、学硕实力强校排名,2020考研党择校参考...
  9. Deepgreen/Greenplum 删除节点步骤
  10. 苹果公司发展史_苹果公司的发展历史