Tensorflow — Учебное пособие по временным рядам — Как работает обработка окон данных?Python

Программы на Python
Ответить
Anonymous
 Tensorflow — Учебное пособие по временным рядам — Как работает обработка окон данных?

Сообщение Anonymous »

Я следую руководству по временным рядам от TensorFlow, которое собирает данные о погоде и прогнозирует будущее значение температуры.
Мне трудно понять, как работает оконный генератор работает и как ведет себя каждая переменная.
Это код для создания окна:

wide_window = WindowGenerator(input_width =24, label_width=1,
shift=1, label_columns=['T (degC)'])

Теперь, согласно руководству, это означает что модель принимает данные о погоде за 24 часа и прогнозирует температуру на следующий 1 час (то есть 1 значение). Это работает.
ОДНАКО, если я изменю сдвиг (как далеко в будущем делать прогноз) на любое значение, кроме 1:

wide_window = WindowGenerator(input_width=24, label_width=1,
shift=3, label_columns=['T (degC)'])

Тогда модель не возвращает прогноза, что приводит к сбою функции Plot WindowGenerator.
ТАКЖЕ, если я изменю label_width (сколько прогнозов сделать из сдвига назад, судя по всему) на любое значение, отличное от 24 или 1:

wide_window = WindowGenerator(input_width=24, label_width=3,
shift=1, label_columns=['T (degC)'])

После этого метод model.fit завершается с ошибкой:
Exception has occurred: ValueError
Dimensions must be equal, but are 3 and 24 for '{{node compile_loss/mean_squared_error/sub}} = Sub[T=DT_FLOAT](data_1, sequential_1/dense_1/Add)' with input shapes: [?,3,1], [?,24,1].

Мой вопрос: почему? Почему я могу предсказать только 24 прогноза или 1 прогноз, но не 3 прогноза? И почему я могу предсказать 1 шаг в будущем, но не дальше?
Это соответствующая часть кода (я пропустил загрузку и форматирование данных из руководства, чтобы сохранить это фрагмент кода сжат):
# WINDOW GENERATOR CLASS
class WindowGenerator():
def __init__(self, input_width, label_width, shift,
train_df=train_df, val_df=val_df, test_df=test_df,
label_columns=None):
# Store the raw data.
self.train_df = train_df
self.val_df = val_df
self.test_df = test_df

# Work out the label column indices.
self.label_columns = label_columns
if label_columns is not None:
self.label_columns_indices = {name: i for i, name in
enumerate(label_columns)}
self.column_indices = {name: i for i, name in
enumerate(train_df.columns)}

# Work out the window parameters.
self.input_width = input_width
self.label_width = label_width
self.shift = shift

self.total_window_size = input_width + shift

self.input_slice = slice(0, input_width)
self.input_indices = np.arange(self.total_window_size)[self.input_slice]

self.label_start = self.total_window_size - self.label_width
self.labels_slice = slice(self.label_start, None)
self.label_indices = np.arange(self.total_window_size)[self.labels_slice]

def __repr__(self):
return '\n'.join([
f'Total window size: {self.total_window_size}',
f'Input indices: {self.input_indices}',
f'Label indices: {self.label_indices}',
f'Label column name(s): {self.label_columns}'])

# SPLIT FUNCTION
def split_window(self, features):
inputs = features[:, self.input_slice, :]
labels = features[:, self.labels_slice, :]
if self.label_columns is not None:
labels = tf.stack(
[labels[:, :, self.column_indices[name]] for name in self.label_columns],
axis=-1)

# Slicing doesn't preserve static shape information, so set the shapes
# manually. This way the `tf.data.Datasets` are easier to inspect.
inputs.set_shape([None, self.input_width, None])
labels.set_shape([None, self.label_width, None])

return inputs, labels

# PLOT FUNCTION
def plot(self, model=None, plot_col='T (degC)', max_subplots=3):
inputs, labels = self.example
plt.figure(figsize=(12, 8))
plot_col_index = self.column_indices[plot_col]
max_n = min(max_subplots, len(inputs))
for n in range(max_n):
plt.subplot(max_n, 1, n+1)
plt.ylabel(f'{plot_col} [normed]')
plt.plot(self.input_indices, inputs[n, :, plot_col_index],
label='Inputs', marker='.', zorder=-10)

if self.label_columns:
label_col_index = self.label_columns_indices.get(plot_col, None)
else:
label_col_index = plot_col_index

if label_col_index is None:
continue

plt.scatter(self.label_indices, labels[n, :, label_col_index],
edgecolors='k', label='Labels', c='#2ca02c', s=64)
if model is not None:
predictions = model(inputs)
plt.scatter(self.label_indices, predictions[n, self.label_indices[0]-1:self.label_indices[-1], label_col_index],
marker='X', edgecolors='k', label='Predictions',
c='#ff7f0e', s=64)
# ERROR WHEN SHIFT IS NOT 1 BECAUSE NO PREDICTION:
# Exception has occurred: ValueError. x and y must be the same size

if n == 0:
plt.legend()

plt.xlabel('Time [h]')
plt.show()

# MAKE DATASET FUNCTION
def make_dataset(self, data):
data = np.array(data, dtype=np.float32)
ds = tf.keras.utils.timeseries_dataset_from_array(
data=data,
targets=None,
sequence_length=self.total_window_size,
sequence_stride=1,
shuffle=True,
batch_size=BATCH_SIZE,)

ds = ds.map(self.split_window)

return ds

@property
def train(self):
return self.make_dataset(self.train_df)

@property
def val(self):
return self.make_dataset(self.val_df)

@property
def test(self):
return self.make_dataset(self.test_df)

@property
def example(self):
"""Get and cache an example batch of `inputs, labels` for plotting."""
result = getattr(self, '_example', None)
if result is None:
# No example batch was found, so get one from the `.train` dataset
result = next(iter(self.train))
# And cache it for next time
self._example = result
return result

val_performance = {}
performance = {}

# WIDE WINDOW
wide_window = WindowGenerator(
input_width=24, label_width=1, shift=1,
label_columns=['T (degC)'])

# print(wide_window)
# print('Input shape:', wide_window.example[0].shape)
# print('Output shape:', baseline(wide_window.example[0]).shape)

# LINEAR MODEL
linear = tf.keras.Sequential([
tf.keras.layers.Dense(units=1)
])
# print('Input shape:', single_step_window.example[0].shape)
# print('Output shape:', linear(single_step_window.example[0]).shape)

# COMPILE AND FIT FUNCTION
MAX_EPOCHS = 20

def compile_and_fit(model, window, patience=2):
early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss',
patience=patience,
mode='min')

model.compile(loss=tf.keras.losses.MeanSquaredError(),
optimizer=tf.keras.optimizers.Adam(),
metrics=[tf.keras.metrics.MeanAbsoluteError()])

history = model.fit(window.train, epochs=MAX_EPOCHS,
validation_data=window.val,
callbacks=[early_stopping])
# # ERROR WHEN label_width IS NOT 1 OR 24 (WHY THESE VALUES?):
# Exception has occurred: ValueError
# Dimensions must be equal, but are 3 and 24 for '{{node compile_loss/mean_squared_error/sub}} = Sub[T=DT_FLOAT](data_1, sequential_1/dense_1/Add)' with input shapes: [?,3,1], [?,24,1].
return history

# COMPILE AND FIT THE LINEAR MODEL ONTO THE WIDE WINDOW
history = compile_and_fit(linear, wide_window)

print('Input shape:', wide_window.example[0].shape)
print('Output shape:', linear(wide_window.example[0]).shape)

val_performance['Linear'] = linear.evaluate(wide_window.val, return_dict=True)
performance['Linear'] = linear.evaluate(wide_window.test, verbose=0, return_dict=True)

wide_window.plot(linear)


Подробнее здесь: https://stackoverflow.com/questions/792 ... wing-works
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»