Description
When using the PyTorch backend to run the NeuMF model, Cornac ignores the num_factors argument provided during model initialisation.
As a result, the PyTorch NeuMF model always receives the default num_factors=8, even when the user explicitly sets a different value.
This leads to an assertion failure in backend_pt.py#L140 on assert layers[-1] == num_factors. As layers[-1] is the user-provided layers, but num_factors is from the default 8, not the value given by the user.
How do we replicate the issue?
model = cornac.models.NeuMF(
num_factors=11,
layers=(64, 16, 8, 11),
backend="pytorch",
)
model._build_model_pt() # AssertionError
Cause of the problem
Looks to me that this is in (1) recom_neumf.py#L263
model = NeuMF(
num_users=self.num_users,
num_items=self.num_items,
layers=self.layers,
act_fn=self.act_fn,
)
which instantiates the class in (2) backend_pt.py#L123
class NeuMF(nn.Module):
def __init__(
self,
num_users: int,
num_items: int,
num_factors: int = 8,
layers=(64, 32, 16, 8),
act_fn="relu",
):
Note that the class in (2) accepts param num_factors with default of 8; however this param is not passed at initialisation in (1).
Proposed fix
model = NeuMF(
num_users=self.num_users,
num_items=self.num_items,
layers=self.layers,
num_factors=self.num_factors, # add this!
act_fn=self.act_fn,
)
My other suggestion would be to have a more helpful error message which displays what layers and num_factors are
Workaround
Use tensorflow backend - this correctly uses num_factors here.
model = cornac.models.NeuMF(
num_factors=11,
layers=(64, 16, 8, 11),
backend="tensorflow",
)
model._build_model_tf()
should work though I've not tested it.
Note: setting num_factors=None doesn't help with pytorch backend, as the None doesn't get passed either.
Thanks for the great package!
Description
When using the PyTorch backend to run the NeuMF model, Cornac ignores the
num_factorsargument provided during model initialisation.As a result, the PyTorch NeuMF model always receives the default
num_factors=8, even when the user explicitly sets a different value.This leads to an assertion failure in backend_pt.py#L140 on
assert layers[-1] == num_factors. Aslayers[-1]is the user-provided layers, butnum_factorsis from the default 8, not the value given by the user.How do we replicate the issue?
Cause of the problem
Looks to me that this is in (1) recom_neumf.py#L263
which instantiates the class in (2) backend_pt.py#L123
Note that the class in (2) accepts param
num_factorswith default of 8; however this param is not passed at initialisation in (1).Proposed fix
My other suggestion would be to have a more helpful error message which displays what layers and num_factors are
Workaround
Use tensorflow backend - this correctly uses
num_factorshere.should work though I've not tested it.
Note: setting
num_factors=Nonedoesn't help with pytorch backend, as the None doesn't get passed either.Thanks for the great package!