Нейронная сеть, которая возвращает несколько классификаций в одном выходе - Tensorflow - PullRequest
1 голос
/ 23 января 2020

Tensorflow 2.0.0

python 3.7.6

Я пытаюсь решить проблему с указанным числом вводит он возвращает несколько классификаций в одном выводе. Например, учитывая вход [1, 0, 3000, 200, 250, ... 0, 1], он может вернуть вывод, который будет выглядеть следующим образом [0, 1, 0, 1, 1, 1, ... 0, 0]. Существует около 319 возможных меток, и может быть от 1 до 7 из них активными на одном выходе, как указано выше. Кроме того, я также хочу знать количество, чтобы вывод мог выглядеть как [1, 0, 2, 0, 3, 1, 2, 0, ..., 1].

После некоторого чтения я придумал следующую модель

...

# This is how i'm normalizing the inputs
train_input = np.array(tf.keras.utils.normalize(input, axis = 1, order = 2).tolist())
test_input = np.array(tf.keras.utils.normalize(test_input, axis = 1, order = 2).tolist())

model = keras.Sequential([
    keras.layers.Dense(230, input_shape=(26,)),
    keras.layers.Dense(319, activation='relu'),
    keras.layers.Dense(319, activation='linear'),
])

model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])
model.fit(train_input, train_output, validation_data=(test_input, test_output), epochs = 50)

...

Я прочитал это, так как Я хочу, чтобы в одном выводе было несколько меток, функция активации для выходного слоя должна быть «линейной». Кроме того, поскольку я хочу, чтобы в качестве выходных данных были величины, функция потерь должна быть «среднеквадратичной ошибкой». Мой набор данных о 16k.

Эта сеть не работает хорошо. Высочайшая точность, которую он мог достичь. после некоторых твиков это около 15%. Я подумал, что слишком амбициозен, пытаясь получить количественные показатели и классификации на одном и том же выходе. Я решил создать 7 разных аналогичных сетей и сделать вывод более похожим на традиционную классификацию (только одна активная метка на выход [0, 0, 1, 0, 0]). Эта модель выглядит следующим образом:


...

train_input = np.array(tf.keras.utils.normalize(input, axis = 0, order = 2).tolist())
test_input = np.array(tf.keras.utils.normalize(test_input, axis = 0, order = 2).tolist())

model = keras.Sequential([
    keras.layers.Dense(230, input_shape=(26,)),
    keras.layers.Dense(319, activation='relu'),
    keras.layers.Dense(319, activation='softmax'),
])

model.compile(optimizer=keras.optimizers.Adam(), loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(train_input, train_output, validation_data=(test_input, test_output), epochs = 20)

Эта сеть, с небольшой оптимизацией, может достичь около 60% (это не так уж и здорово, но начало гораздо лучше). Тем не менее, это не идеально, так как это не показало бы мне количество, и, поскольку 7 выходов связаны, кажется, что лучше иметь их в одной сети. улучшить мою оригинальную сеть. Какая архитектура будет работать лучше? Это слишком много, чтобы заставить сеть классифицировать по количеству? Должен ли я продолжать 7 сетевой подход? Любые полезные чтения / советы?

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

...