Python 缺少天气预报输出数据的ConvNet
我正在使用ConvNets建立一个模型来做天气预报。我的输入数据是一个96x144矩阵(代表一个地理区域)的10K样本,在固定高度的网格的每个点上具有可变Z(位势高度)的值。如果我包括3个不同的高度(Z在不同高度中非常不同),那么我有这个输入形状:(num_samples,96144,3)。样本为每小时一次,一个样本=一小时。我有近两年的数据。输入数据(Z)表示该小时的大气状态 这可以被认为是一个具有3个通道的图像,但不是0-256范围内的像素值,而是更大范围内的Z值(最后一个通道的高度范围为7500到9500,第一个通道的高度范围为500到1500) 我想预测降水量(会不会下雨?就这样,双星,是或否) 在那个网格中,我的国家的那个空间区域,我只有特定(x,y)点的输出数据(整个区域只有122个气象站有降雨数据)。只有122(x,y)个点的值是1(那个小时下雨了)或0(没下雨) 因此,我的输出矩阵是一个(num_samples,122)向量,如果样本(那个小时)下雨,它在站点索引中包含1,如果没有下雨,则包含0 所以我混合使用了VGG16模型和这个模型,这是我在一篇论文中发现的用于这个特定应用程序的模型 我想知道我是否以正确的方式构建模型,我只是更改了输入层以匹配我的形状,更改了FC层的最后一层以匹配我的类(122,因为对于特定的输入样本,我希望有一个1x122向量,其值为0或1,这取决于该站点是否下雨,对吗?)。由于概率不是相互排斥的(如果在多个站点下雨,我可以有很多个1),我在最后一层使用了“S形”激活 我不知道在编译中使用哪种度量,acc、mae和分类acc在所有历元中都保持不变(在第二个历元中,acc和val_acc略有增加,但在第二个历元之后,每个历元的acc和val_acc都保持不变) 而且,在输出矩阵中有空值(站点没有数据的小时数),我只是用-1值填充NAN(就像“我不知道”标签)。这可能是因为什么都不管用 谢谢你的帮助,很抱歉解释得太多了Python 缺少天气预报输出数据的ConvNet,python,tensorflow,keras,neural-network,conv-neural-network,Python,Tensorflow,Keras,Neural Network,Conv Neural Network,我正在使用ConvNets建立一个模型来做天气预报。我的输入数据是一个96x144矩阵(代表一个地理区域)的10K样本,在固定高度的网格的每个点上具有可变Z(位势高度)的值。如果我包括3个不同的高度(Z在不同高度中非常不同),那么我有这个输入形状:(num_samples,96144,3)。样本为每小时一次,一个样本=一小时。我有近两年的数据。输入数据(Z)表示该小时的大气状态 这可以被认为是一个具有3个通道的图像,但不是0-256范围内的像素值,而是更大范围内的Z值(最后一个通道的高度范围为7
def get_vgg16():
model = Sequential()
# Conv Block 1
model.add(BatchNormalization(axis=3, input_shape=(96,144,3)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Conv Block 2
model.add(BatchNormalization(axis=3))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Conv Block 3
model.add(BatchNormalization(axis=3))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Conv Block 4
model.add(BatchNormalization(axis=3))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Conv Block 5
model.add(BatchNormalization(axis=3))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# FC layers
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dense(4096, activation='relu'))
model.add(Dense(122, activation='sigmoid'))
#adam = Adam(lr=0.001)
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=[metrics.categorical_accuracy,metrics.binary_accuracy, 'acc'])
print(model.summary())
return model
为了改进模型,需要考虑各种各样的问题: 你选择的损失 你可以在这里做各种各样的事情。使用L2损失(平方距离最小化)是一种选择,其中每个站点的目标为无雨(0)或无雨(1)。另一个(更准确的)选择是将每个输出视为在该站下雨的概率。然后,您将为每个输出值应用二进制损失 二元交叉熵就是应用于两类分类问题的正则交叉熵。请注意,当只有两种可能的结果时,P(y)=1-P(x)。因此,你不需要添加任何额外的神经元 掩盖损失 不要将缺少的目标设置为-1。这没有意义,只会给训练带来噪音。假设您正在使用L2丢失。如果您的网络预测该值的降雨,则意味着(1-(-1))^2=4,预测误差非常大。相反,您希望网络忽略这些情况 你可以通过掩盖损失来做到这一点。假设您进行Y=(num_samples,122)预测,并有一个形状相同的目标矩阵T。您可以定义一个大小相同的二进制掩码M,其中1代表您知道的值,0位于缺失的值位置。那么,你的损失将是L=M*loss(Y,T)。对于缺少的值,损失将始终为0,没有梯度:从中不会学到任何东西 将输入标准化 输入始终是良好的实践。这样可以避免某些功能比其他功能更具相关性,从而加快训练速度。在输入量非常大的情况下,它也有助于稳定训练,防止梯度爆炸
在您的例子中,您有三个通道,每个通道遵循不同的分布(它具有不同的最小值和最大值)。在计算MI+MAX/MIDE+STDV值时,需要分别为每个通道(高度)考虑所有样本的数据,然后应用这两个值来规范/标准化所有样本上的相应信道。也就是说,给定一个大小为(N,96144,3)的张量,分别规范化/标准化每个大小为(N,96144,1)的子张量。你需要对测试数据应用相同的变换,所以保存缩放值。稍后, < P>为了改进模型,有很多事情要考虑: 你选择的损失 你可以在这里做各种各样的事情。使用L2损失(平方距离最小化)是一种选择,其中每个站点的目标为无雨(0)或无雨(1)。另一个(更准确的)选择是将每个输出视为在该站下雨的概率。然后,您将为每个输出值应用二进制损失 二元交叉熵就是应用于两类分类问题的正则交叉熵。请注意,当只有两种可能的结果时,P(y)=1-P(x)。因此,你不需要添加任何额外的神经元 掩盖损失 不要将缺少的目标设置为-1。这没有意义,只会给训练带来噪音。假设您正在使用L2丢失。如果您的网络预测该值的降雨,则意味着(1-(-1))^2=4,预测误差非常大。相反,您希望网络忽略这些情况 你可以通过掩盖损失来做到这一点。假设你做Y=(num_sam