01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别

人工智能81

初学者的 TensorFlow 2.0 教程 代码详解,链接地址如下:

初学者的 TensorFlow 2.0 教程 | TensorFlow Core

一、搭建python环境

配置环境这里不详细说了。简单说下几个步骤:

1:安装anaconda

2:anaconda创建环境假如名字叫(env38),并且在env38上安装配置

安装一些基本开发库conda install numpy / pip install tensorflow / install PIL

3: 安装pycharm

4:要求设备联网,这个demo没有显卡要求

二、新建工程设置interpret

新建工程名假设命名为tensorflow

pycharm的菜单 file-->setting--> project:tensorflow-->Python Interpreter

设置刚刚的哪个env38

三、测试环境是否ok

直接新建python文件然后输入print("hello tensorflow") 然后运行测试

四、初学者的 TensorFlow 2.0 教程

初学者的 TensorFlow 2.0 教程 | TensorFlow Core 01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别https://tensorflow.google.cn/tutorials/quickstart/beginner ;

4.1 代码分析

01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别

首先:下面第一个代码部分 导入库,导入的时候可以根据PyCharm提示安装tensorflow的库

import tensorflow as tf

第二部分提到的MNIST数据集,首先有个链接可以进入MNIST数据集的官网。这里就不详细说明数据集的来源和用途了。

mnist = tf.keras.datasets.mnist

上面这行代码,没什么实际用途,是因为后面这个名字太长了。使用一个短一点的名字而已。没实际作用。模块的名字重命名为mnist,为了书写方便

(x_train, y_train), (x_test, y_test) = mnist.load_data()

上面这行代码是从MNIST中加载数据集,首先我也是后来才知道,数据集的数据是著名的手写体数据,这个后面会详细解释。

01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别

由上面调试信息可以知道一些内容:

1:x_train的类型是{ndarray: (60000,28,28)} y_train的类型是{ ndarray:{60000,} }

2: x_test的类型是{ndarray: (10000,28,28)} y_test的类型是{ ndarray:{10000,} }

详细解释: ndarray是数组。y_train和y_test是数组,即手写体图片对应的数字。

x_train和x_test也是数组,x_train数组成员数有6万个。其中每个成员是28*28的矩阵组成。

直接得到的信息:

1:x_train的数组成员数量和y_train的数组成员数量一样多。都是60000,x是图片数据,y是真实数据。两个一起称之为训练数据。

2:x_test的数组成员数和ytest也是一样多,都是10000,x表示图片矩阵数据,y表示数值

在这里两个称之为测试数据。

3:图片中的数据取值范围是0-255, y_train和y_test中的取值范围是0-9

分析得到的信息:

1: 输入的训练数据都非常整齐,这一点在后面也可以看到。都是28*28像素的图片,并且每个手写体都给出了真实的值。

2:训练数据数量一般远远大于y中值的真实数量。手写体一共10个,然而训练数据给了6万个。

3:训练数据数量一般比测试数据量大。

4:训练数据的维度和测试数据的维度一致,都是28*28的图片矩阵数据。

4.2 x_tran到底是什么?

我们刚刚说x_train是数组,数组的成员是28*28的图片数据矩阵。

这样说不够直观,不太方便理解到底是什么东西。

我们导入下面两个库来作为辅助查看x_tran到底是什么数据。我们能收到什么启发?

import numpy as np
from PIL import Image
        for i in range(0,len(x_train)):
            data = np.reshape(x_train[i], (28, 28))
            newpic = Image.fromarray(data)
            newpic.save(r"E:\AIdata\x_train" + r"\xtrain_" + str(i) + "__" + str(y_train[i]) + ".png")
        return

我写了个简单的测试代码如上。基本功能就是将x_train中的图片数据保存到本地png图片。

np.reshape:从名字上看是重新构造图形:将数组从新构造成28*28的二维矩阵数据。

data就是28*28的矩阵数据

Image.fromarray(data):从名字上来看从矩阵转换为图像数据。

newpic =就是一个new picture 然后保存到本地,保存的时候。字符串中指明了png类型。

因为6万个数据量太大。实际上打印出几百个就可以知道是什么样的图片了。

数据图片如下:

01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别

启发:

1:x_train 确实是图像数据,并且每个图片都是28*28像素的图像

2:可以知道手写体的实际值,即y_train的值。

数据的来源,我们先不研究,数据的来源有几大问题,

1: 数据量,2:正确性,3:是否已经删除了一些模糊的数据,甚至于之前是否有字母的数据混合?4:全部转换为28*28的图像数据,5:黑白图像。黑底白字(无噪音),

6:几乎每个图片中的数字都是居中的。

4.2.2 数据可视化2:

前提:

import numpy as np
from PIL import Image
    xnew = x_train[0:100]
    t = []
    for i in range(0, 10):
        t.append(np.hstack(xnew[i*10:i*10+10]))

    t = np.vstack(t)
    newpic = Image.fromarray(t)
    newpic.save(r"E:\a.png")

01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别

打印出前100个手写图片。上面实际代码

4.3 图像数据归一化

x_train, x_test = x_train / 255.0, x_test / 255.0

上面一行代码其实理解为: x_train = x_train / (255.0 - 0)

注意的是:因为图片数据中最大值是255,最小值是0 所以是除以最大值和最小值的差

后面有个.0 是为了得出0-1之间的小数。

矩阵除以某个常数,代表是矩阵中每一个值都除以这个常数。然后返回新的矩阵。

4.4 顺序模型构造

01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别

首先使用的是keras的顺序模型。关于顺序模型这里需要注意几个地方。

顺序模型的api文档

The Sequential model 01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别https://www.tensorflow.org/guide/keras/sequential_model?hl=zh-cn ;A Sequential model is appropriate for a plain stack of layers where each layer has exactly one input tensor and one output tensor.

百度翻译是这样的:

序列模型适用于层的普通堆栈,其中每个层正好有一个输入张量和一个输出张量。

我认为应该翻译为:

顺序模型适用于一堆简单的层的组合,其中每个层都只包含一个输入张量和一个输出张量

根据官方文档说明,

A Sequential model is not appropriate when:

  • Your model has multiple inputs or multiple outputs
  • Any of your layers has multiple inputs or multiple outputs
  • You need to do layer sharing
  • You want non-linear topology (e.g. a residual connection, a multi-branch model)

译文:

顺序模型不适用于下列几个场景

1:你的模型具有多输入或者多输出

2:你的模型中任意一层包含多输入或者多输出

3:你需要做图层共享。(这个后面再讲)

4:你想用非线性的技术(例如,残差连接,多分支模型等)

4.4 顺序模型参数

01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别

1:构造函数中可以添加每一层到

后面更新,在跟着一个外文网站教程学

Image Classification using MLP in Keras | LearnOpenCV

Original: https://blog.csdn.net/qd1308504206/article/details/122195269
Author: qd1308504206
Title: 01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别



相关阅读

Title: 自动驾驶仿真器CARLA_0.9.12安装、使用及存在的问题

目录

简介

作为自动驾驶两大开源仿真器(LGSVLCARLA)之一,CARLA基本具备了自动驾驶仿真器需要具备的大部分功能,诸如完整的车辆运动系统、地图系统、各类常规传感器、天气系统等等,并且其基于UE4开发,在仿真效果真实性上是LGSVL不能比拟的,因此其还有很大的一个用途是可以通过其采集各类数据用于神经网络训练,CARLA可以直接输出各类数据及其真值,大大减少了训练成本。

安装

CARLA分为服务器端与客户端,需要分别安装。

服务器端

CARLA官网直接下载仿真器,并运行即可,需要提前安装好NVIDIA驱动,相关教程很多,这里不详细写了,ubuntu下运行命令为:

./CarlaUE4.sh -quality-level=Low -RenderOffScreen

附带参数第一个指将画质调低,默认为高,视自己的机器配置而定;第二个指不开启预览窗,这个预览窗没啥作用,大部分时候都可以不开。

客户端

这里我是基于ROS2开发的,因此下载carla-ros-bridge作为客户端使用,这个模块包含有多个package,这里重点注意下carla_ros_bridge、carla_spawn_objects、carla_manual_control三个package。

  • carla_ros_bridge
    这个包封装了操作carla服务端的API,使用户不用关心server层的东西,直接通过其提供的几个ROS service创建车辆、传感器、路灯等等各种objects,并对其进行了管理,同时将各类传感器数据从carla格式转化为ROS消息publish出去。
    launch文件中提供了多个参数供设置,这里挑重点参数讲解一下:
    1、host、port
    CARLA server所在主机的IP和端口,端口默认为2000,CARLA server与client在同一局域网即可,server与client在同一机器时IP填localhost,不同机器就填server所在机器IP即可。
    2、fixed_delta_seconds
    很关键的一个参数,决定了仿真时间的前进步长,即每两帧之间的仿真时间差,这里需要首先理解仿真时间与真实时间,做游戏的都很熟悉,它们是并行的两条时间线,仿真有自己的独立时间线,它一定程度上与真实时间无关,仿真器永远是一个帧接一个帧去计算,那么两帧之间的仿真时间差决定了仿真器在仿真时间内的运行频率,而仿真器在真实时间中的运行频率则由两帧计算所需要的真实时间决定,这个跟你机器配置、仿真器效果设置都有关系。
    举例说明,假如设置了fixed_delta_seconds=0.05,会可能发生如下情况:
    01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别
    由于每一帧的计算与计算机配置、当帧需要的计算量都有关系,因此计算该帧需要的真实时间是有波动的,这也导致仿真时间与真实时间无法对齐。
    这个参数之所有很重要,是因为它会跟你设置的传感器频率关联,如果不能理解这个参数,后续传感器频率的配置以及传感器同步都会出问题。
  • carla_spawn_objects
    用来在仿真器中生成各种物体的节点,主要调用carla_ros_bridge生成物体的service完成,实际使用时,需要在config中参考给定的参考json文件新建自己的车辆和传感器配置,并创建对应的launch文件即可,细节参考官方文档
    这里主要讲下sensor_tick这个参数:
    官方解释:Simulation seconds between sensor captures (ticks). 解释的比较直白了,其倒数也就是传感器输出频率,实际使用时要注意结合fixed_delta_seconds使用,也就是仿真步长时间。仿真与真实的区别在于真实时间是连续的,而仿真时间是离散的,仿真器只会计算时隔fixed_delta_seconds的帧,也就是说,将sersor_tick设置为小于fixed_delta_seconds(传感器频率高于仿真器频率)是没有太大意义的,因为会导致仿真一步计算需要计算多帧该传感器数据,并且在同一时刻发出,用户也无法获取每个传感器数据的精确时间,如下图所示:
    01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别
    可以认为,fixed_delta_seconds要小于你配置的所有传感器的sersor_tick,也就是仿真器频率要大于等于所有传感器频率才有意义,在上图的案例中,建议将fixed_delta_seconds设置为0.01s,但是这样会导致计算量增加,而且由于目前python版ros有些bug,会导致计算更慢,此外,使用大量高频率传感器会让仿真器计算量大幅增加,尤其是图像传感器,因此实际使用时,sersor_tick需要酌情而定,如果发现仿真器跑得太慢,可以考虑减少图像传感器或者降低其输出频率。
  • carla_manual_control
    使用pygame显示仿真器画面和接受键盘并转换为控制指令的节点,没有太多可说的,参考其帮助指导即可,这个节点可以借助ROS2的多机通讯机制跟前面两个节点运行在不同的计算机上,当然,server本身也可以跟整个client运行在不同的机器上,前者利用ROS2的多机通信机制,后者利用CARLA的通信机制。

; 使用流程

一般使用流程如下:
01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别

目前存在的问题

目前CARLA客户端问题主要在于运行卡顿,无法设置为与真实时间同步等,部分跟ROS2有关,其中运行卡顿与多个因素有关,这里列举几个个人使用过程中比较头疼的问题如下:

1、激光数据转换时间长

bridge中将激光数据转换为ROS消息的部分采用一个一个点迭代计算的方式,实际测试计算时间很长,可以直接改为整块内存复制,运行速度会大幅加快。

2、ROS2 python版publish时间长

主要导致的原因是python publish部分底层数据拷贝同样采用单个数据迭代拷贝的方式,数据量越大复制时间越长,在图像数据拷贝时尤为明显,这个PR对其进行了修复,但目前只有ROS2 galactic最新版本采用了该修改,实测可以大幅减少publish时间。

3、bridge中采用单线程进行处理

同步模式下对server的tick操作实测在计算量大时可以花费较长时间,再加上tick返回后update所有的传感器同样需要耗费不少时间,实际上以上操作可以并行处理,实测同样可以提升性能。

4、bridge无法设置与真实时间同步

由于仿真时间与真实时间是完全并行的两条线,因此仿真时间可能快于或慢于真实时间,但很多算法验证需要考虑其性能,在部分情况下需要仿真时间与真实时间一致去进行测试,才最符合实际情况,该功能目前没有提供,大部分机器不进行合理的配置,仿真时间都是远远慢于真实时间,直接体现就是卡顿,仿真器跑得很慢,这个可以结合3的问题进行线程优化,考虑fixed_delta_seconds进行合理的sleep来解决。

Original: https://blog.csdn.net/liu3612162/article/details/121423418
Author: m米咔00
Title: 自动驾驶仿真器CARLA_0.9.12安装、使用及存在的问题