计算机视觉CV-4

Custom Convnets

我们了解了卷积网络如何通过三个操作来执行特征提取:过滤、检测和压缩。单轮特征提取只能从图像中提取相对简单的特征,例如简单的线条或对比度。这些对于解决大多数分类问题来说太简单了。相反,卷积网络将一遍又一遍地重复这种提取,以便特征随着它们深入网络而变得更加复杂和精致。

Convolutional Blocks

Extraction as a sequence of blocks.

这些卷积块是 Conv2D 和 MaxPool2D 层的堆栈。

A kind of extraction block: convolution, ReLU, pooling.

每个块代表一轮提取,通过组合这些块,卷积网络可以组合和重新组合生成的特征,对它们进行增长和整形,以更好地适应当前的问题。现代卷积网络的深层结构使得这种复杂的特征工程成为可能,并在很大程度上保证了它们的卓越性能。

经典代码

Step 1 - Load Data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Load training and validation sets
ds_train_ = image_dataset_from_directory(
'../input/car-or-truck/train',
labels='inferred',
label_mode='binary',
image_size=[128, 128],
interpolation='nearest',
batch_size=64,
shuffle=True,
)
ds_valid_ = image_dataset_from_directory(
'../input/car-or-truck/valid',
labels='inferred',
label_mode='binary',
image_size=[128, 128],
interpolation='nearest',
batch_size=64,
shuffle=False,
)

# Data Pipeline
def convert_to_float(image, label):
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
return image, label

AUTOTUNE = tf.data.experimental.AUTOTUNE
ds_train = (
ds_train_
.map(convert_to_float)
.cache()
.prefetch(buffer_size=AUTOTUNE)
)
ds_valid = (
ds_valid_
.map(convert_to_float)
.cache()
.prefetch(buffer_size=AUTOTUNE)
)

Step 2 - Define Model

将使用的模型的图示:

Diagram of a convolutional model.

现在我们将定义模型。了解我们的模型如何由三个 Conv2D 和 MaxPool2D 层块(基础层)和后面的 Dense 层头组成。只需填写适当的参数,我们就可以或多或少地将该图直接转换为 Keras 序列模型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([

# First Convolutional Block
layers.Conv2D(filters=32, kernel_size=5, activation="relu", padding='same',
# give the input dimensions in the first layer
# [height, width, color channels(RGB)]
input_shape=[128, 128, 3]),
layers.MaxPool2D(),

# Second Convolutional Block
layers.Conv2D(filters=64, kernel_size=3, activation="relu", padding='same'),
layers.MaxPool2D(),

# Third Convolutional Block
layers.Conv2D(filters=128, kernel_size=3, activation="relu", padding='same'),
layers.MaxPool2D(),

# Classifier Head
layers.Flatten(),
layers.Dense(units=6, activation="relu"),
# layers.Dropout(0.2),
layers.Dense(units=1, activation="sigmoid"),
])
model.summary()

Dropout层,用于防止过拟合。Dropout是一种正则化技术,它在训练过程中以指定的概率(这里是0.2)随机将部分神经元的输出置为零,从而减少神经网络对特定神经元的依赖性。这有助于提高模型的泛化能力。

模型很容易过度拟合并且需要一些正则化。我们如果在模型中添加更多大的附加层将使其更容易过度拟合。然而,通过 Dropout 层添加一些正则化有助于防止这种情况发生。

Step 3 - Train

使用优化器以及适合二元分类的损失和指标对其进行编译

1
2
3
4
5
6
7
8
9
10
11
12
model.compile(
optimizer=tf.keras.optimizers.Adam(epsilon=0.01),
loss='binary_crossentropy',
metrics=['binary_accuracy']
)

history = model.fit(
ds_train,
validation_data=ds_valid,
epochs=40,
verbose=0,
)

绘制图标:

1
2
3
4
5
import pandas as pd

history_frame = pd.DataFrame(history.history)
history_frame.loc[:, ['loss', 'val_loss']].plot()
history_frame.loc[:, ['binary_accuracy', 'val_binary_accuracy']].plot();
损失函数 准确率
img img

我们仍然可以通过添加更多的卷积层来改进这个简单的模型,希望创建更好地适应数据集的特征。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2024 Guijie Wang
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信