প্রস্তাবিত চলচ্চিত্র: একটি অনুক্রমিক মডেল ব্যবহার করে পুনরুদ্ধার

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

এই টিউটোরিয়ালে, আমরা একটি অনুক্রমিক পুনরুদ্ধার মডেল তৈরি করতে যাচ্ছি। অনুক্রমিক সুপারিশ হল একটি জনপ্রিয় মডেল যা ব্যবহারকারীরা পূর্বে যে আইটেমগুলির সাথে ইন্টারঅ্যাক্ট করেছে সেগুলির একটি ক্রম দেখে এবং তারপর পরবর্তী আইটেমটির পূর্বাভাস দেয়৷ এখানে প্রতিটি অনুক্রমের মধ্যে আইটেমগুলির ক্রম গুরুত্বপূর্ণ, তাই আমরা অনুক্রমিক সম্পর্কের মডেল করার জন্য একটি পুনরাবৃত্ত নিউরাল নেটওয়ার্ক ব্যবহার করতে যাচ্ছি। অধিক বিবরণের জন্য, এই পড়ুন দয়া GRU4Rec কাগজ

আমদানি

প্রথমে আমাদের নির্ভরতা এবং আমদানির পথ থেকে বেরিয়ে আসা যাক।

pip install -q tensorflow-recommenders
pip install -q --upgrade tensorflow-datasets
import os
import pprint
import tempfile

from typing import Dict, Text

import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_recommenders as tfrs

ডেটাসেট প্রস্তুত করা হচ্ছে

এর পরে, আমাদের ডেটাসেট প্রস্তুত করতে হবে। আমরা লিভারেজ করতে যাচ্ছি উপাত্ত উৎপাদনের ইউটিলিটি এই TensorFlow লাইট অন ডিভাইস সুপারিশ রেফারেন্স অ্যাপ্লিকেশান

এবং movies.dat (কলাম: MovieID, শিরোনাম, জেনার): MovieLens 1M তথ্য ratings.dat (আইডি, MovieID, রেটিং, টাইমস্ট্যাম্প কলাম) রয়েছে। উদাহরণ জেনারেশন স্ক্রিপ্ট 1M ডেটাসেট ডাউনলোড করে, উভয় ফাইল নেয়, শুধুমাত্র 2 এর থেকে বেশি রেটিং রাখে, ব্যবহারকারীর মুভি ইন্টারঅ্যাকশন টাইমলাইন তৈরি করে, লেবেল হিসাবে নমুনা ক্রিয়াকলাপ এবং ভবিষ্যদ্বাণীর প্রেক্ষাপট হিসাবে 10টি পূর্ববর্তী ব্যবহারকারীর কার্যকলাপ।

wget -nc https://raw.githubusercontent.com/tensorflow/examples/master/lite/examples/recommendation/ml/data/example_generation_movielens.py
python -m example_generation_movielens  --data_dir=data/raw  --output_dir=data/examples  --min_timeline_length=3  --max_context_length=10  --max_context_movie_genre_length=10  --min_rating=2  --train_data_fraction=0.9  --build_vocabs=False
--2021-12-02 12:10:29--  https://raw.githubusercontent.com/tensorflow/examples/master/lite/examples/recommendation/ml/data/example_generation_movielens.py
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.110.133, 185.199.111.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18040 (18K) [text/plain]
Saving to: ‘example_generation_movielens.py’

example_generation_ 100%[===================>]  17.62K  --.-KB/s    in 0s      

2021-12-02 12:10:29 (107 MB/s) - ‘example_generation_movielens.py’ saved [18040/18040]

I1202 12:10:32.036267 140629273970496 example_generation_movielens.py:460] Downloading and extracting data.
Downloading data from http://files.grouplens.org/datasets/movielens/ml-1m.zip
5922816/5917549 [==============================] - 1s 0us/step
5931008/5917549 [==============================] - 1s 0us/step
I1202 12:10:33.549675 140629273970496 example_generation_movielens.py:406] Reading data to dataframes.
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/pandas/util/_decorators.py:311: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
  return func(*args, **kwargs)
I1202 12:10:37.734699 140629273970496 example_generation_movielens.py:408] Generating movie rating user timelines.
I1202 12:10:40.836473 140629273970496 example_generation_movielens.py:410] Generating train and test examples.
6040/6040 [==============================] - 76s 13ms/step
I1202 12:11:57.162662 140629273970496 example_generation_movielens.py:421] Writing generated training examples.
844195/844195 [==============================] - 14s 17us/step
I1202 12:12:11.266682 140629273970496 example_generation_movielens.py:424] Writing generated testing examples.
93799/93799 [==============================] - 2s 17us/step
I1202 12:12:22.758407 140629273970496 example_generation_movielens.py:473] Generated dataset: {'train_size': 844195, 'test_size': 93799, 'train_file': 'data/examples/train_movielens_1m.tfrecord', 'test_file': 'data/examples/test_movielens_1m.tfrecord'}

এখানে তৈরি করা ডেটাসেটের একটি নমুনা রয়েছে।

0 : {
  features: {
    feature: {
      key  : "context_movie_id"
      value: { int64_list: { value: [ 1124, 2240, 3251, ..., 1268 ] } }
    }
    feature: {
      key  : "context_movie_rating"
      value: { float_list: {value: [ 3.0, 3.0, 4.0, ..., 3.0 ] } }
    }
    feature: {
      key  : "context_movie_year"
      value: { int64_list: { value: [ 1981, 1980, 1985, ..., 1990 ] } }
    }
    feature: {
      key  : "context_movie_genre"
      value: { bytes_list: { value: [ "Drama", "Drama", "Mystery", ..., "UNK" ] } }
    }
    feature: {
      key  : "label_movie_id"
      value: { int64_list: { value: [ 3252 ] }  }
    }
  }
}

আপনি দেখতে পাচ্ছেন যে এতে প্রসঙ্গ মুভি আইডিগুলির একটি ক্রম, এবং একটি লেবেল মুভি আইডি (পরবর্তী মুভি), পাশাপাশি চলচ্চিত্রের বছর, রেটিং এবং জেনারের মতো প্রসঙ্গ বৈশিষ্ট্যগুলি অন্তর্ভুক্ত রয়েছে৷

আমাদের ক্ষেত্রে আমরা শুধুমাত্র প্রসঙ্গ মুভি আইডি এবং লেবেল মুভি আইডির ক্রম ব্যবহার করব। পাঠাতে পারেন করার লিভারেজিং প্রসঙ্গ টিউটোরিয়াল অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে অতিরিক্ত প্রসঙ্গ বৈশিষ্ট্য যোগ সম্পর্কে আরো জানতে।

train_filename = "./data/examples/train_movielens_1m.tfrecord"
train = tf.data.TFRecordDataset(train_filename)

test_filename = "./data/examples/test_movielens_1m.tfrecord"
test = tf.data.TFRecordDataset(test_filename)

feature_description = {
    'context_movie_id': tf.io.FixedLenFeature([10], tf.int64, default_value=np.repeat(0, 10)),
    'context_movie_rating': tf.io.FixedLenFeature([10], tf.float32, default_value=np.repeat(0, 10)),
    'context_movie_year': tf.io.FixedLenFeature([10], tf.int64, default_value=np.repeat(1980, 10)),
    'context_movie_genre': tf.io.FixedLenFeature([10], tf.string, default_value=np.repeat("Drama", 10)),
    'label_movie_id': tf.io.FixedLenFeature([1], tf.int64, default_value=0),
}

def _parse_function(example_proto):
  return tf.io.parse_single_example(example_proto, feature_description)

train_ds = train.map(_parse_function).map(lambda x: {
    "context_movie_id": tf.strings.as_string(x["context_movie_id"]),
    "label_movie_id": tf.strings.as_string(x["label_movie_id"])
})

test_ds = test.map(_parse_function).map(lambda x: {
    "context_movie_id": tf.strings.as_string(x["context_movie_id"]),
    "label_movie_id": tf.strings.as_string(x["label_movie_id"])
})

for x in train_ds.take(1).as_numpy_iterator():
  pprint.pprint(x)
{'context_movie_id': array([b'2589', b'202', b'1038', b'1767', b'951', b'129', b'1256', b'955',
       b'3097', b'3462'], dtype=object),
 'label_movie_id': array([b'3629'], dtype=object)}

এখন আমাদের ট্রেন/পরীক্ষার ডেটাসেটে ঐতিহাসিক মুভি আইডিগুলির একটি ক্রম এবং পরবর্তী মুভি আইডির একটি লেবেল অন্তর্ভুক্ত রয়েছে৷ মনে রাখবেন আমরা ব্যবহার [10] যেমন প্রসঙ্গের দৈর্ঘ্য উদাহরণ generateion ধাপে অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে tf.Example পার্সিং সময় বৈশিষ্ট্য আকৃতি কারণ আমরা 10 উল্লেখ করেন।

আমরা মডেল তৈরি শুরু করার আগে আমাদের আরও একটি জিনিস দরকার - আমাদের চলচ্চিত্র আইডিগুলির জন্য শব্দভাণ্ডার৷

movies = tfds.load("movielens/1m-movies", split='train')
movies = movies.map(lambda x: x["movie_id"])
movie_ids = movies.batch(1_000)
unique_movie_ids = np.unique(np.concatenate(list(movie_ids)))

একটি ক্রমিক মডেল বাস্তবায়ন

আমাদের মৌলিক আহরণ টিউটোরিয়াল , আমরা ব্যবহারকারীর জন্য এক প্রশ্নের সাথে টাওয়ার, এবং প্রার্থী সিনেমার জন্য প্রার্থী কাতা ব্যবহার করুন। যাইহোক, দুই টাওয়ারের স্থাপত্য সাধারণীকরণযোগ্য এবং সীমাবদ্ধ নয় জোড়া আপনিও এটা ব্যবহার আমরা লক্ষ্য করুন আইটেমটি টু আইটেমটি সুপারিশ করতে পারেন মৌলিক আহরণ টিউটোরিয়াল

এখানে আমরা এখনও দুই টাওয়ারের স্থাপত্য ব্যবহার করতে যাচ্ছি। Specificially, আমরা একটি সঙ্গে ক্যোয়ারী মিনার ব্যবহার সুরক্ষতাপূর্ণ পৌনঃপুনিক ইউনিট (GRU) স্তর ঐতিহাসিক চলচ্চিত্র ক্রম এনকোড এবং প্রার্থী সিনেমার জন্য একই প্রার্থী মিনার রাখা।

embedding_dimension = 32

query_model = tf.keras.Sequential([
    tf.keras.layers.StringLookup(
      vocabulary=unique_movie_ids, mask_token=None),
    tf.keras.layers.Embedding(len(unique_movie_ids) + 1, embedding_dimension), 
    tf.keras.layers.GRU(embedding_dimension),
])

candidate_model = tf.keras.Sequential([
  tf.keras.layers.StringLookup(
      vocabulary=unique_movie_ids, mask_token=None),
  tf.keras.layers.Embedding(len(unique_movie_ids) + 1, embedding_dimension)
])

মেট্রিক্স, টাস্ক এবং সম্পূর্ণ মডেল মৌলিক পুনরুদ্ধার মডেল অনুরূপ সংজ্ঞায়িত করা হয়.

metrics = tfrs.metrics.FactorizedTopK(
  candidates=movies.batch(128).map(candidate_model)
)

task = tfrs.tasks.Retrieval(
  metrics=metrics
)

class Model(tfrs.Model):

    def __init__(self, query_model, candidate_model):
        super().__init__()
        self._query_model = query_model
        self._candidate_model = candidate_model

        self._task = task

    def compute_loss(self, features, training=False):
        watch_history = features["context_movie_id"]
        watch_next_label = features["label_movie_id"]

        query_embedding = self._query_model(watch_history)       
        candidate_embedding = self._candidate_model(watch_next_label)

        return self._task(query_embedding, candidate_embedding, compute_metrics=not training)

মানানসই এবং মূল্যায়ন

আমরা এখন আমাদের অনুক্রমিক পুনরুদ্ধার মডেল কম্পাইল, প্রশিক্ষণ এবং মূল্যায়ন করতে পারি।

model = Model(query_model, candidate_model)
model.compile(optimizer=tf.keras.optimizers.Adagrad(learning_rate=0.1))
cached_train = train_ds.shuffle(10_000).batch(12800).cache()
cached_test = test_ds.batch(2560).cache()
model.fit(cached_train, epochs=3)
Epoch 1/3
67/67 [==============================] - 25s 291ms/step - factorized_top_k/top_1_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_5_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_10_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_50_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_100_categorical_accuracy: 0.0000e+00 - loss: 107448.4467 - regularization_loss: 0.0000e+00 - total_loss: 107448.4467
Epoch 2/3
67/67 [==============================] - 2s 25ms/step - factorized_top_k/top_1_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_5_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_10_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_50_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_100_categorical_accuracy: 0.0000e+00 - loss: 100932.0125 - regularization_loss: 0.0000e+00 - total_loss: 100932.0125
Epoch 3/3
67/67 [==============================] - 2s 25ms/step - factorized_top_k/top_1_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_5_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_10_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_50_categorical_accuracy: 0.0000e+00 - factorized_top_k/top_100_categorical_accuracy: 0.0000e+00 - loss: 99336.2015 - regularization_loss: 0.0000e+00 - total_loss: 99336.2015
<keras.callbacks.History at 0x7f0904d5b410>
model.evaluate(cached_test, return_dict=True)
37/37 [==============================] - 10s 235ms/step - factorized_top_k/top_1_categorical_accuracy: 0.0146 - factorized_top_k/top_5_categorical_accuracy: 0.0780 - factorized_top_k/top_10_categorical_accuracy: 0.1358 - factorized_top_k/top_50_categorical_accuracy: 0.3735 - factorized_top_k/top_100_categorical_accuracy: 0.5058 - loss: 15478.0652 - regularization_loss: 0.0000e+00 - total_loss: 15478.0652
{'factorized_top_k/top_1_categorical_accuracy': 0.014605699107050896,
 'factorized_top_k/top_5_categorical_accuracy': 0.07804987579584122,
 'factorized_top_k/top_10_categorical_accuracy': 0.1358330100774765,
 'factorized_top_k/top_50_categorical_accuracy': 0.3735221028327942,
 'factorized_top_k/top_100_categorical_accuracy': 0.5058262944221497,
 'loss': 9413.1240234375,
 'regularization_loss': 0,
 'total_loss': 9413.1240234375}

এটি অনুক্রমিক পুনরুদ্ধার টিউটোরিয়াল সমাপ্ত করে।