赞
踩
逛论坛的时候发现对于这个题目,CNN似乎是个不错的解题思路。因为给出的数据是多维的,每条数据的维度是[year, month, lat, lon],在这四个维度下给出了SST、T300、Ua、Va四个指标的值。month的取值是36个月,lat是-55~60间隔5取值,即24个值,lon是0 ~180间隔5取值,即72个值。考虑到有四个指标,也就是说,数据的shape是[year, 36, 24, 72, 4]。目标是根据前12个月的数据预测后24个月的数据,因此取数据的前12个月作为训练集,后24个月作为目标值,训练数据的shape即为[year, 12, 24, 72, 4],其中每一个year(起始年),都是一条训练数据。将指标维度并入month维度,那么第二个维度的取值个数就变为12*4=48,训练数据的维度变为[year, 48, 24, 72],此时就可以参照着CNN模型的输入形状[N, C, H, W]。
PS:感谢论坛大佬提供的思路。
我只在datawhale开源的baseline上做了两个修改。
train_features = np.concatenate([soda_sst[:,:12,:,:], soda_t300[:,:12,:,:], soda_ua[:,:12,:,:], soda_va[:,:12,:,:]], axis=1)
def build_cnn(learning_rate): inp = tf.keras.layers.Input(shape=(48, 24, 72)) x = Conv2D(48, (3, 3), activation='relu', padding='same')(inp) x = MaxPooling2D((2, 2))(x) x = Dropout(0.2)(x) x = Conv2D(48, (3, 3), activation='relu', padding='same')(x) x = MaxPooling2D((2, 2))(x) x = Dropout(0.2)(x) x = Conv2D(48, (3, 3), activation='relu', padding='same')(x) x = Flatten()(x) x = Dense(64, activation='relu')(x) output = Dense(24, activation='linear')(x) model = Model(inputs=inp, outputs=output) adam = tf.optimizers.Adam(lr=learning_rate) model.compile(optimizer = adam, loss = RMSE) return model
由于时间仓促,仅用了SODA数据进行训练,提交后的结果如下图所示,比之前的mlp模型分数高一些,不过依然是负分(笑)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。