CNN для регрессии с большим MSE - PullRequest
0 голосов
/ 10 мая 2019

Моя цель - воспроизвести подход CNN (не CNN + GP, просто CNN), использованный в следующей статье для оценки урожайности на основе спутниковых снимков.

Целевые данные - годовой урожай сои в каждом округе США.

Данные объекта состоят из гистограмм (бинов = 32) из ​​9 спектральных полос для 30 временных шагов в целевые годы.30 гистограмм составлены для создания 2D гистограмм для каждой полосы.Таким образом, для каждого округа и каждого года мы имеем 2D гистограммы (32,30) с 9 каналами.

Для целей тестирования я выбираю 1 из 9 полос спутниковых данных.В этом случае поверхностная полоса отражения 7 (см. Бумагу).Таким образом, у меня есть 2D гистограммы с 1 каналом.

Я использую бумагу в качестве руководства для создания CNN.

enter image description here

Структура CNN, где сверточные слои Stride-1 имеют голубой цвет, сверточные слои Stride-2 - темно-синий и полностьюподключенный слой присоединен в конце.

import keras
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten, BatchNormalization
from keras.utils.vis_utils import plot_model
from IPython.display import Image
from matplotlib import pyplot as plt
%matplotlib inline

kernel_size = 3

model = Sequential()
model.add(Conv2D(filters=128,
                 kernel_size=kernel_size,
                 strides=1,
                 padding="valid",
                 data_format="channels_last",
                 activation='relu',
                 input_shape = (30,32,1) #width, heights
                ))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(filters=128,
                 kernel_size=kernel_size,
                 strides=2,
                 padding="same",
                 data_format="channels_last",
                 activation='relu'
                ))
model.add(Conv2D(filters=256,
                 kernel_size=kernel_size,
                 strides=1,
                 padding="same",
                 data_format="channels_last",
                 activation='relu'
                ))
model.add(Conv2D(filters=256,
                 kernel_size=kernel_size,
                 strides=2,
                 padding="same",
                 data_format="channels_last",
                 activation='relu'
                ))
model.add(Conv2D(filters=512,
                 kernel_size=kernel_size,
                 strides=1,
                 padding="same",
                 data_format="channels_last",
                 activation='relu'
                ))
model.add(Conv2D(filters=512,
                 kernel_size=kernel_size,
                 strides=1,
                 padding="valid",
                 data_format="channels_last",
                 activation='relu'
                ))
model.add(Conv2D(filters=512,
                 kernel_size=kernel_size,
                 strides=2,
                 padding="valid",
                 data_format="channels_last",
                 activation='relu'
                ))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(units=1,
                activation=None
                ))

adam = keras.optimizers.Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model.compile(loss='mean_squared_error', optimizer=adam,metrics=['mse'])

#Fit the model
history = model.fit(X_train, Y_train, epochs=20, batch_size=1000)

Однако после построения сети и обучения ее на срезе (одной полосе) данных я застрял.Авторы смогли (со всеми 9 полосами) получить среднее значение RMSE 5,77.Однако мой MSE (с использованием одной полосы) составляет 266,29%.

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

скрипт

feature_data
target_data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...