Hi all, apologies in advacne it is my first post. i am trying an experiment with new data and i getting an error i was wondering if somebody could please assist.
import math
import cvxpy as cp
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import torch
from cvxpylayers.torch import CvxpyLayer
import latexify
latexify.latexify()
torch.set_default_tensor_type(torch.DoubleTensor)
%matplotlib inline
N_train=1000
test=yf.download("SPY", start="2012-01-01", end="2017-04-30")['Close'].to_numpy()
outputs=torch.from_numpy(test)
inputs=np.linspace(1,100,len(outputs))
inputs=torch.from_numpy(inputs)
X_train = inputs[:N_train]
Y_train = outputs[:N_train]
X_val = inputs[N_train:]
Y_val = outputs[N_train:]
len(X_val)
len(Y_val)
def create_layer():
y_cp = cp.Variable(n)
x_minus_y = cp.Variable(n)
x_param = cp.Parameter(n)
theta_param = cp.Parameter((n, n))
lambda_param = cp.Parameter(pos=True)
objective = (
cp.sum_squares(theta_param @ x_minus_y) +
lambda_param*cp.sum_squares(cp.diff(y_cp))
)
constraints = [
x_minus_y == x_param - y_cp
]
problem = cp.Problem(cp.Minimize(objective), constraints)
layer = CvxpyLayer(
problem,
parameters=[x_param, theta_param, lambda_param],
variables=[y_cp])
return layer
layer = create_layer()
import torch
from torch.utils.data import TensorDataset, DataLoader
import numpy as np
from cvxpylayers.torch import CvxpyLayer
torch.set_default_dtype(torch.double)
from tqdm.notebook import tqdm
def fit(loss, params, X, Y, Xval, Yval, batch_size=128, lr=1e-3, epochs=100, verbose=False, print_every=1, callback=None):
"""
Arguments:
loss: given x and y in batched form, evaluates loss.
params: list of parameters to optimize.
X: input data, torch tensor.
Y: output data, torch tensor.
Xval: input validation data, torch tensor.
Yval: output validation data, torch tensor.
"""
train_dset = TensorDataset(X, Y)
train_loader = DataLoader(train_dset, batch_size=batch_size, shuffle=True)
opt = torch.optim.Adam(params, lr=lr)
train_losses = []
val_losses = []
for epoch in tqdm(range(epochs)):
if callback is not None:
callback()
with torch.no_grad():
val_losses.append(loss(Xval, Yval).item())
if verbose and epoch % print_every == 0:
print("val loss %03d | %3.5f" % (epoch + 1, val_losses[-1]))
batch = 1
train_losses.append([])
for Xbatch, Ybatch in train_loader:
opt.zero_grad()
l = loss(Xbatch, Ybatch)
l.backward()
opt.step()
train_losses[-1].append(l.item())
if verbose and epoch % print_every == 0:
print("batch %03d / %03d | %3.5f" %
(batch, len(train_loader), np.mean(train_losses[-1])))
batch += 1
return val_losses, train_losses
theta_tch = torch.eye(n, requires_grad=True)
lambda_tch = torch.tensor(0.5, requires_grad=True)
params = [theta_tch, lambda_tch]
def loss_fn(X, actual):
preds = layer(X, theta_tch, lambda_tch)[0]
mse_per_example = (preds - actual).pow(2).mean(axis=1)
return mse_per_example.mean()
val_losses, train_losses = fit(
loss_fn, params, X_train, Y_train, X_val, Y_val, lr=1e-2, batch_size=8,
epochs=15, verbose=True, print_every=1)
The above is the code taken from - https://github.com/cvxgrp/cvxpylayers/blob/master/examples/torch/signal_denoising.ipynb
and the error i am getting
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-58-0b0fb50d4406> in <module>
----> 1 val_losses, train_losses = fit(
2 loss_fn, params, X_train, Y_train, X_val, Y_val, lr=1e-2, batch_size=8,
3 epochs=15, verbose=True, print_every=1)
<ipython-input-56-f19c59cb9b44> in fit(loss, params, X, Y, Xval, Yval, batch_size, lr, epochs, verbose, print_every, callback)
32
33 with torch.no_grad():
---> 34 val_losses.append(loss(Xval, Yval).item())
35 if verbose and epoch % print_every == 0:
36 print("val loss %03d | %3.5f" % (epoch + 1, val_losses[-1]))
<ipython-input-57-0aead751c22d> in loss_fn(X, actual)
4
5 def loss_fn(X, actual):
----> 6 preds = layer(X, theta_tch, lambda_tch)[0]
7 mse_per_example = (preds - actual).pow(2).mean(axis=1)
8 return mse_per_example.mean()
~/miniconda3/envs/myenv1/lib/python3.8/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
720 result = self._slow_forward(*input, **kwargs)
721 else:
--> 722 result = self.forward(*input, **kwargs)
723 for hook in itertools.chain(
724 _global_forward_hooks.values(),
~/cvxpylayers/cvxpylayers/torch/cvxpylayer.py in forward(self, solver_args, *params)
150 info=info,
151 )
--> 152 sol = f(*params)
153 self.info = info
154 return sol
~/cvxpylayers/cvxpylayers/torch/cvxpylayer.py in forward(ctx, *params)
224 p_shape = p.shape if batch_size == 0 else p.shape[1:]
225 if not np.all(p_shape == param_order[i].shape):
--> 226 raise ValueError(
227 "Inconsistent parameter shapes passed in. "
228 "Expected parameter {} to have non-batched shape of "
ValueError: Inconsistent parameter shapes passed in. Expected parameter 0 to have non-batched shape of (100,) but got torch.Size([339]).