Deep learning: CNN для решения обратной задачи светорассеяния

Я только начала использовать tensorflow. Передо мной стоит задача с помощью сверточной сети определить по индикатрисе светорассеяния два параметра - m,x (размер и показатель преломления). Я создала базу, пользуясь библиотекой PyMieScatt и пытаюсь в данный момент переобучить сеть на этой базе данных. У меня возникли следующие проблемы:

  • Loss функция сильно флуктуирует от эпохи к эпохе, хотя размер базы данных 10 000 векторов;
  • Loss функция не уменьшается после определенной эпохи и продолжает флуктуировать.

Как итог: сеть не переобучается и не может точно предсказать даже тестовые данные.

Я пробую уменьшать learning rate в 10 раз (изначально значение по умолчанию для Adam optimizer), когда loss выходит на плато. Так же пробовала менять batch size от 1 до 1000 и 10000. Пробовала менять плотность расположения точек друг относительно друга, длину векторов (было 128, сейчас 256).

train_vectors, train_labels= np.zeros((10000, 256)), np.zeros((10000, 2))
    for i in range(0,10000):
      train_vectors[i][:] = nodes[i][2:258]
      train_labels[i][0] = nodes[i][0] #refr_ind
      train_labels[i][1] = nodes[i][1] #size
    #create a model
    inputs = tf.keras.Input(shape=(256,1))
    conv1 = tf.keras.layers.Conv1D(filters=1, kernel_size=2, strides =1,  activation='relu')(inputs) 
    conv2 = tf.keras.layers.Conv1D(filters=1, kernel_size=4, strides =2,  activation='relu')(inputs) 
    conv3 = tf.keras.layers.Conv1D(filters=1, kernel_size=8, strides =4,  activation='relu')(inputs) 
    conv4 = tf.keras.layers.Conv1D(filters=1, kernel_size=16, strides =8,  activation='relu')(inputs) 
    conv5 = tf.keras.layers.Conv1D(filters=1, kernel_size=32, strides =16,  activation='relu')(inputs) 
    conv6 = tf.keras.layers.Conv1D(filters=1, kernel_size=64, strides =32,  activation='relu')(inputs) 
    flt1 = tf.keras.layers.Flatten()(conv1)
    flt2 = tf.keras.layers.Flatten()(conv2)
    flt3 = tf.keras.layers.Flatten()(conv3)
    flt4 = tf.keras.layers.Flatten()(conv4)
    flt5 = tf.keras.layers.Flatten()(conv5)
    flt6 = tf.keras.layers.Flatten()(conv6)
    mrg = tf.keras.layers.concatenate([flt1,flt2,flt3,flt4,flt5,flt6])
    fc = tf.keras.layers.Dense(501, activation='relu')(mrg) #501 is a len of a mrg
    outputs = tf.keras.layers.Dense(2)(fc) 
        model = tf.keras.Model(inputs=inputs, outputs=outputs)
        model.compile(optimizer=tf.keras.optimizers.Adam(), loss = ['mean_absolute_percentage_error'],  metrics= ['mean_absolute_percentage_error'])
    history = model.fit(x = train_vectors, y = train_labels, epochs=10000, batch_size = 1000, validation_data = (train_vectors,train_labels))

На левой картинке момент обучения не с самого начала, на правой - реальная и предсказанная база данных (10k точек, по осям m и x)

Есть ли какие то замечания или проблемы в моем коде? Идеи как его улучшить и решить проблему? Заранее спасибо!


Ответы (0 шт):