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))
Есть ли какие то замечания или проблемы в моем коде? Идеи как его улучшить и решить проблему? Заранее спасибо!
