Моя цель - воспроизвести подход CNN (не CNN + GP, просто CNN), использованный в следующей статье для оценки урожайности на основе спутниковых снимков.
Целевые данные - годовой урожай сои в каждом округе США.
Данные объекта состоят из гистограмм (бинов = 32) из 9 спектральных полос для 30 временных шагов в целевые годы.30 гистограмм составлены для создания 2D гистограмм для каждой полосы.Таким образом, для каждого округа и каждого года мы имеем 2D гистограммы (32,30) с 9 каналами.
Для целей тестирования я выбираю 1 из 9 полос спутниковых данных.В этом случае поверхностная полоса отражения 7 (см. Бумагу).Таким образом, у меня есть 2D гистограммы с 1 каналом.
Я использую бумагу в качестве руководства для создания CNN.
![enter image description here](https://i.stack.imgur.com/OYxOX.jpg)
Структура 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