Как использовать NCF-модель tensorflow для прогнозирования?

Привет, я новичок в тензорном потоке и нейронных сетях. Попытка понять модель рекомендаций ncf в официальном репозитории моделей tensorflow.

Насколько я понимаю, вы строите модель с входными и обучающими слоями. Затем вы создаете пакеты данных для обучения модели, а затем используете тестовые данные для оценки модели. Это сделано в этом файле.

Однако мне сложно понять входные слои.

Это показано в коде

user_input = tf.keras.layers.Input(
      shape=(1,), name=movielens.USER_COLUMN, dtype=tf.int32)

Насколько я понимаю, вы можете вводить по одному параметру за раз.

Однако я могу использовать только следующие фиктивные данные для вызова pred_on_batch

user_input = np.full(shape=(256,),fill_value=1, dtype=np.int32)
item_input = np.full(shape=(256,),fill_value=1, dtype=np.int32)
valid_pt_mask_input = np.full(shape=(256,),fill_value=True, dtype=np.bool)
dup_mask_input = np.full(shape=(256,),fill_value=1, dtype=np.int32)
label_input = np.full(shape=(256,),fill_value=True, dtype=np.bool)
test_input_list = [user_input,item_input,valid_pt_mask_input,dup_mask_input,label_input]

tf.print(keras_model.predict_on_batch(test_input_list))

Когда я запускаю следующий код:

    user_input = np.full(shape=(1,),fill_value=1, dtype=np.int32)
    item_input = np.full(shape=(1,),fill_value=1, dtype=np.int32)
    valid_pt_mask_input = np.full(shape=(1,),fill_value=True, dtype=np.bool)
    dup_mask_input = np.full(shape=(1,),fill_value=1, dtype=np.int32)
    label_input = np.full(shape=(1,),fill_value=True, dtype=np.bool)
    test_input_list = [user_input,item_input,valid_pt_mask_input,dup_mask_input,label_input]

    classes = _model.predict(test_input_list)
    tf.print(classes)

У меня такая ошибка:

tensorflow.python.framework.errors_impl.InvalidArgumentError:  Input to reshape is a tensor with 1 values, but the requested shape requires a multiple of 256
     [[{{node model_1/metric_layer/StatefulPartitionedCall/StatefulPartitionedCall/Reshape_1}}]] [Op:__inference_predict_function_2828]

Может ли кто-нибудь помочь мне с использованием этой модели для прогнозирования с отдельными входами? А также почему item_id требуется вместе с user_id при прогнозировании? Разве вы не должны предоставить список пользователей, модель возвращает список элементов?

2 ответа

Если вы новичок в TensorFlow и глубоком обучении, этот проект рекомендаций, вероятно, не лучшее место для начала. Код не документирован, и архитектура может сбивать с толку.

В любом случае, чтобы ответить на ваши вопросы, модель не принимает отдельных входных данных для прогнозирования. Глядя на код, есть 5 входов (user_id, item_id, duplicate_mask, valid_pt_mask, label), но это действительно предназначено для обучения. Если вы просто хотите делать прогнозы, вам действительно нужны только user_id и item_id. Эта модель делает прогнозы на основе взаимодействий user_id и item_id, и поэтому вам нужны оба. Однако вы не можете сделать это напрямую, если не отключите ненужные части модели при прогнозировании. Ниже приведен код того, как это сделать после того, как ваш объект модели вызвал keras_model обучен (я использовал tf-model-official версию 2.5.0, и все работало нормально):

      from tensorflow.keras import Model
import tensorflow as tf

inputUserIds = keras_model.input['user_id']
inputItemIds = keras_model.input['item_id']
# Cut off the unnecessary parts of the model for predictions.
# Specifically, we're removing the loss and metric layers in the architecture.
# Note: we are not training a new model, just taking the parts of the model we need.
outputs = keras_model.get_layer('rating').output
newModel = Model(inputs=[inputUserIds, inputItemIds], outputs=outputs)

## Make predictions for user 1 with items ids 1, 2, 3, 4, 5
# Make a user. Each row will be user_id 1. The shape of this tensor is (5,1)
userIds = tf.constant([1, 1, 1, 1, 1])[:, tf.newaxis]
# Make a tensor of items. Each row will be different item ids. The shape of this tensor is (5,1)
itemIds = tf.constant([1,2,3,4,5])[:, tf.newaxis]

# Make preds. This preds will be for user id 1 and items ids 1,2,3,4,5
preds = newModel.predict(x=[userIds, itemIds])

Итак, если вы делаете прогнозы, вы хотите создать все комбинации элемент-пользователь, а затем отсортировать прогнозы в порядке убывания, отслеживая при этом индексы для каждого пользователя. Верхним элементом для этого пользователя будет прогноз модели, с которым, скорее всего, будет взаимодействовать этот пользователь, вторым элементом будет прогноз модели для второго, с которым наиболее вероятно взаимодействие, и так далее.

Есть папка с названием «summaries», которая создается при запуске этого файла ncf_keras_main.py. Если вы наведите тензорборд на эту папку, вы сможете исследовать архитектуру модели на вкладке графиков в верхнем левом углу. Чтобы запустить тензорборд, вы открываете терминал и набираете tensorboard --logdir location_of_summaries_folder_here

Раньше я не использовал модель ncf, но похоже, что вы вводите обучающие данные как 1 образец с 256 функциями вместо 256 образцов, каждый с 1 функцией. Просто переверните свои многочисленные массивы, убедитесь, что матрицы функций двухмерные, а количество функций является первым измерением.

user_input = np.full(shape=(1,256),fill_value=1, dtype=np.int32)

... и т. д. для остальных. (ну, метки должны оставаться 1D, как и у вас)

Точно так же убедитесь, что во входных данных прогноза матрица признаков является 2D:

user_input = np.full(shape=(1,1),fill_value=1, dtype=np.int32)
Другие вопросы по тегам