Tensorflow-多标签分类损失减少缓慢/完全没有变化

时间:2019-09-11 20:18:27

标签: python tensorflow machine-learning keras multilabel-classification

我正在Tensorflow中的神经网络上工作。我的网络执行多标签分类,以预测哪些用户对哪些汽车出价。我有一个包含三列的CSV;用户ID,最高出价和品牌名称(汽车型号),但是我仅使用用户ID和品牌名称。用户ID是输入,品牌名称是标签,其中存在86个唯一的品牌名称。我的问题是,当我使用数据集训练模型时,损失正在非常缓慢地下降,准确性几乎根本没有改变。

我尝试更改正在使用的层数,并尝试在每个隐藏层中尝试不同数量的神经元,但是我对此没有任何运气。

from __future__ import absolute_import, division, print_function, unicode_literals

import os
import matplotlib.pyplot as plt
import tensorflow as tf
import pandas as pd
import numpy as np

#
# READ FILE AND SET FEATURE & LABEL
#
raw_train_data = pd.read_csv("data2016NEW.csv", usecols=["USERID"])
#raw_test_data = pd.read_csv("data2017.csv", usecols=["USERID"])

train_target = pd.read_csv("data2016NEW.csv", usecols=["MAKENAME"])
#test_target = pd.read_csv("data2017.csv", usecols=["MAKENAME"])

train_dataset = tf.data.Dataset.from_tensor_slices((raw_train_data.values, train_target.values))
#test_dataset = tf.data.Dataset.from_tensor_slices((raw_test_data.values, test_target.values))


train_dataset_shuffled_batched = train_dataset.shuffle(len(raw_train_data)).batch(512)
#test_dataset_shuffled_batched = test_dataset.shuffle(len(raw_test_data)).batch(512)

def get_compiled_model():
    model = tf.keras.Sequential([
        #input layer
        tf.keras.layers.Dropout(0.2, input_shape=raw_train_data.shape[1:]),
        #hidden layers
        tf.keras.layers.Dense(360, activation='relu'),
        tf.keras.layers.Dense(360, activation='relu'),
        tf.keras.layers.Dense(360, activation='relu'),
        tf.keras.layers.Dense(360, activation='relu'),
        tf.keras.layers.Dense(360, activation='relu'),
        tf.keras.layers.Dense(360, activation='relu'),
        #output layer
        tf.keras.layers.Dense(90, activation='softmax')
    ])

    model.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),
        loss=tf.keras.losses.sparse_categorical_crossentropy,
        metrics=['accuracy']
    )

    return model

model = get_compiled_model()
model.summary()

history = model.fit(train_dataset_shuffled_batched, epochs=1000, verbose=2)

这是一张显示我的数据的小样本的图像(我的数据集大约有160000行): Dataset example

如您所见,用户ID规范化为0到1,而标签Make name是整数。

感谢所有帮助,欢呼!

1 个答案:

答案 0 :(得分:0)

在训练之前,您应该查看是否可以看到功能之间的相关性。

例如:您能否根据您的生日来预测是否要购买哪种汽车?这些唯一的信息够吗?

学习率变化缓慢的事实可能与 x和y之间没有相关性

有关

要查看是否是这种情况,只需将您的值替换为随机值,然后替换为具有清晰模式的值,例如(ID <0.5 => target> 20)。如果您的准确性随模式而提高,但随机值却没有提高,则表明您需要更多功能。

如果您确定相关性,是否尝试过更改学习率?在定义明确的任务上获得很高的学习率会创建一种“振动”模式,其中学习率会上升和下降。这可能意味着您需要对其进行微调。

希望这会有所帮助。