2

我的目标是将顶层附加到 VGG19 等预训练模型,并使用合并模型进行一些预测。合并后的模型精度为 0。需要一点帮助。

我自己的顶层

from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.models import Sequential

vgg19top_model = Sequential()
vgg19top_model.add(GlobalAveragePooling2D(input_shape=train_vgg19.shape[1:]))  # shape=(7, 7, 512)
vgg19top_model.add(Dense(255, activation='relu'))
vgg19top_model.add(Dropout(0.35))
vgg19top_model.add(Dense(133, activation='softmax'))
vgg19top_model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
global_average_pooling2d_1 ( (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 255)               130815    
_________________________________________________________________
dropout_1 (Dropout)          (None, 255)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 133)               34048     
=================================================================
Total params: 164,863
Trainable params: 164,863
Non-trainable params: 0

在瓶颈特征上训练我的顶级模型并获得 72% 的准确率

在此处重新加载这些权重
代码未显示

加载 VGG19 底层以与我的顶层合并

from keras import applications
vgg19=applications.vgg19.VGG19(include_top=False, weights='imagenet',input_shape=(224, 224, 3))
vgg19.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
...
...
_________________________________________________________________
block5_conv4 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
=================================================================
Total params: 20,024,384
Trainable params: 20,024,384
Non-trainable params: 0

合并 2 个模型

from keras.layers import Input, Dense
from keras.models import Model

global_average_pooling2d_7 = vgg19.get_layer('block5_pool')  # shape=(?, 7, 7, 512)
bn_conv1_model = Model(inputs=vgg19.input, outputs=global_average_pooling2d_7.output)

new_model = Sequential()
new_model.add(bn_conv1_model)
new_model.add(vgg19top_model)
new_model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
model_12 (Model) <-VGG19     (None, 7, 7, 512)         20024384  
_________________________________________________________________
sequential_6 (Sequential)    (None, 133)               164863    
=================================================================
Total params: 20,189,247
Trainable params: 164,863
Non-trainable params: 20,024,384

现在让我们在一些预测上端到端地测试合并模型

它完全失败,准确率为 0%

我怎样才能端到端地测试这个新模型——或者更确切地说,为什么它的预测如此糟糕?

4

1 回答 1

1

我认为,从你的做法来看,你是在堆叠两个 VGG19 模型,但第一个只是 VGG19 的一些层。

这不是提高准确性的最佳方法。首先,它只会增加网络的参数,因为你按顺序组合模型,计算量会很大。其次,它不会提高准确性,因为第一个模型会同时获取低层和高层的特征,但是下一个 CNN 层会从第二个模型中提取更多不必要的复杂特征。

您可能想尝试另一种方法,例如 Siamese CNN 或双向 CNN (BCNN)。这个想法是我们将训练集提供给两个 CNN 模型,然后我们合并这两个 CNN 的输出。证明该方法可以提取输入图像的各种特征。

您可以访问此网站了解有关 BCNN 的更多信息 http://vis-www.cs.umass.edu/bcnn/

于 2020-12-19T04:29:54.160 回答