Модель Tensorflow не улучшается - PullRequest
0 голосов
/ 18 июня 2020

Я только начинаю изучать ML / Tensorflow / et c, так что я довольно новичок и до сих пор не знаю, каков метод устранения неполадок. В настоящее время у меня проблема с моей моделью, поскольку она, кажется, никогда не улучшится. Например, вывод выглядит как

Epoch 1/10
4/4 [==============================] - 41s 10s/step - loss: 0.8833 - accuracy: 0.4300
Epoch 2/10
4/4 [==============================] - 12s 3s/step - loss: 0.8833 - accuracy: 0.4300
Epoch 3/10
4/4 [==============================] - 10s 3s/step - loss: 0.8833 - accuracy: 0.4300
Epoch 7/1000
4/4 [==============================] - 10s 3s/step - loss: 0.8833 - accuracy: 0.4300

. Главный аспект, который меня беспокоит, это то, что он вообще не меняется, что заставляет меня думать, что я делаю что-то совершенно неправильно. Чтобы дать больше контекста и кода, я пытаюсь провести классификацию временных рядов. По сути, вход - это нормализованный временной ряд песни, и net должен классифицировать, если это классическая музыка c (вывод 1 означает, что это так, вывод 0 означает, что это не так).

Это текущая модель, которую я пробую.

    model = keras.Sequential([
    keras.layers.Conv1D(filters=100, kernel_size=10000,  strides=5000, input_shape=(1323000, 1), activation='relu'),
    keras.layers.Conv1D(filters=100, kernel_size=10, strides=3, input_shape=(263, 100), activation='relu'),
    keras.layers.LSTM(1000),
    keras.layers.Dense(500, activation='relu'),
    keras.layers.Dense(250, activation='relu'),
    keras.layers.Dense(1, activation='softmax')
])
model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])

Вот как я получаю данные обучения (x и y - это словари с временными рядами из разных песен).

minute = 1323000
x_train = np.zeros((100, minute, 1))
y_train = np.zeros((100,))
for kk in range(0, 100):
    num = randint(0, 41)
    ts = x[num]
    start = randint(0, len(ts) - minute)
    x_train[kk, :] = np.array([ts[start:(start + minute)]]).T
    y_train[kk] = 1 - y[num]

, а затем обучение:

for kk in range(1, 1000):
    x_train, y_train = create_training_set(x, y)
    model.fit(x_train, y_train, epochs=1000)

Я посмотрел на несколько похожих вопросов, но я уже делал то, что было предложено, или совет был слишком конкретным c для спрашивающий. Я также пробовал несколько относительно разных моделей / активаторов, поэтому не думаю, что это связано с тем, что модель слишком сложна, а данные уже нормализованы, так что это не должно быть проблемой. Но, как я уже сказал, я все это знал и мог ошибаться.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Использование активации softmax на последнем уровне с одним узлом некорректно. Кроме того, аргумент from_logits=True в вашем определении потерь означает, что ожидается, что модель будет генерировать логиты, а не вероятности (которые обычно производятся softmax и sigmoid финальными активациями).

Итак, вы должен изменить ваш последний слой на

keras.layers.Dense(1) # linear activation by default

. В качестве альтернативы вы можете изменить как последний слой, так и функцию потерь соответственно на

keras.layers.Dense(1, activation='sigmoid')

loss=tf.keras.losses.BinaryCrossentropy(from_logits=False)

Согласно docs , использование from_logits=True может быть более стабильным в числовом отношении, и, вероятно, именно по этой причине его предпочитают в стандартных руководствах по классификации Tensorflow (см. здесь и здесь ).

1 голос
/ 18 июня 2020

Так что я не могу обещать, что это сработает, потому что я не знаю ваших данных, и это очень странная архитектура, но вот несколько вещей, которые кажутся неправильными:

  1. Последний плотный слой должен иметь sigmoid функцию активации
  2. from_logits должно быть False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...