Как можно создать многоклассовый классификатор для структурированных данных с использованием Tensorflow?

#python #tensorflow #machine-learning

#python #tensorflow #машинное обучение

Вопрос:

Я прочитал учебник Tensorflow (https://www.tensorflow.org/tutorials/structured_data/preprocessing_layers ) для двоичной классификации структурированных данных, но я не могу изменить ее, чтобы создать модель, которая сможет выполнять многоклассовую классификацию.

Ответ №1:

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

Комментарии:

1. случайно, у вас есть пример проекта, в котором вы это реализовали?

Ответ №2:

это простой проект для набора данных Reuters с 46 номерами классов и 10000 входными данными объектов. Я использовал Keras, но TensorFlow тот же.

 from keras.datasets import reuters
from keras import models
from keras import layers
import numpy as np
import matplotlib.pyplot as plt



def binery_vectorize(sequences, dimension):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.
    return results

(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)

word_index = reuters.get_word_index()
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
decoded_newswire = ' '.join([reverse_word_index.get(i - 3, '(?)') for i in train_data[0]])

x_train = binery_vectorize(train_data,10000)
x_test = binery_vectorize(test_data,10000)
y_train = binery_vectorize(train_labels,46)
y_test = binery_vectorize(test_labels,46)
 

если входные данные могут быть только в одном классе, модель будет выглядеть следующим образом

 model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
 

если входные данные могут быть более чем в одном классе, модель будет выглядеть следующим образом

 model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])
 

В конечном итоге подходящая модель

  x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = y_train[:1000]
partial_y_train = y_train[1000:]

history = model.fit(partial_x_train,partial_y_train,epochs=20,batch_size=512,validation_data=(x_val, y_val))