我是机器学习的初学者,我正在尝试开发一个可以从面部数据集预测年龄的模型。然而,我的模型没有学习,我正在努力找出原因。我正在导入 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])
您将问题设计为分类问题。然而,您的模型被构造为回归模型。如果您进行以下更改,您可能会得到更好的预测。
看起来
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 层。不过,您可能不需要训练这么多层,只需顶部密集层就足够了。
并进行此更改:
layer.trainable = True
将其设置为 false 将不会训练参数,因此不会发生微调。