使用大型MSE进行CNN回归

时间:2019-05-10 15:06:07

标签: python keras regression

我的目标是复制以下paper中使用的CNN方法(不是CNN + GP,仅是CNN),以便根据卫星图像估算作物产量。

目标数据是美国每个县的年度大豆产量。

特征数据由目标年份中30个时间步长的9个光谱带的直方图(bins = 32)组成。堆叠30个直方图以为每个波段创建2D直方图。因此,对于每个县和每年,我们都有带有9个通道的二维直方图(32,30)。

出于测试目的,我选择了9个卫星数据波段中的1个。在这种情况下,表面反射带7(请参见纸张)。因此,我具有1通道的2D直方图。

我以本文为指导来创建CNN。

enter image description here

  

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%。

我的模型定义中可能存在一个基本缺陷,但我找不到。我已经在这个模型上工作了几个小时,没有任何改进。

script

feature_data
target_data

0 个答案:

没有答案