我正在尝试训练一个图像分类模型,以从图像中定义一个数字特征。我确信SparseCategoricalCrossentropy损失函数对我不起作用,因为在训练过程中,我需要对较大的差异进行更严重的惩罚,而对较小的差异则惩罚较轻。理想情况下,我希望使用均方误差损失函数。
我使用TensorFlow教程来准备模型 – https://www.tensorflow.org/tutorials/images/classification。
对我来说,类名是数字,我尝试了以下选项:
- [’00’, ’01’, ’02’, ’03’, ’04’, ’05’, ’06’, ’07’, ’08’, ’09’, ’10’, ’11’, ’12’]
- [‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ’10’, ’11’, ’12’]
除了数据集之外,我对教程的唯一更改是将SparseCategoricalCrossentropy损失函数替换为’mean_squared_error’。
但很明显,损失函数对我不起作用。它返回的值随着训练而减小,但准确率从不超过5%,甚至随着损失值的减小而下降。结果也不合理。数据是好的,我可以轻松地使用SparseCategoricalCrossentropy损失函数达到95%的准确率。我错过了什么?
更新:我想我真正需要的是一种在TensorFlow中使用带有数字标签的图像定义回归问题的办法。
回答:
事实证明,将图像分类问题转变为回归问题相当容易。与问题中引用的教程相比,我必须进行以下更改:
-
使用数字作为’类’(文件夹名称)的不同数据集。
-
将损失函数更改为均方误差或其他适合回归的损失函数。
-
将模型的最后一层改为只有1个神经元,而不是类别的数量(并且不使用softmax):
...layers.Dense(128, activation='relu'),layers.Dense(1) # 从num_classes改为1
-
更改预测结果的解释方式:
... predictions = model.predict(img_array) # score = tf.nn.softmax(predictions[0]) # 适合分类,但不适合回归 score = predictions.flatten()[0] # 适合回归的正确结果 ...