У меня есть набор данных с изображениями дневных карт осадков.Я пытаюсь построить модель прогнозирования осадков с использованием ConvLSTM2D.
Пожалуйста, помогите мне выяснить, как я могу изменить форму массива для работы.
Используя это в качестве ссылки: https://github.com/wqxu/ConvLSTM/blob/master/radar_forecast.py
Пожалуйста, помогите мне с этой ошибкой:
Error when checking input: expected conv_lst_m2d_167_input to have 5 dimensions, but got array with shape (1785, 400, 320, 3)
Если я добавлю другое измерение в массив изменения формы X_Train:
X_Train = np.array(X).reshape(-1, 400, 320, 1, 3)[:1785] # converting list to a numpy array
Я получу следующую ошибку [Что случилось с1785?]:
Error when checking input: expected conv_lst_m2d_167_input to have 5 dimensions, but got array with shape (400, 320, 1, 3)
Если я добавлю другое измерение к input_shape входного слоя ConvLSTM2D:
model.add(ConvLSTM2D(filters=128, kernel_size=(3, 3), input_shape=(None, 400, 320, 1, 3), padding='same', return_sequences=True))
Я получу следующую ошибку:
ValueError: Input 0 is incompatible with layer conv_lst_m2d_5:expected ndim=5, found ndim=6
В данный момент я просто пытаюсь найти любую ситуацию, которая действительно работает, чтобы я мог идти оттуда.Пожалуйста, помогите, если можете.
По сути, я хочу знать, заключается ли проблема в количестве измерений моих массивов?Если так, как я могу изменить это?
import numpy as np
import os
import cv2
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers.convolutional import Conv3D
from keras.layers.convolutional_recurrent import ConvLSTM2D
from keras.layers.normalization import BatchNormalization
DATADIR = "C:/Users/StephanIliffe/Documents/data"
training_data = []
def create_training_data():
path = os.path.join(DATADIR, "Input") # path to jpg precipitation maps
class_num = 1
for img in os.listdir(path):
img_array = cv2.imread(os.path.join(path, img))
new_array = cv2.resize(img_array, (400, 320))
training_data.append([new_array, class_num])
create_training_data()
X = []
X_Train = []
X_Test = []
for features, label in training_data:
X.append(features)
X_Train = np.array(X).reshape(-1, 400, 320, 3)[:1785] # converting list to a numpy array
X_Test = np.array(X).reshape(-1, 400, 320, 3)[765:] # converting list to a numpy array
model = Sequential()
model.add(ConvLSTM2D(filters=128, kernel_size=(3, 3),
input_shape=(None, 400, 320, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=128, kernel_size=(3, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=128, kernel_size=(3, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=128, kernel_size=(3, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(Conv3D(filters=1, kernel_size=(3, 3, 3),
activation='sigmoid',
padding='same', data_format='channels_last'))
model.compile(loss='mean_squared_error', optimizer='adadelta')
model.fit(X_Train, X_Test, batch_size=30, epochs=10, validation_split=0.05)