首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于迁移学习预训练模型的新数据集的训练

关于迁移学习预训练模型的新数据集的训练
EN

Stack Overflow用户
提问于 2020-02-05 10:35:56
回答 1查看 992关注 0票数 1

代码:

代码语言:javascript
运行
复制
from keras.preprocessing import image as image_util 
from keras.applications.imagenet_utils import preprocess_input
from keras.applications.imagenet_utils import decode_predictions
from keras.applications import ResNet50
import numpy as np 
import argparse
import cv2
import time 

ap = argparse.ArgumentParser()
ap.add_argument("-i","--image",required= True,help ="path of the image")
args = vars(ap.parse_args())

# orig = cv2.imread(args["image"]) #Opencv function to load a image
start_time = time.time()
image = image_util.load_img(args["image"],target_size=(224,224))
image = image_util.img_to_array(image)

#print("!!!!!.....!!!!")
print(image.shape)


image = np.expand_dims(image,axis=0) #(224,224,3) --> (1,224,224,3)
#print("!!!!!.....!!!!")
print(image.shape)
image = preprocess_input(image)

#Loading the model 
model = ResNet50(weights="imagenet")
pred = model.predict(image)
#print("111!!!!!.....!!!!")
#print(pred)
p = decode_predictions(pred)
#print("222!!!!!.....!!!!")
#print(p)

for (i,(imagenetID,label,prob)) in enumerate(p[0]):
    print("{}. {}: {:.2f}%".format(i+1, label, prob*100))

ans = p[0][0]
ans = ans[1]
print("THE PREDICTED IMAGE IS: "+ans)

orig = cv2.imread(args["image"]) #Opencv function to load a image
(imagenetID,label,prob) = p[0][0]
cv2.putText(orig, "{},{:.2f}%".format(label,prob*100),(10,30),cv2.FONT_HERSHEY_COMPLEX,0.5,(0,0,0),1)
cv2.imshow("classification",orig)
cv2.waitKey(0)
print("--- %s seconds ---" % (time.time() - start_time))  

此代码工作在imagenet权重上,并有一个经过预先训练的模型,可以对各种图像进行分类。我需要训练一个新的对象,即我自己的数据集。(表示支持)(苹果)。我应该做些什么来更新添加新数据集的权重?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-05 11:00:10

一般的方法是只接受较低层次的预先训练的CNN (如ResNet),并在现有CNN的基础上添加新的层。

一旦你有了你的模型,你可能应该在训练开始时锁定预先训练过的层,这样你就不会破坏那些已经训练过的重量,然后当梯度稳定几次之后,你可以解锁这些层并继续训练。

删除预培训网络顶层最简单的方法是将include_top参数设置为False

代码语言:javascript
运行
复制
base_model = ResNet50(include_top=False, weights="imagenet") 

然后您可以像往常一样开始添加您的层,即(n_classes是指您想要分类的类的数量)

代码语言:javascript
运行
复制
my_hidden1 = keras.layers.Dense(128, activation="relu")(base_model)
# rest of the custom layers
...
output = keras.layers.Dense(n_classes, activation="softmax")(previous_layer)
model = keras.Model(inputs=base_model.input, outputs=output)

在开始时锁定预先训练过的层

代码语言:javascript
运行
复制
for layer in base_model.layers:
    layer.trainable = False

然后,您可以compilefit您的新模型在几个时代(即使是更高的学习率),即

代码语言:javascript
运行
复制
optimizer = keras.optimizers.SGD(lr=0.2, momentum=0.9, decay=0.01)
model.compile(optimizer=optimizer, ...)
model.fit(...)

在完成初始培训之后,您可以解锁基本层并继续进行培训(通常,您希望在此阶段降低学习速度)。

代码语言:javascript
运行
复制
for layer in base_model.layers:
    layer.trainable = True

optimizer = keras.optimizers.SGD(lr=0.01, momentum=0.9, decay=0.001)
model.compile(...)
model.fit(...)

请注意,每次锁定或解锁这些层时,都必须运行compile

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

https://stackoverflow.com/questions/60073882

复制
相关文章

相似问题

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