首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras -分类器不从预训练模型的转移值中学习

Keras -分类器不从预训练模型的转移值中学习
EN

Stack Overflow用户
提问于 2017-12-14 02:20:42
回答 0查看 217关注 0票数 3

我目前正在尝试使用一个预先训练好的网络,并在this dataset上进行测试。最初,我使用的是VGG19,最后只对分类器进行了微调,以适应我的120个类。我让所有的层都可以训练,也许可以通过更深入的训练来提高性能。问题是这个模型非常慢(即使我让它运行一晚,我也只得到了几个时期,并且达到了45%左右的准确率-我有一台GPU GTX 1070)。

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

在看了this video (大约2分30秒)后,我决定用InceptionResnetv2复制传递值的原理。

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

代码语言:javascript
复制
# Loading pre-trained Model + freeze layers
model = applications.inception_resnet_v2.InceptionResNetV2(
        include_top=False, 
        weights='imagenet', 
        pooling='avg')

for layer in model.layers:
    layer.trainable = False

# Extraction of features and saving
a = True
for filename in glob.glob('train/resized/*.jpg'):
    name_img = os.path.basename(filename)[:-4]
    class_ = label[label["id"] == name_img]["breed"].values[0]
    input_img = np.expand_dims(np.array(Image.open(filename)), 0)
    pred = model.predict(input_img)
    if a:
        X = np.array(pred)
        y = np.array(class_)
        a = False
    else:
        X = np.vstack((X, np.array(pred)))
        y = np.vstack((y, class_))

np.savez_compressed('preprocessed.npz', X=X, y=y)

X是形状为(10222,1536)的矩阵,y是(10222,1)。

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

代码语言:javascript
复制
# Just to One-Hot-Encode labels properly to (10222, 120)
label_binarizer = sklearn.preprocessing.LabelBinarizer()
y = label_binarizer.fit_transform(y)

model = Sequential()
model.add(Dense(512, input_dim=X.shape[1]))
# model.add(Dense(2048, activation="relu"))
# model.add(Dropout(0.5))
# model.add(Dense(256))
model.add(Dense(120, activation='softmax'))

model.compile(
    loss = "categorical_crossentropy", 
    optimizer = "Nadam", # I tried several ones
    metrics=["accuracy"]
)

model.fit(X, y, epochs=100, batch_size=64, 
          callbacks=[early_stop], verbose=1, 
          shuffle=True, validation_split=0.10)

您可以在下面找到模型的输出:

代码语言:javascript
复制
Train on 9199 samples, validate on 1023 samples
Epoch 1/100
9199/9199 [==============================] - 2s 185us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137
Epoch 2/100
9199/9199 [==============================] - 1s 100us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137
Epoch 3/100
9199/9199 [==============================] - 1s 98us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137
Epoch 4/100
9199/9199 [==============================] - 1s 96us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137
Epoch 5/100
9199/9199 [==============================] - 1s 99us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137
Epoch 6/100
9199/9199 [==============================] - 1s 96us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137

我试着改变拓扑结构,激活函数,添加dropouts,但没有任何东西能带来任何改进。

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

非常感谢你的反馈,向你致敬,尼古拉斯

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47799758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档