Модель структурированных данных Tensorflow.predict () возвращает неверные вероятности - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь следовать учебнику Tensorflow (я новичок) для моделей структурированных данных с некоторыми изменениями на этом пути.

Моя цель - создать модель длякоторый я предоставляю данные (в формате csv), которые выглядят примерно так (пример имеет только 2 функции, но я хочу расширить их после того, как я это выясню):

power_0,power_1,result
0.2,0.3,draw
0.8,0.1,win
0.3,0.1,draw
0.7,0.2,win
0.0,0.4,lose

Я создал модель, используя следующуюкод:

def get_labels(df, label, mapping):
    raw_y_true = df.pop(label)
    y_true = np.zeros((len(raw_y_true)))
    for i, raw_label in enumerate(raw_y_true):
        y_true[i] = mapping[raw_label]
    return y_true


tf.compat.v1.enable_eager_execution()

mapping_to_numbers = {'win': 0, 'draw': 1, 'lose': 2}

data_frame = pd.read_csv('data.csv')
data_frame.head()

train, test = train_test_split(data_frame, test_size=0.2)
train, val = train_test_split(train, test_size=0.2)

train_labels = np.array(get_labels(train, label='result', mapping=mapping_to_numbers))
val_labels = np.array(get_labels(val, label='result', mapping=mapping_to_numbers))
test_labels = np.array(get_labels(test, label='result', mapping=mapping_to_numbers))

train_features = np.array(train)
val_features = np.array(val)
test_features = np.array(test)

model = tf.keras.Sequential([
    tf.keras.layers.Dense(128, activation='relu', input_shape=(train_features.shape[-1],)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Dense(3, activation='sigmoid'),
])

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy'],
    run_eagerly=True)

epochs = 10
batch_size = 100
history = model.fit(
    train_features,
    train_labels,
    epochs=epochs,
    validation_data=(val_features, val_labels))

input_data_frame = pd.read_csv('input.csv')
input_data_frame.head()

input_data = np.array(input_data_frame)

print(model.predict(input_data))

input.csv выглядит следующим образом:

power_0,power_1
0.8,0.1
0.7,0.2

И фактический результат:

[[0.00604381 0.00242573 0.00440606]
 [0.01321151 0.00634229 0.01041476]]

Я ожидал получить вероятность для каждоголейбл («победа», «ничья» и «проигрыш»), может кто-нибудь помочь мне с этим?

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 04 октября 2019

Используйте активацию softmax в этой строке tf.keras.layers.Dense(3, activation='sigmoid').

1 голос
/ 09 октября 2019

Это хорошо работает для меня с вашим примером:

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(train_features.shape[-1],)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(16, activation='relu'),
    tf.keras.layers.Dense(3, activation='softmax'),
])

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy'],
    run_eagerly=True)

Использование Сглаживание Слой

0 голосов
/ 11 октября 2019

Поскольку это проблема мультиклассовой классификации, пожалуйста, используйте категорический_кросцентропий вместо двоичный_кросентропий для функции потерь n, также используйте softmax вместоиз сигмоид как функция активации .

Кроме того, вы должны увеличить эпох для улучшения конвергенции.

0 голосов
/ 07 октября 2019

Я должен написать свои предложения здесь, потому что я пока не могу комментировать. @zihaozhihao правильно, вы должны использовать softmax вместо сигмоида, потому что вы не работаете с двоичной проблемой. Другая проблема может быть вашей функцией потерь:

model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'],
run_eagerly=True)

Попробуйте использовать loss='categorical_crossentropy',, потому что вы работаете с многослойной классификацией. Вы можете прочитать больше о многослойной классификации здесь и здесь .

Что касается вашего вопроса о пригодности. Вы получаете достоверность каждого класса для ваших двух тестовых входов. Например: win draw loss [[0.00604381 0.00242573 0.00440606] [0.01321151 0.00634229 0.01041476]] Проблема в том, что вы используете функцию потерь и функцию активации, которая приводит к странным значениям вероятности. Возможно, вы захотите проверить этот пост здесь для получения дополнительной информации.

Надеюсь, что это немного поможет и не стесняйтесь спрашивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...