TensorFlow中的卷积神经网络(CNN)的训练

TensorFlow中的卷积神经网络(CNN)的训练

在这篇文章中,我们将使用TensorFlow这个大规模的机器学习库来实现和训练一个卷积神经网络CNN。

在这篇文章中,我们将在一个名为 “石头剪刀布 “的数据集上工作,我们需要将手势简单地分类为石头和剪刀。

一步一步实现

第1步:导入库

我们将从导入一些重要的库开始。它们是TensorFlow、NumPyMatplotlib,最后从TensorFlow中,我们需要TensorFlow数据集和Keras

pip install -q tensorflow tensorflow-datasets
 
# Importing the packages
import matplotlib.pyplot as plt
import numpy as np
 
import tensorflow as tf
import tensorflow_datasets as tfds
 
from tensorflow import keras

第2步:加载数据集

在选择数据集之前,请自由探索TensorFlow中所有可用的数据集。

tfds.list_builders()

输出:

['abstract_reasoning',
 'accentdb',
 'aeslc',
 'aflw2k3d',
 'ag_news_subset',
 'ai2_arc',
 'ai2_arc_with_ir',
 'amazon_us_reviews',
 'anli',
 'arc',
 'bair_robot_pushing_small',
 'bccd',
 'beans',
 'big_patent',
 ....
 ..
 .

在加载数据集之前,我们将看到关于我们的数据集的一些信息,这样我们就可以很容易地处理数据并收集一些非常重要的信息。

# Getting info about the dataset
Dataset = tfds.builder('rock_paper_scissors')
info = Dataset.info
 
print(info)

输出:

tfds.core.DatasetInfo(
    name='rock_paper_scissors',
    full_name='rock_paper_scissors/3.0.0',
    description="""
    Images of hands playing rock, paper, scissor game.
    """,
    homepage='http://laurencemoroney.com/rock-paper-scissors-dataset',
    data_path='C:\\Users\\ksaty\\tensorflow_datasets\\rock_paper_scissors\\3.0.0',
    download_size=Unknown size,
    dataset_size=Unknown size,
    features=FeaturesDict({
        'image': Image(shape=(300, 300, 3), dtype=tf.uint8),
        'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=3),
    }),
    supervised_keys=('image', 'label'),
    disable_shuffling=False,
    splits={
    },
    citation="""@ONLINE {rps,
    author = "Laurence Moroney",
    title = "Rock, Paper, Scissors Dataset",
    month = "feb",
    year = "2019",
    url = "http://laurencemoroney.com/rock-paper-scissors-dataset"
    }""",
)

最后加载数据集。

# Loading the dataset
ds_train = tfds.load(name="rock_paper_scissors", split="train")
ds_test = tfds.load(name="rock_paper_scissors", split="test")

输出:

Downloading and preparing dataset Unknown size (download: Unknown size, generated: Unknown size, total: Unknown size) to C:\Users\ksaty\tensorflow_datasets\rock_paper_scissors\3.0.0…

Dl Completed…: 100%

2/2 [00:50<00:00, 25.01s/ url]

Dl Size…: 100%

219/219 [00:50<00:00, 4.38 MiB/s]

Dataset rock_paper_scissors downloaded and prepared to C:\Users\ksaty\tensorflow_datasets\rock_paper_scissors\3.0.0. Subsequent calls will reuse this data.

部分例子

TensorFlow中的卷积神经网络(CNN)的训练

第3步:分析和预处理图像

首先,为了保持干净,我们要对数据进行迭代,并将其存储为NumPy数组,取消图像的尺寸,并将其存储为train_images,以及带有标签的测试图像。

# Iterating over the images and storing
# it in train and test datas
train_images = np.array([image['image'].numpy()[:, :, 0]
                         for image in ds_train])
train_labels = np.array([image['label']
                         .numpy() for image in ds_train])
 
test_images = np.array([image['image'].numpy()[:, :, 0] for image in ds_test])
test_labels = np.array([image['label'].numpy() for image in ds_test])

然后,现在我们要重塑图像,然后将数据类型从uint8转换为float32,然后我们要将所有的值降到0到1,以使模型更容易从中学习。

# Reshaping the images
train_images = train_images.reshape(2520, 300, 300, 1)
test_images = test_images.reshape(372, 300, 300, 1)
 
# Changing the datatype
train_images = train_images.astype('float32')
test_images = test_images.astype('float32')
 
# getting the values down to 0 and 1
train_images /= 255
test_images /= 255

第4步:一个基本的卷积神经网络

现在我们要创建一个基本的CNN,只有2个卷积层,有一个relu激活函数和64和32内核,内核大小为3,并将图像平铺为一维数组,卷积层直接连接到输出层。

对于编译,我们使用Adam优化器,对于损失,我们使用SparseCategoricalCrossentropy(),对于度量,我们使用准确性和去适应数据。

# A convolutional neural network
 
# Defining the model
model = keras.Sequential([
    keras.layers.Conv2D(64, 3, activation='relu',
                        input_shape=(300, 300, 1)),
    keras.layers.Conv2D(32, 3, activation='relu'),
    keras.layers.Flatten(),
    keras.layers.Dense(3, activation='softmax')
])
 
# Compiling the model
model.compile(optimizer='adam',
              loss=keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])
 
# Fitting the model with data
model.fit(train_images, train_labels, epochs=5,
          batch_size=32)

输出:

TensorFlow中的卷积神经网络(CNN)的训练

并对该模型进行评估

model.evaluate(test_images, test_labels)

TensorFlow中的卷积神经网络(CNN)的训练

正如你所看到的,在未见过的数据中,准确率非常低,这被称为模型过拟合,这意味着模型被训练数据过拟合,所以它不能处理未见过的数据,为了解决这个问题,我们可以稍微修改一下模型。

更好的卷积神经网络

我们可以通过增加以下内容来改进这个模型。

  • Dropout nodes
  • Pooling
  • 完全连接的密集层
# A better convolutional neural network
 
# Model defining
model = keras.Sequential([
    keras.layers.AveragePooling2D(6, 3,
                                  input_shape=(300, 300, 1)),
    keras.layers.Conv2D(64, 3, activation='relu'),
    keras.layers.Conv2D(32, 3, activation='relu'),
    keras.layers.MaxPool2D(2, 2),
    keras.layers.Dropout(0.5),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(3, activation='softmax')
])
 
# Compiling a model
model.compile(optimizer='adam',
              loss=keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])
 
# Fitting the model
model.fit(train_images, train_labels, epochs=5,
          batch_size=32)

TensorFlow中的卷积神经网络(CNN)的训练

现在,如果我们评估我们的模型,你可以看到模型已经改善了很多。

TensorFlow中的卷积神经网络(CNN)的训练

这些是训练卷积神经网络的步骤。

注意:你仍然可以对模型进行一些调整和转向,以提高准确性。IT是一个不断学习的过程。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Tensorflow 教程