第T2周:彩色图片分类

一、前期工作

1.设置GPU

代码知识点
tf.config.experimental.set_memory_growth(gpu0,True) 将第一个GPU设备(gpu0)设置为内存增长模式。在这种模式下,TensorFlow会根据需要动态地分配和释放GPU内存,而不是一开始就占用所有可用的GPU内存。

import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0]
    tf.config.experimental.set_memory_growth(gpu0,True)
    tf.config.set_visible_devices([gpu0],"GPU")

2.导入数据

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

3.归一化

代码知识点
对于灰度图片来说,每个像素最大值是255,每个像素最小值是0,也就是直接除以255就可以完成归一化。灰度图片是一种数字图像,每个像素只有一个采样颜色,通常显示为从最暗黑色到最亮的白色的灰度。灰度图片中的灰度级别是指黑色到白色之间的等级数,一般为256级。

train_images, test_images = train_images / 225.0 , test_images / 225.0

train_images.shape, test_images.shape, train_labels.shape, test_labels.shape

输出
((50000, 32, 32, 3), (10000, 32, 32, 3), (50000, 1), (10000, 1))

4.可视化

class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

plt.figure(figsize=(20,10))
for i in range(20):
    plt.subplot(5, 10, i+1)# subplot(子图行数,子图列数,子图索引(从1开始))
     # 不显示轴刻度
    plt.xticks([])
    plt.yticks([])
     # 不显示子图网格线
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i][0]])
plt.show()

输出这里是引用

二、构建CNN网络

关于卷积输出的计算方法(来自教案“知识储备部分”)
在这里插入图片描述
当我们将设置Padding=“same”时,会动态调整填充大小,使得输入输出的大小相等。

model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
    layers.MaxPool2D(2, 2),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPool2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10)
])

model.summary()

输出在这里插入图片描述

三、编译

代码知识点

  1. model.compileKeras中用于配置模型的训练选项的方法。它通常在模型定义完成后,训练数据准备就绪之前调用。
  2. SparseCategoricalCrossentropy()是Keras中用于计算稀疏类别交叉熵损失函数的方法。
  3. from_logits=True:这是一个参数,表示输入到损失函数的预测值是否已经是概率分布(即logits)。如果输入已经是概率分布,那么将from_logits设置为True;如果输入是原始的预测值,那么将from_logits设置为False。
  4. metrics:评估指标,用于衡量模型的性能。常用的评估指标有准确率(accuracy)、精确率(precision)、召回率(recall)等。可以传入一个列表,包含多个评估指标。
model.compile(
     optimizer='adam',
     loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
     metrics=['accuracy'])

四、训练模型

history = model.fit(train_images, train_labels, epochs=10,
                    validation_data = (test_images, test_labels))

输出
Epoch 1/10
1563/1563 [ ] - 17s 10ms/step - loss: 1.5035 - accuracy: 0.4491 - val_loss: 1.2236 - val_accuracy: 0.5606
Epoch 2/10
1563/1563 [ ] - 17s 11ms/step - loss: 1.1326 - accuracy: 0.5983 - val_loss: 1.0417 - val_accuracy: 0.6288
Epoch 3/10
1563/1563 [ ] - 15s 10ms/step - loss: 0.9645 - accuracy: 0.6608 - val_loss: 0.9656 - val_accuracy: 0.6654
Epoch 4/10
1563/1563 [ ] - 15s 10ms/step - loss: 0.8638 - accuracy: 0.6983 - val_loss: 0.9057 - val_accuracy: 0.6866
Epoch 5/10
1563/1563 [ ] - 16s 10ms/step - loss: 0.7846 - accuracy: 0.7249 - val_loss: 0.9041 - val_accuracy: 0.6895
Epoch 6/10
1563/1563 [ ] - 14s 9ms/step - loss: 0.7296 - accuracy: 0.7451 - val_loss: 0.8858 - val_accuracy: 0.6974
Epoch 7/10
1563/1563 [ ] - 17s 11ms/step - loss: 0.6773 - accuracy: 0.7625 - val_loss: 0.8517 - val_accuracy: 0.7153
Epoch 8/10
1563/1563 [ ] - 15s 10ms/step - loss: 0.6364 - accuracy: 0.7783 - val_loss: 0.8526 - val_accuracy: 0.7172
Epoch 9/10
1563/1563 [ ] - 16s 11ms/step - loss: 0.5950 - accuracy: 0.7929 - val_loss: 0.8586 - val_accuracy: 0.7174
Epoch 10/10
1563/1563 [ ] - 18s 11ms/step - loss: 0.5567 - accuracy: 0.8061 - val_loss: 0.8664 - val_accuracy: 0.7190

五、预测

plt.imshow(test_images[1])

这里是引用

代码知识点
np.argmax是numpy库中的一个函数,它的主要功能是返回输入数组中最大值的索引。如果输入数组中出现多个最大值,np.argmax将返回第一个最大值的索引。这个函数有两个参数,第一个参数是需要找到最大值索引的数组,第二个参数是指定的轴,即沿着哪个轴寻找最大值。例如,当axis=1时,函数会按行比较并找出每行的最大值索引。值得注意的是,如果不指定轴,则函数会将整个数组平铺开来,找出其中最大的那个值的索引。此外,np.argmax函数还支持out参数,用于指定一个数组用于存储结果。

import numpy as np

pre = model.predict(test_images)
print(class_names[np.argmax(pre[1])])

输出
313/313 [==============================] - 1s 2ms/step
ship

六、模型评估

代码知识点

plt.plot() 是一个绘图函数,它接受两个参数:x轴的数据和y轴的数据。

history.history['accuracy'] 是从训练过程中保存的历史记录中获取准确率数据。历史记录通常在模型训练时使用 model.fit() 函数进行训练,并返回一个包含训练过程中各种指标的对象。
label='accuracy' 是一个可选参数,用于设置图例标签。
plt.ylim([0.5, 1])用于调节y轴的范围
plt.legend(loc='lower right')将图例的位置设置在了
verbose=2表示在评估过程中输出详细信息,包括每个批次的损失值和准确率。下角

import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_acc')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.xlim([1, 10])
plt.ylim([0.5, 0.85])
plt.legend(loc='lower right')
plt.show()

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

输出
这里是引用
313/313 - 1s - loss: 0.8664 - accuracy: 0.7190 - 943ms/epoch - 3ms/step

print(test_acc)

0.718999981880188

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值