python 地理空间3D CNN的预测因子的形状

idfiyjo8  于 2023-05-21  发布在  Python
关注(0)|答案(1)|浏览(88)

我无法理解如何在python中构建一个3D CNN来解释空间特征。我有一个目标变量(二元分类)和三个预测变量(连续)。所有变量都有35个时间步长,137个纬度和181个经度。我做了个假剧本

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv3D, MaxPooling3D, Flatten, Dense

### Generate dummy variables
np.random.seed(42)
predictors = np.random.rand(35, 137, 181, 3)
target = np.random.rand(35, 137, 181)

model = Sequential()
model.add(Conv3D(32, 
          kernel_size=(3, 3, 3), 
          activation='relu', 
          input_shape=(35, 181, 137, 3)))
model.add(MaxPooling3D(pool_size=(2, 2, 2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(predictors, 
          target, 
          epochs=10, 
          batch_size=32, 
          validation_split=0.2)

但当我试着拟合模型时,我得到了错误

ValueError: Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 35, 181, 137, 3), found shape=(None, 181, 137, 3)

为什么会发生这种情况?我知道这是一个菜鸟问题,但如果有人能帮我解决这个问题,并解释是怎么回事,那就太好了!最终,模型应该能够沿着时间轴预测,即基于3个预测变量。

siotufzp

siotufzp1#

试试这个例子:

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv3D, MaxPooling3D, Flatten, Dense

# Generate random fake images
np.random.seed(42)

# set the parameters for the dataset
params = {
    'num_samples': 100,
    'timesteps': 10,
    'height': 8,
    'width': 8,
    'channels': 3
}

# fake image generate function
# it should contain 'num_samples' for the number of samples.
def generate_fake(*args, **kwargs):
    fake_images = np.random.rand(**kwargs)
    # Generate random fake target labels (binary classification)
    fake_labels = np.random.randint(0, 2, size=(kwargs['num_samples'],))
    return fake_images, fake_labels

def create_model():
    model = Sequential()
    model.add(Conv3D(32, kernel_size=(3, 3, 3), activation='relu', input_shape=(timesteps, height, width, channels)))
    model.add(MaxPooling3D(pool_size=(2, 2, 2)))
    model.add(Flatten())
    model.add(Dense(64, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    return model

fake_images, fake_labels = generate_fake(**params)
model = create_model()
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(fake_images, fake_labels, epochs=10, batch_size=32, validation_split=0.2)

使用此函数将简单时间序列分组为时间序列组

def group_timeseries_images(timeseries, window_size):
    num_timesteps = timeseries.shape[0]
    num_groups = num_timesteps - window_size + 1
    timestep_groups = np.empty((num_groups, window_size))
    for i in range(num_groups):
        timestep_groups[i] = timeseries[i:i+window_size]
    return timestep_groups

# use it like this:
samples = group_timeseries_images(images, window_size=3)

但你给自己贴的标签恐怕...

相关问题