Keras——不从预先训练模型的转移值学习的分类器

Keras——不从预先训练模型的转移值学习的分类器,keras,classification,conv-neural-network,pre-trained-model,Keras,Classification,Conv Neural Network,Pre Trained Model,我目前正在尝试使用一个预先培训过的网络,并在上进行测试。 最初,我使用VGG19,只是在最后对分类器进行了微调,以适应我的120个类。我让所有层次的人都可以通过更深入的训练来提高表现。问题是这个模型非常慢(即使我让它运行一个晚上,我只得到了几个时代,精度达到45%左右——我有一个GPU GTX 1070) 然后,我的想法是冻结这个模型中的所有层,因为我只有10公里的图像,只训练最后几个致密层,但它仍然不是很快 观看之后(大约2分钟30秒),我决定用InceptionResnetv2复制传输值的原

我目前正在尝试使用一个预先培训过的网络,并在上进行测试。 最初,我使用VGG19,只是在最后对分类器进行了微调,以适应我的120个类。我让所有层次的人都可以通过更深入的训练来提高表现。问题是这个模型非常慢(即使我让它运行一个晚上,我只得到了几个时代,精度达到45%左右——我有一个GPU GTX 1070)

然后,我的想法是冻结这个模型中的所有层,因为我只有10公里的图像,只训练最后几个致密层,但它仍然不是很快

观看之后(大约2分钟30秒),我决定用InceptionResnetv2复制传输值的原理

我处理了每一张图片,并用下面的代码将输出保存在numpy矩阵中

#加载预先训练的模型+冻结层
模型=applications.inception\u resnet\u v2.inception resnetv2(
include_top=False,
权重='imagenet',
pooling='avg')
对于model.layers中的图层:
layer.trainable=错误
#特征提取与保存
a=正确
对于glob.glob('train/resized/*.jpg')中的文件名:
name\u img=os.path.basename(文件名)[:-4]
类别=标签[标签[“id”]==名称[品种]。值[0]
input\u img=np.expand\u dims(np.array(Image.open(filename)),0)
pred=模型预测(输入值)
如果是:
X=np.数组(pred)
y=np.数组(类_ux)
a=错误
其他:
X=np.vstack((X,np.array(pred)))
y=np.vstack((y,类_uux))
np.savez_compressed('preprocessed.npz',X=X,y=y)
X是一个形状矩阵(102221536),y是(10222,1)

之后,我设计了我的分类器(几个拓扑),我不知道为什么它不能执行任何学习

#只需将一个热编码标签正确编码到(10222120)
label_binarizer=sklearn.preprocessing.LabelBinarizer()
y=标签二值化器。拟合变换(y)
模型=顺序()
添加(密集(512,输入尺寸=X.shape[1]))
#模型添加(密集(2048,activation=“relu”))
#模型。添加(辍学率(0.5))
#模型.添加(密度(256))
model.add(密集型(120,activation='softmax'))
model.compile(
loss=“分类的”,
optimizer=“Nadam”#我试过几个
指标=[“准确度”]
)
模型拟合(X,y,历元=100,批量大小=64,
回调=[early_stop],verbose=1,
洗牌=真,验证\u分割=0.10)
您可以在下面找到模型的输出:

对9199个样本进行训练,对1023个样本进行验证
纪元1/100
9199/9199[================================================2s 185us/步-损耗:15.9639-附件:0.0096-val_损耗:15.8975-val_附件:0.0137
纪元2/100
9199/9199[==========================================1s 100us/步-损耗:15.9639-附件:0.0096-val_损耗:15.8975-val_附件:0.0137
纪元3/100
9199/9199[==========================================1s 98us/步-损耗:15.9639-附件:0.0096-val_损耗:15.8975-val_附件:0.0137
纪元4/100
9199/9199[=============================================1s 96us/步-损耗:15.9639-附件:0.0096-val_损耗:15.8975-val_附件:0.0137
纪元5/100
9199/9199[==========================================1s 99us/步-损耗:15.9639-附件:0.0096-val_损耗:15.8975-val_附件:0.0137
纪元6/100
9199/9199[=============================================1s 96us/步-损耗:15.9639-附件:0.0096-val_损耗:15.8975-val_附件:0.0137
我试图改变拓扑结构、激活功能、添加辍学,但没有任何改进

我不知道我这样做有什么不对。X矩阵是否不正确?难道不允许只使用预先训练好的模型作为特征提取器,然后使用第二个模型进行分类吗

非常感谢您的反馈, 当做
Nicolas

在将图像数组馈送到模型之前,需要调用
预处理输入
。它将
input\u img
的值从[0255]标准化为[-1,1],这是
InceptionResNetV2
所需的输入范围

input\u img=np.expand\u dims(np.array(Image.open(filename)),0)
input\u img=applications.inception\u resnet\u v2.preprocess\u input(input\u img.astype('float32'))
pred=模型预测(输入值)

非常感谢您!你为我节省了很多训练时间。