【发布时间】:2019-11-22 11:57:44
【问题描述】:
我正在使用 ConvNets 构建一个模型来进行天气预报。我的输入数据是 96x144 矩阵(代表地理区域)的 10K 个样本,在固定高度的网格的每个点中具有变量 Z(地势高度)的值。如果我包含 3 个不同的高度(Z 在不同的高度上非常不同),那么我有这个输入形状:(num_samples,96,144,3)。样品是每小时的,一个样品=一小时。我有将近2年的数据。输入数据(Z)表示该小时的大气状态。
这可以被认为是具有 3 个通道的图像,但不是在 0-256 范围内的像素值,而是在更大范围内的 Z 值(最后一个通道的高度范围为 7500 到 9500,第一个一个的范围是 500 到 1500 aprox)。
我想预测降水(会不会下雨?只是那个,二进制,是或否)。
在那个网格中,我国家的那个空间区域,我只有特定 (x,y) 点的输出数据(整个区域只有 122 个气象站有降雨数据)。只有 122 (x,y) 点我的值为 1(那个小时下雨)或 0(没有下雨)。
所以我的输出矩阵是一个 (num_samples,122) 向量,如果在该样本中(那个小时)下雨,则在站点索引中包含 1,如果没有下雨,则包含 0。
所以我使用了 VGG16 模型和 https://github.com/prl900/precip-encoder-decoders/blob/master/encoder_vgg16.py 之间的混合模型,这是我在一篇论文中找到的用于此特定应用程序的模型。
我想知道我是否以正确的方式构建模型,我只是更改了输入层以匹配我的形状和 FC 层的最后一层以匹配我的类(122,因为对于特定的输入样本,我希望有一个 0 或 1 的 1x122 向量,具体取决于该站是否下雨,对吗?)。由于概率不是互斥的(如果不止一个站点下雨,我可以有很多 1)我在最后一层使用了“sigmoid”激活。
我不知道在编译中使用哪个指标,acc、mae 和分类 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
【问题讨论】:
标签: python tensorflow keras neural-network conv-neural-network