1. 人工神经网络

1.1 神经网络结构


人工神经网络(简称神经网络)是模拟人类大脑神经元构造的一个数学计算模型。
一个神经网络的搭建,需要满足三个条件。

  1. 输入和输出
  2. 权重(w)和阈值(b)
  3. 多层感知器的结构

1.2 神经网络运作过程

其中,最困难的部分就是确定权重(w)和阈值(b)。必需有一种方法,可以找出答案。

这种方法就是试错法。其他参数都不变,w(或b)的微小变动,记作Δw(或Δb),然后观察输出有什么变化。不断重复这个过程,直至得到对应最精确输出的那组w和b,就是我们要的值。这个过程称为模型的训练。

因此,神经网络的运作过程如下。

  1. 确定输入和输出
  2. 找到一种或多种算法,可以从输入得到输出(前向传播
  3. 找到一组已知答案的数据集,用来训练模型,估算w和b (后向传播
  4. 一旦新的数据产生,输入模型,就可以得到结果,同时对w和b进行校正

整个过程需要海量计算。所以,神经网络直到最近这几年才有实用价值,而且一般的 CPU 还不行,要使用专门为机器学习定制的 GPU 来计算。

1.3 输出的连续性

上面的模型有一个问题没有解决,按照假设,输出只有两种结果:0和1。但是,模型要求w或b的微小变化,会引发输出的变化。如果只输出0和1,未免也太不敏感了,无法保证训练的正确性,因此必须将"输出"改造成一个连续性函数。

这就需要进行一点简单的数学改造。

首先,将感知器的计算结果wx + b记为z。

z = wx + b

然后,计算下面的式子,将结果记为σ(z)。

σ(z) = 1 / (1 + e^(-z))  # 激活函数

这是因为如果z趋向正无穷z → +∞(表示感知器强烈匹配),那么σ(z) → 1;如果z趋向负无穷z → -∞(表示感知器强烈不匹配),那么σ(z) → 0。也就是说,只要使用σ(z)当作输出结果,那么输出就会变成一个连续性函数。

2. 基于tensorflow实现FASION MINIST图像分类

2.1 加载并准备 MNIST 数据集[image, lable]

dataset, metadata = tfds.load('fashion_mnist', as_supervised=True, with_info=True)
train_dataset, test_dataset = dataset['train'], dataset['test']

分为10个类别

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal',      'Shirt',   'Sneaker',  'Bag',   'Ankle boot']

每张图片像素28*28,每个像素值【0-255】;预处理,像素值由【0-255】转换到【0-1】。

def normalize(images, labels):images = tf.cast(images, tf.float32)images /= 255return images, labels# The map function applies the normalize function to each element in the train
# and test datasets
train_dataset =  train_dataset.map(normalize)
test_dataset  =  test_dataset.map(normalize)# The first time you use the dataset, the images will be loaded from disk
# Caching will keep them in memory, making training faster
train_dataset =  train_dataset.cache()
test_dataset  =  test_dataset.cache()
BATCH_SIZE = 32
train_dataset = train_dataset.repeat().shuffle(num_train_examples).batch(BATCH_SIZE)
test_dataset = test_dataset.batch(BATCH_SIZE)

2.2 构建神经网络

我们将要构建的神经网络,输入层共有784个神经元,输出层共有10个神经元:

model = tf.keras.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28, 1)), # 输入层: This layer transforms the images from a 2d-array of 28  ×  28 pixels, to a 1d-array of 784 pixels (28*28). tf.keras.layers.Dense(128, activation=tf.nn.relu), # 隐藏层:A densely connected layer of 128 neurons. Each neuron (or node) takes input from all 784 nodes in the previous layer, weighting that input according to hidden parameters which will be learned during training, and outputs a single value to the next layer.tf.keras.layers.Dense(10) # 输出层:A 10-node softmax layer, with each node representing a class of clothing. As in the previous layer, each node takes input from the 128 nodes in the layer before it. Each node weights the input according to learned parameters, and then outputs a value in the range [0, 1], representing the probability that the image belongs to that class. The sum of all 10 node values is 1.
])

2.3 为训练选择优化器与损失函数

model.compile(optimizer='adam', #  Optimizer —An algorithm for adjusting the inner parameters of the model in order to minimize loss# 优化函数:最优化的目标就是找到能够使损失函数值最小化的一系列Wloss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), # Loss function — An algorithm for measuring how far the model's outputs are from the desired output. The goal of training is this measures loss.# 损失函数:神经网络模型训练得以实现是经过前向传播计算Loss,根据Loss的值进行反向推导,并进行相关参数的调整。使用的最主要的损失函数是均方误差和交叉熵误差。metrics=['accuracy']) # Metrics —Used to monitor the training and testing steps. The following example uses accuracy, the fraction of the images that are correctly classified.

2.4 使用训练集,训练模型

model.fit(train_dataset, epochs=5, steps_per_epoch=math.ceil(num_train_examples/BATCH_SIZE)) # 训练模型
# 神经网络利用训练数据进行学习,并用测试数据评价学习到的模型
# 神经网络的训练是以损失函数为指标进行的,更新权重以及偏移量,最终使得损失函数的值不断减小。

2.5 使用测试集,评价训练模型

test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test_examples/32))
print('Accuracy on test dataset:', test_accuracy)

2.6 使用模型,预测图片类别

for test_images, test_labels in test_dataset.take(1):test_images = test_images.numpy()test_labels = test_labels.numpy()predictions = model.predict(test_images)

参考

http://www.ruanyifeng.com/blog/2017/07/neural-network.html
https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/zh-cn/tutorials/quickstart/advanced.ipynb

基于tensorflow实现图像分类——理解神经网络运作过程、tensorflow入门相关推荐

  1. 基于pytorch实现图像分类——理解自动求导、计算图、静态图、动态图、pytorch入门

    1. pytorch入门 什么是PYTORCH? 这是一个基于Python的科学计算软件包,针对两组受众: 替代NumPy以使用GPU的功能 提供最大灵活性和速度的深度学习研究平台 1.1 开发环境 ...

  2. TensorFlow游乐园介绍及其神经网络训练过程

    TensorFlow游乐场是一个通过网页浏览器就可以训练简单神经网络.并实现了可视化训练过程的工具.游乐场地址为http://playground.tensorflow.org/ 一.TensorFl ...

  3. 基于KNN实现图像分类——理解图像分类

    1. KNN KNN被翻译为最近邻算法,顾名思义,找到最近的k个邻居,在前k个最近样本(k近邻)中选择最近的占比最高的类别作为预测类别. 如上图所示: 五角星(待预测的)要被赋予哪个类,是紫色圆形还是 ...

  4. 深度学习(四十)优化求解系列(2)简单理解神经网络求解过程-未完待续

    对于神经网络的求解过程BP,其实说白了就是复合函数的求导过程,所以我们需要先复习一下高数复合函数的求导过程. 一.复合函数的求导法则 1.复合函数: 此函数是一个包含了三层映射过程的复合函数,为了跟后 ...

  5. 图像分类_04神经网络最优化过程:反向传播+代码实现

    logistic模型原理与推导过程分析(1)https://blog.csdn.net/qq_39237205/article/details/121031296https://blog.csdn.n ...

  6. 练习推导一个最简单的BP神经网络训练过程【个人作业/数学推导】

    写在前面: 各式资料中关于BP神经网络的讲解已经足够全面详尽,故不在此过多赘述.本文重点在于由一个"最简单"的神经网络练习推导其训练过程,和大家一起在练习中一起更好理解神经网络训练 ...

  7. 基于Go语言来理解Tensorflow

    Tensorflow并非一套特定机器学习库--相反,其属于一套通用型计算库,负责利用图形表达计算过程.其核心通过C++语言实现,同时亦绑定有多种其它语言.与Python绑定不同的是,Go编程语言绑定不 ...

  8. 毕业设计 - 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

    文章目录 0 简介 1 常用的分类网络介绍 1.1 CNN 1.2 VGG 1.3 GoogleNet 2 图像分类部分代码实现 2.1 环境依赖 2.2 需要导入的包 2.3 参数设置(路径,图像尺 ...

  9. numpy找到矩阵中不同元素的种类_基于NumPy和图像分类的人工神经网络构建

    基于NumPy和图像分类的人工神经网络构建 本文利用NumPy系统在Python中构建人工神经网络,以便为Fruits360数据集执行图像分类应用程序. 本文提及的所有内容(即图像和源代码,不包括Fr ...

最新文章

  1. Kotlin中使用简洁明了的代码替换findViewByid
  2. Flutter framework在线上构建时的包大小优化
  3. 国内淘宝镜像 cnpm转npm
  4. oracle session_wait,转载:学习Oracle动态性能表-(8)-V$SESSION_WAIT,V$SESSION_EVENT
  5. deepl windows_推荐一个为程序员深度开发的翻译插件DeepL
  6. Golang——map集合初始化、键值操作、map作为函数参数的使用
  7. Go1.18 新特性:高效复制,strings, bytes 库新增 Clone 功能
  8. 2018年1月19日 第七次小组会议
  9. Linux内核:Gigantic巨页与CMA的结合的PATCH补丁提交
  10. 华为p20pro投屏到笔记本_新荣耀笔记本与微软系统合作,网友:一碰即传投屏功能还有吗...
  11. spring boot集成swagger2
  12. 我们决定聚在一起搞大事
  13. SSE3指令集系列----数据加载与算术运算指令
  14. LoRa技术-什么是LoRa
  15. 2021-08-17:资产波动之贝塔系数的比喻
  16. Error(13) 解决LoggerFactory is not a Logback LoggerContext but Logback is on the classpath
  17. 计算机提示无法识别优盘,插入U盘显示无法识别怎么办
  18. 清华大学计算机系学术委员会,清华大学学术委员会召开2018年度全体会议
  19. 内网穿透:什么是内网穿透,以及用什么软件
  20. 用Django实现网页Url使用汉语拼音PinYin作为SEO优化的实现方法

热门文章

  1. 计算机界面横向拉宽了怎样还原,电脑屏幕变大变小了如何还原
  2. oracle修改undo清理时间,修改Oracle的Undo文件的方法
  3. er图 navicat_navicat怎么生成er图
  4. vscode 语法检查_Jenkins 声明式流水线的语法错误检查
  5. java json重命名,eclipse中java变量怎么变成json格式的编码?
  6. java中nodelist的用法_我可以在Java中使用for-each遍历一个NodeList吗?
  7. 机器学习和深度学习_算法测评 | 机器学习VS深度学习
  8. java 算法 福尔摩斯的约会
  9. linux nohup后台执行管道操作
  10. layui数据可视化_空间数据可视化 GEOM