Я следую руководству по временным рядам от 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
Tensorflow — Учебное пособие по временным рядам — Как работает обработка окон данных? ⇐ Python
Программы на Python
1733245243
Anonymous
Я следую руководству по временным рядам от TensorFlow, которое собирает данные о погоде и прогнозирует будущее значение температуры.
Мне трудно понять, как работает оконный генератор работает и как ведет себя каждая переменная.
Это код для создания окна:
wide_window = WindowGenerator(input_width =24, label_width=1,
shift=1, label_columns=['T (degC)'])
Теперь, согласно руководству, это означает что модель принимает данные о погоде за 24 часа и прогнозирует температуру на следующий 1 час (то есть 1 значение). Это работает.
ОДНАКО, если я изменю [b]сдвиг[/b] (как далеко в будущем делать прогноз) на любое значение, кроме 1:
wide_window = WindowGenerator(input_width=24, label_width=1,
shift=3, label_columns=['T (degC)'])
Тогда модель не возвращает прогноза, что приводит к сбою функции Plot WindowGenerator.
ТАКЖЕ, если я изменю [b]label_width[/b] (сколько прогнозов сделать из сдвига назад, судя по всему) на любое значение, отличное от 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)
Подробнее здесь: [url]https://stackoverflow.com/questions/79248554/tensorflow-time-series-tutorial-how-does-data-windowing-works[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия