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 сетевой подход? Любые полезные чтения / советы?
Заранее спасибо!