一个月前,我将kaggle里面的food-101(101000张食物图片),数据包下载下来,想着实现图像识别,做了很长时间,然后自己电脑也带不动,不过好在是最后找各种方法实现出了识别,但是准确率真的非常低,我自己都分辨不出来到底是哪种食物,电脑怎么分的出来呢?

在上一篇博客中,我提到了数据的下载处理,然后不断地测试,然后优化代码,反正过程极其复杂,很容易出错。

再说下代码流程吧:

  1. 关于数据集的处理,我上篇博客写道:将其灰度处理,实际上是应该二值化,将彩色图片转化为(0,1)的范围里面,首先是读取每一个文件的数据(这里的每张图片都有一个标签),然后将其随机分为80%的训练集,20%的测试集:

    for filename in dir:
    img = np.multiply(img, 1.0/255.0)
    size = int(config.size * len(images))

    这里采用循环的方式,每一张都进行二值化,然后存入列表,再根据我设置的大小进行选择。

  2. 神经网络训练,我将图片二值化后,下一步需要将我得图片数据传入我得训练中,循环训练,分批传入,我采用卷积操作实现其识别:
    def jj():
    conv = tf.nn.relu(tf.nn.conv2d(input, filter, [1, 1, 1, 1], padding="SAME")+b)
    pool = tf.nn.max_pool2d(conv, [1, 2, 2, 1], [1, 2, 2, 1], padding="SAME")

    我这里采用的是相同大小卷积,所以我在全连接层的地方就需要注意我的神经元个数,最后通过激励函数得出结果。

        prediction = tf.nn.softmax(fc2,name="y_pred")
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=fc2,labels=labels_batch))
    optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=1e-4).minimize(loss)
    correct_prediction = tf.equal(tf.argmax(prediction,1), tf.argmax(labels_batch,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
  3. 数据训练的方法:当我们建立神经网络后,需要让机器自动去训练,所以我们需要将模型保存在电脑中,同时需要电脑能够停止训练(当损失函数的值处于某一最小值的时候)。
    if loss < 0.01:
    print("迭代收敛,结束训练")
    break

    这里我们上传数据为50一个批次,具体多少按照自己处理。

  4. 服务器中跑代码时,需要注意的是肯定需要大型cpu/gpu计算机,不然容易崩溃,然后也没有什么需要注意的地方了。

其实每个神经网络的训练处理方式都不一样,但是大致流程都差不多:数据处理-网格搭建-数据训练-网格优化。根据自己数据的不同和侧重点不同,需要建立不同的卷积算法。

总结下遇到的问题:

  1. 图片处理:在处理图片的时候我发现有的图片格式,大小,色彩都不相同,所以我在这里将其分类和处理,主要是分开除黑白图和彩色图

    def image(url):
    im=Image.open(url)
    pix=im.convert('RGB')
    width=im.size[0]
    height=im.size[1]
    type="黑白Image"
    is_color=[]
    for x in range(width):
    for y in range(height):
    r,g,b=pix.getpixel((x,y))
    r=int(r)
    g=int(g)
    b=int(b)
    if (r==g) and (g==b):
    pass
    else:
    type='彩色 Image'
    return type

    数据处理其实是这里面最好做的。

  2. 在神经网络搭建中,需要避免过拟合和欠拟合的问题,图片数据不能太少,同时神经元不能太多,需要考虑到多个问题,以及卷积操作的方式,这里都需要自己摸索
  3. 虽然大型服务器好用,但是贫民学生不配拥有,借用个服务器真是太难了,真的太难了!

用101000张图片实现图像识别(算法的实现和流程)-python-tensorflow框架的更多相关文章

  1. 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练

    以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...

  2. Bug2算法的实现(RobotBASIC环境中仿真)

    移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...

  3. Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...

  4. java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

  5. SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)

    在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...

  6. 详解Linux内核红黑树算法的实现

    转自:https://blog.csdn.net/npy_lp/article/details/7420689 内核源码:linux-2.6.38.8.tar.bz2 关于二叉查找树的概念请参考博文& ...

  7. 详细MATLAB 中BP神经网络算法的实现

    MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤   这里 ...

  8. Python学习(三) 八大排序算法的实现(下)

    本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...

  9. C++基础代码--20余种数据结构和算法的实现

    C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...

随机推荐

  1. labelme

    项目:https://github.com/wkentaro/labelme?tdsourcetag=s_pcqq_aiomsg 说明:https://www.bilibili.com/video/a ...

  2. Go 微服务架构Micro相关概念理解

    Micro是一个微服务框架(或者说是工具集):提供了各类组件,解决微服务架构中的不同问题,服务监控.服务发现.熔断机制,负载均衡等等,自己一个个解决这些问题几乎不可能,这时候就需要借助go-micro ...

  3. python多线程使用场景

    python多线程使用场景 如果程序时cpu密集型的,使用python的多线程是无法提升效率的,如果程序时IO密集型的,使用python多线程可以提高程序的整体效率 CPU密集型(CPU-bound) ...

  4. HAProxy+Keepalived 高可用负载均衡

    转自 https://www.jianshu.com/p/95cc6e875456 Keepalived+haproxy实现高可用负载均衡 Master backup vip(虚拟IP) 192.16 ...

  5. 使用dd命令克隆整个Linux系统

    参考:https://www.cnblogs.com/jikexianfeng/p/6103504.html 本次使用使用dd命令克隆整个Ubuntu系统 1,VM安装一台Ubuntu虚拟机 过程不详 ...

  6. logging配置

    import logging def handle(): # 1.定义logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出 logger = logging.ge ...

  7. Java学习笔记-Lambda表达式

    Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数是接口)的实例 意义 自从Java 8开始,Java支持Lambda表达 ...

  8. Cron 表达式学习

    1.7个子域的说明 cron 的表达式是字符串,实际上是由七子表达式(从左到右),描述个别细节的时间表.这些子表达式是分开的空白. 顺序(从左到右) 子串 有效数字 有效字符 1 Seconds(秒) ...

  9. Spring分层次建包

    1.包分三层 配置包 控制器包 模型包 视图层 模板放 src/main/resources下的templates目录下

  10. MongoDB的可视化工具(Studio 3T)的安装

    通过可视化工具,我们可以不用在命令行操作MongoDB了,可以直接使用类似于SQLyog的软件进行相关操作 1.下载地址(二者择其一即可),可使用迅雷来进行下载,否则下载速度极其慢 2018.4.6版 ...