Что не так с моей CNN?

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

batch_size = 1
epochs = 25
model = Sequential()
model.add(Conv1D(32, input_shape=(1040,1), kernel_size=100,padding='same',name='ConvLayer1', strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling1D(pool_size=70, strides=1, padding='same',name='PoolingLayer1'))
#model.add(Dropout(0.10))
model.add(Conv1D(64, kernel_size=70,padding='same',name='ConvLayer2',strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling1D(pool_size=40, strides=1, padding='same',name='PoolingLayer2'))
#model.add(Dropout(0.10))
model.add(Conv1D(128, kernel_size=40,padding='same',name='ConvLayer3',strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling1D(pool_size=10, strides=1, padding='same',name='PoolingLayer3'))
#model.add(Dropout(0.10))
model.add(Flatten())
model.add(Dense(1,name='output', activation='linear'))
w = model.get_weights()
model.compile(loss='mse', optimizer=keras.optimizers.Adam(lr=0.001),metrics=['mse'])

Получить такие результаты: скриншот результатов

Что происходит? А также, вы знаете, как я могу улучшить эту модель, чтобы получить лучшие результаты?

1 ответ

Решение

Уменьшить размеры ядра и пула

Просто взглянув на вашу архитектуру, я бы сказал, что стоит попробовать гораздо меньшие значения для фильтров пула и конв. Сеть должна будет найти шаблон, одновременно просматривая 100 значений. Чтобы поместить это в перспективу, когда сверточные сети используются в обработке изображений, они обнаружили, что размеры ядра 2-4 являются лучшими. Вы по-прежнему можете смотреть на множество точек данных одновременно на более глубоких уровнях, потому что, когда они объединяются, они смотрят на более глубокие комбинации точек данных.

Увеличить размер партии

Для сети очень трудно установить хороший градиент из одного примера. Вы должны использовать пакеты большего размера, я бы начал с 32 и перешел оттуда.

Начните с вышеуказанных изменений, а затем попробуйте...

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

Попробуйте что-то вроде этого, чтобы увидеть, улучшится ли это.

from keras import Sequential
from keras.layers import Conv1D, LeakyReLU, MaxPooling1D, Flatten, Dense
import keras

batch_size = 32
epochs = 25
model = Sequential()
model.add(Conv1D(32, input_shape=(1040, 1), kernel_size=2, padding='same', name='ConvLayer1', strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling1D(pool_size=2, strides=1, padding='same', name='PoolingLayer1'))
# model.add(Dropout(0.10))
model.add(Conv1D(64, kernel_size=3, padding='same', name='ConvLayer2', strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling1D(pool_size=3, strides=1, padding='same', name='PoolingLayer2'))
# model.add(Dropout(0.10))
model.add(Conv1D(128, kernel_size=3, padding='same', name='ConvLayer3', strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling1D(pool_size=3, strides=1, padding='same', name='PoolingLayer3'))
# model.add(Dropout(0.10))
model.add(Flatten())
model.add(Dense(1, name='output', activation='linear'))
model.compile(loss='mse', optimizer=keras.optimizers.Adam(lr=0.001), metrics=['mse'])
model.summary()

Пример BatchNormalization

from keras.layers import BatchNormalization

model.add(Conv1D(32, input_shape=(1040, 1), kernel_size=2, padding='same', name='ConvLayer1', strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())  # Try adding this after each activation function except the output layer
model.add(MaxPooling1D(pool_size=2, strides=1, padding='same', name='PoolingLayer1'))

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

Другие вопросы по тегам