回答可能为时已晚,但迟到总比没有好。
样本太少或太多取决于您的数据集。通常,当您的数据量有限和/或希望在提取样本的大部分特征以获得更高准确性的同时避免过度拟合时,建议使用预训练模型。
如果您使用 Keras,请尝试使用 VGG16:
conv_net = VGG16(weights="imagenet",
include_top=False,
input_shape=(150, 150, 3)) # Change the shape accordingly
它为您提供了这样的层堆栈:
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 150, 150, 3) 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 150, 150, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (None, 150, 150, 64) 36928
_________________________________________________________________
block1_pool (MaxPooling2D) (None, 75, 75, 64) 0
_________________________________________________________________
block2_conv1 (Conv2D) (None, 75, 75, 128) 73856
_________________________________________________________________
block2_conv2 (Conv2D) (None, 75, 75, 128) 147584
_________________________________________________________________
block2_pool (MaxPooling2D) (None, 37, 37, 128) 0
_________________________________________________________________
block3_conv1 (Conv2D) (None, 37, 37, 256) 295168
_________________________________________________________________
block3_conv2 (Conv2D) (None, 37, 37, 256) 590080
_________________________________________________________________
block3_conv3 (Conv2D) (None, 37, 37, 256) 590080
_________________________________________________________________
block3_pool (MaxPooling2D) (None, 18, 18, 256) 0
_________________________________________________________________
block4_conv1 (Conv2D) (None, 18, 18, 512) 1180160
_________________________________________________________________
block4_conv2 (Conv2D) (None, 18, 18, 512) 2359808
_________________________________________________________________
block4_conv3 (Conv2D) (None, 18, 18, 512) 2359808
_________________________________________________________________
block4_pool (MaxPooling2D) (None, 9, 9, 512) 0
_________________________________________________________________
block5_conv1 (Conv2D) (None, 9, 9, 512) 2359808
_________________________________________________________________
block5_conv2 (Conv2D) (None, 9, 9, 512) 2359808
_________________________________________________________________
block5_conv3 (Conv2D) (None, 9, 9, 512) 2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (None, 4, 4, 512) 0
=================================================================
Total params: 14,714,688
Trainable params: 14,714,688
Non-trainable params: 0
要使用此模型,您有两种选择,一种是仅使用此模型提取特征并将其保存在磁盘上,然后在下一步创建密集连接层并将上一步的输出提供给模型。这种方法比我要解释的下一个方法快得多,但唯一的缺点是你不能使用数据增强。这是使用conv_net 的predict 方法提取特征的方法:
features_batch = conv_base.predict(inputs_batch)
# Save the features in a tensor and feed them to the Dense Layer after all has been extracted
第二种选择是将密集连接模型附加到 VGG 模型的顶部,冻结conv_net 层并将数据正常输入网络,这样您就可以使用数据增强,但只有在您有权访问时才使用它到强大的 GPU 或云。下面是如何在 VGG 之上冻结和连接 Dense 层的代码:
#codes adopted from "Deep Learning with Python" book
from keras import models
from keras import layers
conv_base.trainable = False
model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
您甚至可以通过解冻conv_net 的一层来微调模型以适应您的数据。以下是如何冻结除一层以外的所有层:
conv_base.trainable = True
set_trainable = False
for layer in conv_base.layers:
if layer.name == 'block5_conv1':
set_trainable = True
if set_trainable:
layer.trainable = True
else:
layer.trainable = False
# your model like before
希望它可以帮助您入门。