簡體   English   中英

RuntimeError: quantile() q 張量必須與 pytorch-forecasting 中的輸入張量具有相同的 dtype

[英]RuntimeError: quantile() q tensor must be same dtype as the input tensor in pytorch-forecasting

  • PyTorch-預測版本:0.10.2
  • PyTorch版本:1.12.1
  • Python版本:3.10.4
  • 操作系統:windows

預期行為

沒有錯誤

實際行為

錯誤是

文件 c:\Users\josepeeterson.er\Miniconda3\envs\pytorch\lib\site-packages\pytorch_forecasting\metrics\base_metrics.py:979,在 DistributionLoss.to_quantiles(self, y_pred, quantiles, n_samples) 977 除了 NotImplementedError: #ImplementedError依靠經驗得出分位數 978 個樣本 = torch.sort(self.sample(y_pred, n_samples), -1).values --> 979 個分位數 = torch.quantile(samples, torch.tensor(quantiles, device=samples.device) , dim=2).permute(1, 2, 0) 980 返回分位數

RuntimeError: quantile() q 張量必須與輸入張量具有相同的 dtype

如何將它們設置為相同的數據類型? 這發生在內部。 我無法控制這一點。 我沒有使用任何 GPU。

帶有輸入數據的 .csv 文件的鏈接是https://github.com/JosePeeterson/Demand_forecasting數據只是每 4 小時從帶有參數 (9,0.5) 的負二元分布中采樣的。 兩者之間的時間都為零。 我只是想看看 DeepAR 是否可以學習這種模式。

重現問題的代碼



from pytorch_forecasting.data.examples import generate_ar_data
import matplotlib.pyplot as plt
import pandas as pd
from pytorch_forecasting.data import TimeSeriesDataSet
from pytorch_forecasting.data import NaNLabelEncoder
from pytorch_lightning.callbacks import EarlyStopping, LearningRateMonitor
import pytorch_lightning as pl
from pytorch_forecasting import NegativeBinomialDistributionLoss, DeepAR
import torch
from pytorch_forecasting.data.encoders import TorchNormalizer

data = [pd.read_csv('1_f_nbinom_train.csv')]

data["date"] = pd.Timestamp("2021-08-24") + pd.to_timedelta(data.time_idx, "H")
data['_hour_of_day'] = str(data["date"].dt.hour)
data['_day_of_week'] = str(data["date"].dt.dayofweek)
data['_day_of_month'] = str(data["date"].dt.day)
data['_day_of_year'] = str(data["date"].dt.dayofyear)
data['_week_of_year'] = str(data["date"].dt.weekofyear)
data['_month_of_year'] = str(data["date"].dt.month)
data['_year'] = str(data["date"].dt.year)

max_encoder_length = 60
max_prediction_length = 20
training_cutoff = data["time_idx"].max() - max_prediction_length

training = TimeSeriesDataSet(
    data.iloc[0:-620],
    time_idx="time_idx",
    target="value",
    categorical_encoders={"series": NaNLabelEncoder(add_nan=True).fit(data.series), "_hour_of_day": NaNLabelEncoder(add_nan=True).fit(data._hour_of_day), \
       "_day_of_week": NaNLabelEncoder(add_nan=True).fit(data._day_of_week), "_day_of_month" : NaNLabelEncoder(add_nan=True).fit(data._day_of_month), "_day_of_year" : NaNLabelEncoder(add_nan=True).fit(data._day_of_year), \
        "_week_of_year": NaNLabelEncoder(add_nan=True).fit(data._week_of_year), "_year": NaNLabelEncoder(add_nan=True).fit(data._year)},
    group_ids=["series"],
    min_encoder_length=max_encoder_length,
    max_encoder_length=max_encoder_length,
    min_prediction_length=max_prediction_length,
    max_prediction_length=max_prediction_length,
    time_varying_unknown_reals=["value"],
    time_varying_known_categoricals=["_hour_of_day","_day_of_week","_day_of_month","_day_of_year","_week_of_year","_year" ],
    time_varying_known_reals=["time_idx"],
    add_relative_time_idx=False,
    randomize_length=None,
    scalers=[],
    target_normalizer=TorchNormalizer(method="identity",center=False,transformation=None )

)

validation = TimeSeriesDataSet.from_dataset(
    training,
    data.iloc[-620:-420],
    # predict=True,
    stop_randomization=True,
)       


batch_size = 64
train_dataloader = training.to_dataloader(train=True, batch_size=batch_size, num_workers=8)
val_dataloader = validation.to_dataloader(train=False, batch_size=batch_size, num_workers=8)


# save datasets
training.save("training.pkl")
validation.save("validation.pkl")


early_stop_callback = EarlyStopping(monitor="val_loss", min_delta=1e-4, patience=5, verbose=False, mode="min")
lr_logger = LearningRateMonitor()


trainer = pl.Trainer(
    max_epochs=10,
    gpus=0,
    gradient_clip_val=0.1,
    limit_train_batches=30,
    limit_val_batches=3,
    # fast_dev_run=True,
    # logger=logger,
    # profiler=True,
    callbacks=[lr_logger, early_stop_callback],
)


deepar = DeepAR.from_dataset(
    training,
    learning_rate=0.1,
    hidden_size=32,
    dropout=0.1,
    loss=NegativeBinomialDistributionLoss(),
    log_interval=10,
    log_val_interval=3,
    # reduce_on_plateau_patience=3,
)
print(f"Number of parameters in network: {deepar.size()/1e3:.1f}k")



torch.set_num_threads(10)
trainer.fit(
    deepar,
    train_dataloaders=train_dataloader,
    val_dataloaders=val_dataloader,
)



需要將樣本投射到 torch.tensor 中,如下所示。 然后保存這個 base_metrics.py 並重新運行上面的代碼。

    except NotImplementedError:  # resort to derive quantiles empirically
           samples = torch.sort(self.sample(y_pred, n_samples), -1).values
           quantiles = torch.quantile(torch.tensor(samples), torch.tensor(quantiles, device=samples.device), dim=2).permute(1, 2, 0)
  return quantiles

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM