使用迁移学习时模型无法学习

问题描述 投票:0回答:2

我是机器学习的初学者,我正在尝试开发一个可以从面部数据集预测年龄的模型。然而,我的模型没有学习,我正在努力找出原因。我正在导入 VGG16 架构,但它仍然无法学习。我已经搜索过论坛,甚至尝试仅在 2 个示例上训练模型,但它仍然无法过拟合。 在整个训练过程中,训练准确性几乎没有增加,验证准确性也没有增加。

path = "../input/agedetection/dataset/dataset"
files = os.listdir(path)
X = []
age_temp = []

for file in files:
    img = cv2.imread(path+'/'+file)
    img = cv2.resize(img, dsize = target_size)
    X.append(img)
    fields = file.split('_')
    age_temp.append(fields[0])

X = np.array(X).astype('float32')
X = X/255

#converting age into different brackets  - 0-20, 21-40, 41-60,61+
age = np.zeros(len(age_temp))

for i in range(len(age_temp)):
    curr_age = int(age_temp[i])
    if curr_age <= 20:
        val = 0
    elif curr_age <= 40:
        val = 1
    elif curr_age <= 60:
        val = 2
    else:
        val = 3
    age[i] = val

age = to_categorical(age, num_classes = 4)
age = age.astype('float32')

base_model_age = tf.keras.applications.VGG16(input_shape=input_shape,include_top=False,weights="imagenet")
for layer in base_model_age.layers[:-20]:
    layer.trainable=False
model_age = Sequential()
model_age.add(base_model_age)
model_age.add(Flatten())
model_age.add(Dense(1024, activation='relu'))
model_age.add(Dense(4, activation = 'relu'))

model_age.compile(optimizer=Adam(adam),
              loss='mse'
              ,metrics=['accuracy'])

hist_age = model_age.fit(X_train, age_train,
                         validation_data=(X_validation, age_validation),
                         epochs=10, steps_per_epoch=256, 
                         callbacks=[lrd, mcp])
tensorflow machine-learning deep-learning neural-network transfer-learning
2个回答
0
投票

您将问题设计为分类问题。然而,您的模型被构造为回归模型。如果您进行以下更改,您可能会得到更好的预测。

看起来

model_age.add(base_model_age)
应该是
model_age.add(base_model_age.output)

第二,改变

model_age.add(Dense(4, activation = 'relu'))

至:

model_age.add(Dense(4, activation = 'softmax'))

三、改变

model_age.compile(optimizer=Adam(adam),
              loss='mse',
              metrics=['accuracy'])

至:

model_age.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

最后,你似乎训练了最后 20 层。不过,您可能不需要训练这么多层,只需顶部密集层就足够了。


0
投票

并进行此更改:

layer.trainable = True

将其设置为 false 将不会训练参数,因此不会发生微调。

© www.soinside.com 2019 - 2024. All rights reserved.