Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 缺少天气预报输出数据的ConvNet_Python_Tensorflow_Keras_Neural Network_Conv Neural Network - Fatal编程技术网

Python 缺少天气预报输出数据的ConvNet

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

我正在使用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(就像“我不知道”标签)。这可能是因为什么都不管用

谢谢你的帮助,很抱歉解释得太多了

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