我的目标是复制以下paper中使用的CNN方法(不是CNN + GP,仅是CNN),以便根据卫星图像估算作物产量。
目标数据是美国每个县的年度大豆产量。
特征数据由目标年份中30个时间步长的9个光谱带的直方图(bins = 32)组成。堆叠30个直方图以为每个波段创建2D直方图。因此,对于每个县和每年,我们都有带有9个通道的二维直方图(32,30)。
出于测试目的,我选择了9个卫星数据波段中的1个。在这种情况下,表面反射带7(请参见纸张)。因此,我具有1通道的2D直方图。
我以本文为指导来创建CNN。
CNN结构,其中第1步卷积层为浅蓝色, 步幅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个波段中)平均获得5.77的RMSE。但是我的MSE(使用一个频段)为266.29%。
我的模型定义中可能存在一个基本缺陷,但我找不到。我已经在这个模型上工作了几个小时,没有任何改进。