TensorFlow-similarity 学习笔记5

TensorFlow-similarity 学习笔记5

2021SC@SDUSC
学习内容:Tensorflow 概念总结和学习

特征提取

前文操作中的任何步骤:
图像大小不等;
有 62 个标签或目标值(因为您的标签从 0 开始到 61 结束);
交通标志值的分布非常不均;数据集中大量存在的标志之间实际上没有任何联系。
以这样一种方式处理您的数据,即准备好将其输入到神经网络或您想要输入的任何模型中。让我们先从提取一些特征开始——重新缩放图像,并将保存在图像数组中的图像转换为灰度。您将进行这种颜色转换主要是因为颜色在分类问题中不太重要,例如您现在要回答的问题。然而,对于检测,颜色确实起到了很大的作用,所以在这些情况下,不需要进行这种转换。
为了处理不同的图像尺寸,重新缩放图像;可以借助 skimage 或 Scikit-Image 库轻松完成此操作,该库是一组用于图像处理的算法。
在这种情况下,transform 模块会派上用场,因为它为您提供了一个 resize() 函数;您会看到您使用列表理解(再次!)将每个图像的大小调整为 28 x 28 像素。再一次,您看到了实际形成列表的方式:对于在图像数组中找到的每个图像,将执行从 skimage 库中借用的转换操作。最后,将结果存储在 images28 变量中:

# Import the `transform` module from `skimage` 
from skimage import transform 
# Rescale the images in the `images` array 
images28 = [transform.resize(image, (28, 28)) for image in images]

图像现在是四维的:如果将 images28 转换为数组并将属性形状连接到它,将看到打印输出告诉您 images28 的维度是 (4575, 28, 28, 3)。 图像是 784 维的(因为您的图像是 28 x 28 像素)。
可以通过重新使用上面使用的代码在 traffic_signs 变量的帮助下绘制 4 个随机图像来检查重新缩放操作的结果;将所有对图像的引用更改为 images28。
结果:
在这里插入图片描述
因为重新缩放,最小值和最大值也发生了变化;现在它们都在相同的范围内,这样就不一定需要对数据进行标准化。
尝试回答分类问题时,图片中的颜色无关紧要。这就是为什么还会遇到将图像转换为灰度的麻烦的原因。
就像重新缩放一样,您可以再次依靠 Scikit-Image 库来帮助您;在这种情况下,您需要使用带有 rgb2gray() 函数的颜色模块来到达需要的位置。
不要忘记将 images28 变量转换回数组,因为 rgb2gray() 函数确实需要一个数组作为参数。

# Import `rgb2gray` from `skimage.color` 
from skimage.color import rgb2gray 
# Convert `images28` to an array 
images28 = np.array(images28) 
# Convert `images28` to grayscale 
images28 = rgb2gray(images28)

通过绘制一些图像来仔细检查灰度转换的结果; 在这里,可以再次重用并稍微调整一些代码以显示调整后的图像。
必须指定颜色图或 cmap 并将其设置为“灰色”才能以灰度绘制图像。 这是因为 imshow() 默认使用类似热图的颜色图。
在这里插入图片描述
这两个步骤是非常基本的步骤; 可以对数据尝试的其他操作包括数据增强(旋转、模糊、移动、改变亮度……)。 还可以设置整个数据操作操作管道,通过该管道发送图像。

TensorFlow 进行深度学习

神经网络建模
使用传统别名 tf.然后,在 Graph() 的帮助下初始化 Graph。可以使用此函数来定义计算。使用 Graph,无需计算任何内容,因为它不包含任何值。它只是定义了稍后运行的操作。
在这种情况下, as_default() 设置默认上下文,它返回一个上下文管理器,使此特定 Graph 成为默认图。同一进程中创建多个图,则可以使用此方法:使用此函数,将拥有一个全局默认图,未明确创建新图,所有操作都将添加到该图。
建立了模型,在编译它时,定义了一个损失函数、一个优化器和一个指标。现在,当使用 TensorFlow 时,这一切都在一个步骤中发生:
首先,输入和标签定义占位符,因为还没有放入“真实”数据。占位符是未分配的值,并且会在运行会话时由会话初始化。因此,当最终运行会话时,这些占位符将获得在 run() 函数中传递的数据集的值!
然后,建立网络。首先在 flatten() 函数的帮助下将输入展平,该函数将为您提供一个形状数组 [None, 784] 而不是 [None, 28, 28],这是灰度图像的形状。
将输入展平后,可以构建一个全连接层,生成大小为 [None, 62] 的对数。 Logits 是对前一层的未缩放输出进行操作的函数,它使用相对比例来理解单位是线性的。
构建多层感知器后,可以定义损失函数。损失函数的选择取决于任务:在这种情况下:

sparse_softmax_cross_entropy_with_logits()

这会计算 logits 和标签之间的稀疏 softmax 交叉熵。换句话说,它测量类互斥的离散分类任务中的概率误差。这意味着每个条目都在一个类中。在这里,一个交通标志只能有一个标签。请记住,虽然回归用于预测连续值,但分类用于预测离散值或数据点类别。用reduce_mean() 包装这个函数,它计算张量维度上元素的平均值。
定义一个训练优化器;一些最流行的优化算法是随机梯度下降 (SGD)、ADAM 和 RMSprop。根据选择的算法,需要调整某些参数,例如学习率或动量。在这种情况下,选择 ADAM 优化器,将学习率定义为 0.001。

# Import `tensorflow` 
import tensorflow as tf 

# Initialize placeholders 
x = tf.placeholder(dtype = tf.float32, shape = [None, 28, 28])
y = tf.placeholder(dtype = tf.int32, shape = [None])

# Flatten the input data
images_flat = tf.contrib.layers.flatten(x)

# Fully connected layer 
logits = tf.contrib.layers.fully_connected(images_flat, 62, tf.nn.relu)

# Define a loss function
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels = y, 
                                                                    logits = logits))
# Define an optimizer 
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

# Convert logits to label indexes
correct_pred = tf.argmax(logits, 1)

# Define an accuracy metric
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

运行神经网络

已经逐层构建了模型。为此,首先需要在 Session() 的帮助下初始化一个会话,将在上一节中定义的图形传递给该会话。接下来,可以使用 run() 运行会话,可以将初始化操作以您在上一节中定义的 init 变量的形式传递给该会话。
可以使用此初始化会话来启动 epochs 或训练循环。选择 201 是因为希望能够注册最后一个 loss_value;在循环中,训练优化器和定义的损失(或准确性)指标运行会话。还传递了一个 feed_dict 参数,可以使用它向模型提供数据。每 10 个 epoch 之后,将获得一个日志,更深入地了解模型的损失或成本。
无需手动关闭会话。但是,如果想尝试不同的设置,如果已将会话定义为 sess,则可能需要使用 sess.close() 执行此操作,如下面的代码块所示:

tf.set_random_seed(1234)
sess = tf.Session()

sess.run(tf.global_variables_initializer())

for i in range(201):
        print('EPOCH', i)
        _, accuracy_val = sess.run([train_op, accuracy], feed_dict={x: images28, y: labels})
        if i % 10 == 0:
            print("Loss: ", loss)
        print('DONE WITH EPOCH')

评估神经网络

仍然需要评估您的神经网络。 在这种情况下,已经可以尝试通过选择 10 个随机图像并将预测标签与真实标签进行比较来了解模型的表现。
可以先将它们打印出来,也可以使用 matplotlib 自己绘制交通标志并进行视觉比较

# Import `matplotlib`
import matplotlib.pyplot as plt
import random

# Pick 10 random images
sample_indexes = random.sample(range(len(images28)), 10)
sample_images = [images28[i] for i in sample_indexes]
sample_labels = [labels[i] for i in sample_indexes]

# Run the "correct_pred" operation
predicted = sess.run([correct_pred], feed_dict={x: sample_images})[0]
                        
# Print the real and predicted labels
print(sample_labels)
print(predicted)

# Display the predictions and the ground truth visually.
fig = plt.figure(figsize=(10, 10))
for i in range(len(sample_images)):
    truth = sample_labels[i]
    prediction = predicted[i]
    plt.subplot(5, 2,1+i)
    plt.axis('off')
    color='green' if truth == prediction else 'red'
    plt.text(40, 10, "Truth:        {0}\nPrediction: {1}".format(truth, prediction), 
             fontsize=12, color=color)
    plt.imshow(sample_images[i],  cmap="gray")

plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值