输入为28, shape变为26,是因为最边上的像素没有侧边像素,为了准确性,舍弃了上下左右的第一个像素。

1. 使用卷积提高计算机视觉精度

https://bit.ly/tfw-lab4

在前面的课程中,您看到了如何使用包含三层的深度神经网络 (DNN) 进行时尚识别——输入层(以数据的形式)、输出层(以所需的输出形式)和隐藏层。您尝试了不同大小的隐藏层、训练周期数等对最终准确度的影响。

为方便起见,这里再次提供完整代码。运行它并记下最后打印出来的测试准确度。

import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images / 255.0
test_images=test_images / 255.0
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activation=tf.nn.relu),tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)test_loss = model.evaluate(test_images, test_labels)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
40960/29515 [=========================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
26435584/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
16384/5148 [===============================================================================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step
4431872/4422102 [==============================] - 0s 0us/step
Epoch 1/5
1875/1875 [==============================] - 5s 2ms/step - loss: 0.4977 - accuracy: 0.8253
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3760 - accuracy: 0.8645
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3362 - accuracy: 0.8771
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3124 - accuracy: 0.8859
Epoch 5/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2951 - accuracy: 0.8919
313/313 [==============================] - 1s 1ms/step - loss: 0.3487 - accuracy: 0.8762

你的准确率可能是训练的 89% 和验证的 87% …不错…但是你如何使它变得更好?一种方法是使用称为卷积的东西。我不会在这里详细介绍卷积,但最终的概念是它们缩小图像的内容范围,以专注于特定的、独特的细节。

如果您曾经使用过滤器进行过图像处理(例如:https://en.wikipedia.org/wiki/Kernel_(image_processing)),那么卷积看起来会非常熟悉。

简而言之,您获取一个数组(通常为 3x3 或 5x5)并将其传递到图像上。通过根据该矩阵中的公式更改底层像素,您可以执行诸如边缘检测之类的操作。因此,例如,如果您查看上面的链接,您将看到为边缘检测定义的 3x3,其中中间单元格为 8,其所有相邻单元格均为 -1。在这种情况下,对于每个像素,您将其值乘以 8,然后减去每个相邻像素的值。对每个像素都这样做,你最终会得到一个边缘增强的新图像。

这对于计算机视觉来说是完美的,因为通常可以像这样突出显示的特征将一个项目与另一个项目区分开来,并且所需的信息量要少得多……因为您只需对突出显示的特征进行训练。

这就是卷积神经网络的概念。在拥有密集层之前添加一些层进行卷积,然后进入密集层的信息更加集中,并且可能更准确。

运行下面的代码——这是与之前相同的神经网络,但这次首先添加了卷积层。这将需要更长的时间,但看看对准确性的影响:

切换为GPU运行: Runtime > change runtime type > GPU

import tensorflow as tf
print(tf.__version__)
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0
model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),tf.keras.layers.MaxPooling2D(2, 2),tf.keras.layers.Conv2D(64, (3,3), activation='relu'),tf.keras.layers.MaxPooling2D(2, 2),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
model.fit(training_images, training_labels, epochs=5)
test_loss = model.evaluate(test_images, test_labels)
2.6.0
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
40960/29515 [=========================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
26435584/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
16384/5148 [===============================================================================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step
4431872/4422102 [==============================] - 0s 0us/step
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv2d (Conv2D)              (None, 26, 26, 64)        640
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 64)        0
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 11, 11, 64)        36928
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64)          0
_________________________________________________________________
flatten (Flatten)            (None, 1600)              0
_________________________________________________________________
dense (Dense)                (None, 128)               204928
_________________________________________________________________
dense_1 (Dense)              (None, 10)                1290
=================================================================
Total params: 243,786
Trainable params: 243,786
Non-trainable params: 0
_________________________________________________________________
Epoch 1/5
1875/1875 [==============================] - 41s 6ms/step - loss: 0.4408 - accuracy: 0.8391
Epoch 2/5
1875/1875 [==============================] - 11s 6ms/step - loss: 0.2935 - accuracy: 0.8921
Epoch 3/5
1875/1875 [==============================] - 11s 6ms/step - loss: 0.2470 - accuracy: 0.9089
Epoch 4/5
1875/1875 [==============================] - 11s 6ms/step - loss: 0.2156 - accuracy: 0.9204
Epoch 5/5
1875/1875 [==============================] - 11s 6ms/step - loss: 0.1897 - accuracy: 0.9286
313/313 [==============================] - 1s 4ms/step - loss: 0.2450 - accuracy: 0.9118

它可能在训练数据和验证数据上分别上升到 93% 和 91%。

这很重要,而且是朝着正确方向迈出的一步!

尝试运行更多 epochs——比如大约 20 个,然后探索结果!但是,虽然结果可能看起来非常好,但由于称为“过度拟合”的东西,验证结果实际上可能会下降,这将在后面讨论。

(简而言之,当网络从训练集中学习数据非常好时,就会发生“过度拟合”,但它过于专业化,仅针对该数据,因此在查看其他数据时效果较差。例如,如果您一生都在你只见过红色的鞋子,那么当你看到红色的鞋子时,你会很好地识别它,但蓝色的麂皮鞋可能会让你感到困惑…而且你知道你永远不应该弄乱我的蓝色麂皮鞋。)

然后,再次查看代码,逐步了解卷积是如何构建的:

第一步是收集数据。您会注意到这里有一些变化,需要重新调整训练数据。这是因为第一个卷积需要一个包含所有内容的张量,因此列表中不是 60,000 个 28x28x1 的项目,而是一个 60,000x28x28x1 的 4D 列表,测试图像也是如此。如果不这样做,则在训练时会出现错误,因为卷积无法识别形状。

import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0

接下来是定义您的模型。现在,您将添加一个卷积,而不是顶部的输入层。参数是:

  1. 您要生成的卷积数。纯粹随意,但最好从 32 的顺序开始
  2. 卷积的大小,在本例中为 3x3 网格
  3. 要使用的激活函数——在本例中我们将使用 relu,您可能还记得它相当于当 x>0 时返回 x,否则返回 0
  4. 在第一层,输入数据的形状。

您将使用 MaxPooling 层跟随卷积,然后该层旨在压缩图像,同时保留由卷积突出显示的特征的内容。通过为 MaxPooling 指定 (2,2),效果是图像大小的四分之一。这里没有过多的细节,这个想法是它创建一个 2x2 像素阵列,并选择最大的一个,从而将 4 个像素变成 1 个。它在整个图像上重复这个,这样做将水平的数量减半,并将垂直像素数减半,有效缩小图像 25%。

你可以调用model.summary()来查看网络的大小和形状,你会注意到在每个MaxPooling层之后,图像大小都是这样缩小的。

model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)),tf.keras.layers.MaxPooling2D(2, 2),

添加另一个卷积

  tf.keras.layers.Conv2D(64, (3,3), activation='relu'),tf.keras.layers.MaxPooling2D(2, 2),

现在展平输出。在此之后,您将拥有与非卷积版本相同的 DNN 结构

 tf.keras.layers.Flatten(),

与前卷积示例中相同的 128 个密集层和 10 个输出层:

  tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(10, activation='softmax')
])

现在编译模型,调用 fit 方法进行训练,并从测试集评估损失和准确度。

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_acc)

2. 可视化卷积和池化

此代码将以图形方式向我们展示卷积。打印 (test_labels[;100]) 向我们展示了测试集中的前 100 个标签,您可以看到索引 0、索引 23 和索引 28 处的标签都是相同的值 (9)。都是鞋子。让我们看看在每个上运行卷积的结果,您将开始看到它们之间的共同特征出现。现在,当 DNN 对这些数据进行训练时,它的工作量要少得多,而且它可能会根据这种卷积/池化组合找到鞋子之间的共性。

print(test_labels[:100])
[9 2 1 1 6 1 4 6 5 7 4 5 7 3 4 1 2 4 8 0 2 5 7 9 1 4 6 0 9 3 8 8 3 3 8 0 75 7 9 6 1 3 7 6 7 2 1 2 2 4 4 5 8 2 2 8 4 8 0 7 7 8 5 1 1 2 3 9 8 7 0 2 62 3 1 2 8 4 1 8 5 9 5 0 3 2 0 6 5 3 6 7 1 8 0 1 4 2]
import matplotlib.pyplot as plt
f, axarr = plt.subplots(3,4)
FIRST_IMAGE=0
SECOND_IMAGE=7
THIRD_IMAGE=26
CONVOLUTION_NUMBER = 1
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
for x in range(0,4):f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')axarr[0,x].grid(False)f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')axarr[1,x].grid(False)f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')axarr[2,x].grid(False)


练习

  1. 尝试编辑卷积。layers 将 32s 更改为 16 或 64。这会对准确性和/或训练时间产生什么影响。(Layers越大每次Epoch越慢,准确度也会提升)
    layers: 16

layers: 32

layers: 64

  1. 删除最后的卷积。这会对准确性或训练时间产生什么影响?
    每次Epoch,准确度下降,时间变快

  2. 添加更多卷积怎么样?您认为这会产生什么影响?试验它。
    每次Epoch,准确度上升,时间变快

  3. 删除所有卷积,但第一个除外。您认为这会产生什么影响?试验它。
    去掉Pooling2D,每次Epoch,准确度几乎没有变化,时间变慢

  4. 在上一课中,您实现了一个回调来检查损失函数并在达到一定数量后取消训练。看看你能不能在这里实现它!
    https://bit.ly/tfw-lab4exa
    回调实现和调用

class myCallback(tf.keras.callbacks.Callback):def on_epoch_end(self, epoch, logs={}):if(logs.get('accuracy')>0.98):print("\nReached 98% accuracy so cancelling training!")self.model.stop_training = Truecallbacks = myCallback()model.fit(training_images, training_labels, epochs=100, callbacks=[callbacks])

完整代码

import tensorflow as tf
print(tf.__version__)class myCallback(tf.keras.callbacks.Callback):def on_epoch_end(self, epoch, logs={}):if(logs.get('accuracy')>0.98):print("\nReached 98% accuracy so cancelling training!")self.model.stop_training = Truecallbacks = myCallback()
mnist = tf.keras.datasets.mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0
model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)),tf.keras.layers.MaxPooling2D(2, 2),#tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)),#tf.keras.layers.MaxPooling2D(2, 2),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=100, callbacks=[callbacks])
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_acc)
2.6.0
Epoch 1/100
1875/1875 [==============================] - 8s 4ms/step - loss: 0.1589 - accuracy: 0.9528
Epoch 2/100
1875/1875 [==============================] - 8s 4ms/step - loss: 0.0542 - accuracy: 0.9834Reached 98% accuracy so cancelling training!
313/313 [==============================] - 1s 3ms/step - loss: 0.0437 - accuracy: 0.9854
0.9854000210762024

参考

https://www.youtube.com/watch?v=dd8H4fiL9Yc

TensorFlow by Google 实战CNN Machine Learning Foundations: Ep #4 - Coding with CNN相关推荐

  1. TensorFlow by Google 使用排序 APIMachine Learning Foundations: Ep #9 - Using the Sequencing APIs

    练习 https://bit.ly/tfw-nlp2 import tensorflow as tf from tensorflow import kerasfrom tensorflow.keras ...

  2. TensorFlow: A System for Large-Scale Machine Learning翻译

    TensorFlow: A System for Large-Scale Machine Learning 1.Abstract TensorFlow是在大规模和异构环境中运行的机器学习系统.  Te ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...

    机器学习实战(Machine Learning in Action)学习笔记----06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习 作者:米仓山下 时 ...

  4. 機器學習基石 机器学习基石 (Machine Learning Foundations) 作业二 Q19-20 C++实现

    大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业2 Q19-20的C++实现.虽然有很多大神已经在 ...

  5. 機器學習基石 机器学习基石(Machine Learning Foundations) 作业1 习题解答

    大家好,我是Mac Jiang,今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业1的习题解答.笔者是在学习了Ng的Machine ...

  6. 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 课后习题解答

    今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业三的习题解答.笔者在做这些题目时遇到很多困难,当我在网上寻找答案时却找不到,而林老 ...

  7. 【机器学习实战】Machine Learning in Action 代码 视频 项目案例

    MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 ApacheCN - 学习机器学习群[629470233] Machine Learning in ...

  8. tensorflow 小于_TensorFlow做Sparse Machine Learning

    TensorFlow Sparse现状及背景 在机器学习这块,Estimator本身的封装能够适应比较多的Dense的场景,而对于Sparse的场景无论是官方demo还是一些业界的大牛都分享的比较少, ...

  9. 林轩田机器学习基石(Machine Learning Foundations)笔记(一)

    要求两周之内看完林轩田机器学习基石和技法,速度是要的,但是感觉看得太快我会不久就会忘记.因此记录一下梗概,顺便写写看视频时解决的不懂的地方(有种思想就是把知识传播给更多人,有时候就是靠大佬们善意的一句 ...

  10. 大量机器学习(Machine Learning)深度学习(Deep Learning)资料

    机器学习目前比较热,网上也散落着很多相关的公开课和学习资源,这里基于课程图谱的机器学习公开课标签做一个汇总整理,便于大家参考对比. 1.Coursera上斯坦福大学Andrew Ng教授的" ...

最新文章

  1. VS Code 离线安装插件方法
  2. Aspose.Cells使用总结大全
  3. Cloudera Manager内部结构、功能包括配置文件、目录位置等
  4. xmanager linux,教您用xmanager启动Linux上的图形界面程序-Go语言中文社区
  5. QCon上海2015热点前瞻:Uber伸缩之道、注重实效的性能
  6. 什么是eager loading
  7. SSL/TLS 配置
  8. python3层装饰器_python三层装饰器python字符串,数值计算
  9. 基于php的选课系统设计(含源文件)
  10. Linux(debian7)操作基础(十四)之文本搜索命令grep使用方法
  11. spring mvc 上传文件
  12. C# 连接mysql 报错:SSL Connection error
  13. 安装包制作工具 SetupFactory使用 详解
  14. MQTT测试工具推荐
  15. 详解网站WEB日志格式
  16. 如何将pdf转换成jpg图片格式
  17. 计算机专业女生节祝福语,大学女生节简短祝福语
  18. 一些可供参考的游戏出海技术架构与经验总结
  19. 山东理工acm非专业-顺序结构
  20. 37-48.产品经理入门到精通(四)

热门文章

  1. ue4 模板类实例化_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...
  2. 请检查 mysql 模块是否正确加载_mysql_connect() 不支持 请检查 mysql 模块是否正确加载...
  3. html图片滚动暂停,怎么设置鼠标悬停时滚动的图片或文字停止?
  4. 获取GridView的EmptyDataTemplate中的控件
  5. Linux学习----文件的使者-Rsync(马哥教育原创)
  6. java.io.IOException: Connection reset by peer
  7. CentOS 7安装Mysql并设置开机自启动
  8. zabbix监控端口状态
  9. 2.3Word2003段落设置1
  10. php set get 作用_浅谈PHP拦截器之__set()与__get()的理解与使用方法