শব্দ এমবেডিং

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

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

এমবেডিং প্রজেক্টরের স্ক্রিনশট

সংখ্যা হিসাবে টেক্সট প্রতিনিধিত্ব

মেশিন লার্নিং মডেলগুলি ইনপুট হিসাবে ভেক্টর (সংখ্যার অ্যারে) গ্রহণ করে। পাঠ্যের সাথে কাজ করার সময়, আপনাকে প্রথমে যা করতে হবে তা হল মডেলে খাওয়ানোর আগে স্ট্রিংগুলিকে সংখ্যায় রূপান্তর করার (বা পাঠ্যটিকে "ভেক্টরাইজ" করার জন্য) একটি কৌশল নিয়ে আসা। এই বিভাগে, আপনি এটি করার জন্য তিনটি কৌশল দেখবেন।

এক-গরম এনকোডিং

প্রথম ধারণা হিসাবে, আপনি আপনার শব্দভান্ডারে প্রতিটি শব্দকে "এক-হট" এনকোড করতে পারেন। "বিড়াল মাদুরে বসে" বাক্যটি বিবেচনা করুন। এই বাক্যে শব্দভাণ্ডার (বা অনন্য শব্দ) হল (cat, mat, on, sat, the)। প্রতিটি শব্দের প্রতিনিধিত্ব করার জন্য, আপনি শব্দভান্ডারের সমান দৈর্ঘ্য সহ একটি শূন্য ভেক্টর তৈরি করবেন, তারপর শব্দের সাথে সামঞ্জস্যপূর্ণ সূচকে একটি রাখুন। এই পদ্ধতিটি নিম্নলিখিত চিত্রে দেখানো হয়েছে।

এক-হট এনকোডিংয়ের চিত্র

বাক্যটির এনকোডিং ধারণ করে এমন একটি ভেক্টর তৈরি করতে, আপনি প্রতিটি শব্দের জন্য এক-হট ভেক্টরকে সংযুক্ত করতে পারেন।

প্রতিটি শব্দকে একটি অনন্য সংখ্যা দিয়ে এনকোড করুন

একটি দ্বিতীয় পদ্ধতি যা আপনি চেষ্টা করতে পারেন তা হল একটি অনন্য সংখ্যা ব্যবহার করে প্রতিটি শব্দকে এনকোড করা। উপরের উদাহরণটি চালিয়ে, আপনি "বিড়াল" এর জন্য 1, "মাদুর" এর জন্য 2টি নির্ধারণ করতে পারেন এবং আরও অনেক কিছু। আপনি তারপরে [5, 1, 4, 3, 5, 2] এর মতো ঘন ভেক্টর হিসাবে "The cat sat on the mat" বাক্যটিকে এনকোড করতে পারেন। এই পদ্ধতিটি কার্যকর। একটি স্পার্স ভেক্টরের পরিবর্তে, আপনার কাছে এখন একটি ঘন রয়েছে (যেখানে সমস্ত উপাদান পূর্ণ)।

এই পদ্ধতির দুটি খারাপ দিক আছে, তবে:

  • পূর্ণসংখ্যা-এনকোডিং নির্বিচারে (এটি শব্দের মধ্যে কোনো সম্পর্ক ক্যাপচার করে না)।

  • একটি পূর্ণসংখ্যা-এনকোডিং একটি মডেলের ব্যাখ্যা করার জন্য চ্যালেঞ্জিং হতে পারে। একটি লিনিয়ার ক্লাসিফায়ার, উদাহরণস্বরূপ, প্রতিটি বৈশিষ্ট্যের জন্য একটি একক ওজন শেখে। যেহেতু কোন দুটি শব্দের মিল এবং তাদের এনকোডিংয়ের মিলের মধ্যে কোন সম্পর্ক নেই, এই বৈশিষ্ট্য-ওজন সমন্বয়টি অর্থবহ নয়।

শব্দ এমবেডিং

শব্দ এমবেডিং আমাদের একটি দক্ষ, ঘন উপস্থাপনা ব্যবহার করার একটি উপায় দেয় যেখানে একই শব্দগুলির একটি অনুরূপ এনকোডিং থাকে। গুরুত্বপূর্ণভাবে, আপনাকে এই এনকোডিংটি হাতে নির্দিষ্ট করতে হবে না। একটি এমবেডিং হল ফ্লোটিং পয়েন্ট মানের একটি ঘন ভেক্টর (ভেক্টরের দৈর্ঘ্য হল আপনার নির্দিষ্ট করা একটি প্যারামিটার)। ম্যানুয়ালি এমবেডিংয়ের জন্য মানগুলি নির্দিষ্ট করার পরিবর্তে, সেগুলি প্রশিক্ষণযোগ্য প্যারামিটার (প্রশিক্ষণের সময় মডেল দ্বারা শেখা ওজন, একইভাবে একটি মডেল একটি ঘন স্তরের জন্য ওজন শেখে)। বড় ডেটাসেটের সাথে কাজ করার সময় 1024-মাত্রা পর্যন্ত 8-ডাইমেনশনাল (ছোট ডেটাসেটের জন্য) শব্দ এমবেডিং দেখা সাধারণ। একটি উচ্চমাত্রিক এম্বেডিং শব্দের মধ্যে সূক্ষ্ম সম্পর্ক ক্যাপচার করতে পারে, তবে শিখতে আরও ডেটা লাগে।

একটি এমবেডিংয়ের চিত্র

উপরে একটি শব্দ এমবেডিংয়ের জন্য একটি চিত্র রয়েছে। প্রতিটি শব্দকে ফ্লোটিং পয়েন্ট মানের 4-মাত্রিক ভেক্টর হিসাবে উপস্থাপন করা হয়। একটি এমবেডিং ভাবার আরেকটি উপায় হল "লুকআপ টেবিল"। এই ওজনগুলি শেখার পরে, আপনি টেবিলে এটির সাথে মিলিত ঘন ভেক্টরটি সন্ধান করে প্রতিটি শব্দকে এনকোড করতে পারেন।

সেটআপ

import io
import os
import re
import shutil
import string
import tensorflow as tf

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Embedding, GlobalAveragePooling1D
from tensorflow.keras.layers import TextVectorization

IMDb ডেটাসেট ডাউনলোড করুন

আপনি টিউটোরিয়ালের মাধ্যমে বড় মুভি রিভিউ ডেটাসেট ব্যবহার করবেন। আপনি এই ডেটাসেটে একটি সেন্টিমেন্ট ক্লাসিফায়ার মডেলকে প্রশিক্ষিত করবেন এবং প্রক্রিয়ায় স্ক্র্যাচ থেকে এমবেডিং শিখবেন। স্ক্র্যাচ থেকে একটি ডেটাসেট লোড করার বিষয়ে আরও পড়তে, লোডিং পাঠ্য টিউটোরিয়ালটি দেখুন।

কেরাস ফাইল ইউটিলিটি ব্যবহার করে ডেটাসেট ডাউনলোড করুন এবং ডিরেক্টরিগুলি দেখুন।

url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"

dataset = tf.keras.utils.get_file("aclImdb_v1.tar.gz", url,
                                  untar=True, cache_dir='.',
                                  cache_subdir='')

dataset_dir = os.path.join(os.path.dirname(dataset), 'aclImdb')
os.listdir(dataset_dir)
Downloading data from https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
84131840/84125825 [==============================] - 7s 0us/step
84140032/84125825 [==============================] - 7s 0us/step
['test', 'imdb.vocab', 'imdbEr.txt', 'train', 'README']

train/ ডিরেক্টরিটি একবার দেখুন। এটিতে যথাক্রমে ইতিবাচক এবং নেতিবাচক হিসাবে লেবেলযুক্ত মুভি পর্যালোচনা সহ pos এবং neg ফোল্ডার রয়েছে। আপনি একটি বাইনারি শ্রেণীবিভাগ মডেল প্রশিক্ষণের জন্য pos এবং neg ফোল্ডার থেকে পর্যালোচনা ব্যবহার করবেন।

train_dir = os.path.join(dataset_dir, 'train')
os.listdir(train_dir)
['urls_pos.txt',
 'urls_unsup.txt',
 'urls_neg.txt',
 'pos',
 'unsup',
 'unsupBow.feat',
 'neg',
 'labeledBow.feat']

train ডিরেক্টরিতে অতিরিক্ত ফোল্ডার রয়েছে যা প্রশিক্ষণ ডেটাসেট তৈরি করার আগে সরানো উচিত।

remove_dir = os.path.join(train_dir, 'unsup')
shutil.rmtree(remove_dir)

এরপর, tf.data.Dataset ব্যবহার করে একটি tf.keras.utils.text_dataset_from_directory তৈরি করুন। আপনি এই টেক্সট ক্লাসিফিকেশন টিউটোরিয়ালে এই ইউটিলিটি ব্যবহার সম্পর্কে আরও পড়তে পারেন।

বৈধকরণের জন্য 20% এর বিভাজন সহ ট্রেন এবং বৈধকরণ ডেটাসেট উভয়ই তৈরি করতে train ডিরেক্টরি ব্যবহার করুন।

batch_size = 1024
seed = 123
train_ds = tf.keras.utils.text_dataset_from_directory(
    'aclImdb/train', batch_size=batch_size, validation_split=0.2,
    subset='training', seed=seed)
val_ds = tf.keras.utils.text_dataset_from_directory(
    'aclImdb/train', batch_size=batch_size, validation_split=0.2,
    subset='validation', seed=seed)
Found 25000 files belonging to 2 classes.
Using 20000 files for training.
Found 25000 files belonging to 2 classes.
Using 5000 files for validation.

ট্রেনের ডেটাসেট থেকে কয়েকটি মুভি রিভিউ এবং তাদের লেবেলগুলি (1: positive, 0: negative) দেখুন।

for text_batch, label_batch in train_ds.take(1):
  for i in range(5):
    print(label_batch[i].numpy(), text_batch.numpy()[i])
0 b"Oh My God! Please, for the love of all that is holy, Do Not Watch This Movie! It it 82 minutes of my life I will never get back. Sure, I could have stopped watching half way through. But I thought it might get better. It Didn't. Anyone who actually enjoyed this movie is one seriously sick and twisted individual. No wonder us Australians/New Zealanders have a terrible reputation when it comes to making movies. Everything about this movie is horrible, from the acting to the editing. I don't even normally write reviews on here, but in this case I'll make an exception. I only wish someone had of warned me before I hired this catastrophe"
1 b'This movie is SOOOO funny!!! The acting is WONDERFUL, the Ramones are sexy, the jokes are subtle, and the plot is just what every high schooler dreams of doing to his/her school. I absolutely loved the soundtrack as well as the carefully placed cynicism. If you like monty python, You will love this film. This movie is a tad bit "grease"esk (without all the annoying songs). The songs that are sung are likable; you might even find yourself singing these songs once the movie is through. This musical ranks number two in musicals to me (second next to the blues brothers). But please, do not think of it as a musical per say; seeing as how the songs are so likable, it is hard to tell a carefully choreographed scene is taking place. I think of this movie as more of a comedy with undertones of romance. You will be reminded of what it was like to be a rebellious teenager; needless to say, you will be reminiscing of your old high school days after seeing this film. Highly recommended for both the family (since it is a very youthful but also for adults since there are many jokes that are funnier with age and experience.'
0 b"Alex D. Linz replaces Macaulay Culkin as the central figure in the third movie in the Home Alone empire. Four industrial spies acquire a missile guidance system computer chip and smuggle it through an airport inside a remote controlled toy car. Because of baggage confusion, grouchy Mrs. Hess (Marian Seldes) gets the car. She gives it to her neighbor, Alex (Linz), just before the spies turn up. The spies rent a house in order to burglarize each house in the neighborhood until they locate the car. Home alone with the chicken pox, Alex calls 911 each time he spots a theft in progress, but the spies always manage to elude the police while Alex is accused of making prank calls. The spies finally turn their attentions toward Alex, unaware that he has rigged devices to cleverly booby-trap his entire house. Home Alone 3 wasn't horrible, but probably shouldn't have been made, you can't just replace Macauley Culkin, Joe Pesci, or Daniel Stern. Home Alone 3 had some funny parts, but I don't like when characters are changed in a movie series, view at own risk."
0 b"There's a good movie lurking here, but this isn't it. The basic idea is good: to explore the moral issues that would face a group of young survivors of the apocalypse. But the logic is so muddled that it's impossible to get involved.<br /><br />For example, our four heroes are (understandably) paranoid about catching the mysterious airborne contagion that's wiped out virtually all of mankind. Yet they wear surgical masks some times, not others. Some times they're fanatical about wiping down with bleach any area touched by an infected person. Other times, they seem completely unconcerned.<br /><br />Worse, after apparently surviving some weeks or months in this new kill-or-be-killed world, these people constantly behave like total newbs. They don't bother accumulating proper equipment, or food. They're forever running out of fuel in the middle of nowhere. They don't take elementary precautions when meeting strangers. And after wading through the rotting corpses of the entire human race, they're as squeamish as sheltered debutantes. You have to constantly wonder how they could have survived this long... and even if they did, why anyone would want to make a movie about them.<br /><br />So when these dweebs stop to agonize over the moral dimensions of their actions, it's impossible to take their soul-searching seriously. Their actions would first have to make some kind of minimal sense.<br /><br />On top of all this, we must contend with the dubious acting abilities of Chris Pine. His portrayal of an arrogant young James T Kirk might have seemed shrewd, when viewed in isolation. But in Carriers he plays on exactly that same note: arrogant and boneheaded. It's impossible not to suspect that this constitutes his entire dramatic range.<br /><br />On the positive side, the film *looks* excellent. It's got an over-sharp, saturated look that really suits the southwestern US locale. But that can't save the truly feeble writing nor the paper-thin (and annoying) characters. Even if you're a fan of the end-of-the-world genre, you should save yourself the agony of watching Carriers."
0 b'I saw this movie at an actual movie theater (probably the \\(2.00 one) with my cousin and uncle. We were around 11 and 12, I guess, and really into scary movies. I remember being so excited to see it because my cool uncle let us pick the movie (and we probably never got to do that again!) and sooo disappointed afterwards!! Just boring and not scary. The only redeeming thing I can remember was Corky Pigeon from Silver Spoons, and that wasn\'t all that great, just someone I recognized. I\'ve seen bad movies before and this one has always stuck out in my mind as the worst. This was from what I can recall, one of the most boring, non-scary, waste of our collective \\)6, and a waste of film. I have read some of the reviews that say it is worth a watch and I say, "Too each his own", but I wouldn\'t even bother. Not even so bad it\'s good.'

কর্মক্ষমতা জন্য ডেটাসেট কনফিগার করুন

I/O যাতে ব্লক হয়ে না যায় তা নিশ্চিত করতে ডেটা লোড করার সময় এই দুটি গুরুত্বপূর্ণ পদ্ধতি ব্যবহার করা উচিত।

.cache() ডিস্ক লোড হওয়ার পরে মেমরিতে ডেটা রাখে। এটি নিশ্চিত করবে যে ডেটাসেটটি আপনার মডেলকে প্রশিক্ষণ দেওয়ার সময় বাধা হয়ে দাঁড়ায় না। যদি আপনার ডেটাসেটটি মেমরিতে মাপসই করার জন্য খুব বড় হয়, তবে আপনি একটি পারফরম্যান্ট অন-ডিস্ক ক্যাশে তৈরি করতে এই পদ্ধতিটি ব্যবহার করতে পারেন, যা অনেকগুলি ছোট ফাইলের চেয়ে পড়ার জন্য আরও দক্ষ।

প্রশিক্ষণের সময় .prefetch() ডেটা প্রিপ্রসেসিং এবং মডেল এক্সিকিউশনকে ওভারল্যাপ করে।

আপনি উভয় পদ্ধতি সম্পর্কে আরও শিখতে পারেন, সেইসাথে ডেটা পারফরম্যান্স গাইডে কীভাবে ডিস্কে ডেটা ক্যাশে করতে হয়।

AUTOTUNE = tf.data.AUTOTUNE

train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

এমবেডিং লেয়ার ব্যবহার করে

কেরাস শব্দ এমবেডিং ব্যবহার করা সহজ করে তোলে। এমবেডিং স্তরটি একবার দেখুন।

এমবেডিং স্তরটি একটি লুকআপ টেবিল হিসাবে বোঝা যেতে পারে যা পূর্ণসংখ্যা সূচক (যা নির্দিষ্ট শব্দের জন্য দাঁড়ায়) থেকে ঘন ভেক্টর (তাদের এমবেডিং) পর্যন্ত মানচিত্র করে। এম্বেডিংয়ের মাত্রা (বা প্রস্থ) হল একটি প্যারামিটার যা আপনি আপনার সমস্যার জন্য ভাল কাজ করে তা দেখতে পরীক্ষা করতে পারেন, অনেকটা একইভাবে আপনি একটি ঘন স্তরে নিউরনের সংখ্যা নিয়ে পরীক্ষা করবেন।

# Embed a 1,000 word vocabulary into 5 dimensions.
embedding_layer = tf.keras.layers.Embedding(1000, 5)

আপনি যখন একটি এম্বেডিং স্তর তৈরি করেন, তখন এম্বেডিংয়ের ওজনগুলি এলোমেলোভাবে শুরু হয় (ঠিক অন্য কোনও স্তরের মতো)। প্রশিক্ষণের সময়, তারা ধীরে ধীরে ব্যাকপ্রপাগেশনের মাধ্যমে সমন্বয় করা হয়। একবার প্রশিক্ষিত হলে, শেখা শব্দ এমবেডিংগুলি মোটামুটিভাবে শব্দগুলির মধ্যে মিল এনকোড করবে (যেমন সেগুলি নির্দিষ্ট সমস্যার জন্য আপনার মডেলকে প্রশিক্ষণ দেওয়া হয়েছে)।

আপনি যদি একটি এম্বেডিং স্তরে একটি পূর্ণসংখ্যা পাস করেন, ফলাফলটি এমবেডিং টেবিল থেকে প্রতিটি পূর্ণসংখ্যাকে ভেক্টর দিয়ে প্রতিস্থাপন করে:

result = embedding_layer(tf.constant([1, 2, 3]))
result.numpy()
array([[ 0.01318491, -0.02219239,  0.024673  , -0.03208025,  0.02297195],
       [-0.00726584,  0.03731754, -0.01209557, -0.03887399, -0.02407478],
       [ 0.04477594,  0.04504738, -0.02220147, -0.03642888, -0.04688282]],
      dtype=float32)

টেক্সট বা সিকোয়েন্স সমস্যার জন্য, এমবেডিং লেয়ারটি পূর্ণসংখ্যার একটি 2D টেনসর নেয়, আকৃতির (samples, sequence_length) , যেখানে প্রতিটি এন্ট্রি পূর্ণসংখ্যার একটি ক্রম। এটি পরিবর্তনশীল দৈর্ঘ্যের ক্রম এম্বেড করতে পারে। আপনি আকার (32, 10) (দৈর্ঘ্য 10 এর 32টি অনুক্রমের ব্যাচ) বা (64, 15) (দৈর্ঘ্য 15 এর 64টি অনুক্রমের ব্যাচ) সহ ব্যাচগুলির উপরে এমবেডিং স্তরে ফিড করতে পারেন।

প্রত্যাবর্তিত টেনসরের ইনপুটের চেয়ে আরও একটি অক্ষ রয়েছে, এমবেডিং ভেক্টরগুলি নতুন শেষ অক্ষ বরাবর সারিবদ্ধ করা হয়েছে। এটিকে একটি (2, 3) ইনপুট ব্যাচ পাস করুন এবং আউটপুট হল (2, 3, N)

result = embedding_layer(tf.constant([[0, 1, 2], [3, 4, 5]]))
result.shape
TensorShape([2, 3, 5])

ইনপুট হিসাবে ক্রমগুলির একটি ব্যাচ দেওয়া হলে, একটি এমবেডিং স্তর একটি 3D ফ্লোটিং পয়েন্ট টেনসর, আকৃতির (samples, sequence_length, embedding_dimensionality) প্রদান করে। পরিবর্তনশীল দৈর্ঘ্যের এই ক্রম থেকে একটি স্থির উপস্থাপনায় রূপান্তর করার জন্য বিভিন্ন ধরণের আদর্শ পদ্ধতি রয়েছে। আপনি একটি ঘন স্তরে পাস করার আগে একটি RNN, মনোযোগ, বা পুলিং স্তর ব্যবহার করতে পারেন। এই টিউটোরিয়ালটি পুলিং ব্যবহার করে কারণ এটি সবচেয়ে সহজ। একটি RNN টিউটোরিয়াল সহ পাঠ্য শ্রেণিবিন্যাস একটি ভাল পরবর্তী পদক্ষেপ।

টেক্সট প্রিপ্রসেসিং

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

# Create a custom standardization function to strip HTML break tags '<br />'.
def custom_standardization(input_data):
  lowercase = tf.strings.lower(input_data)
  stripped_html = tf.strings.regex_replace(lowercase, '<br />', ' ')
  return tf.strings.regex_replace(stripped_html,
                                  '[%s]' % re.escape(string.punctuation), '')


# Vocabulary size and number of words in a sequence.
vocab_size = 10000
sequence_length = 100

# Use the text vectorization layer to normalize, split, and map strings to
# integers. Note that the layer uses the custom standardization defined above.
# Set maximum_sequence length as all samples are not of the same length.
vectorize_layer = TextVectorization(
    standardize=custom_standardization,
    max_tokens=vocab_size,
    output_mode='int',
    output_sequence_length=sequence_length)

# Make a text-only dataset (no labels) and call adapt to build the vocabulary.
text_ds = train_ds.map(lambda x, y: x)
vectorize_layer.adapt(text_ds)

একটি শ্রেণীবিভাগ মডেল তৈরি করুন

সেন্টিমেন্ট ক্লাসিফিকেশন মডেল সংজ্ঞায়িত করতে কেরাস সিকোয়েন্সিয়াল API ব্যবহার করুন। এই ক্ষেত্রে এটি একটি "কন্টিনিউয়াস ব্যাগ অফ শব্দ" শৈলী মডেল।

  • TextVectorization স্তর স্ট্রিংগুলিকে শব্দভান্ডার সূচকে রূপান্তরিত করে। আপনি ইতিমধ্যেই একটি vectorize_layer স্তর হিসাবে vectorize_layer শুরু করেছেন এবং adapttext_ds কল করে এর শব্দভাণ্ডার তৈরি করেছেন। এখন vectorize_layer আপনার এন্ড-টু-এন্ড ক্লাসিফিকেশন মডেলের প্রথম স্তর হিসাবে ব্যবহার করা যেতে পারে, রূপান্তরিত স্ট্রিংগুলিকে এমবেডিং স্তরে খাওয়ানো।
  • Embedding স্তরটি পূর্ণসংখ্যা-এনকোড করা শব্দভাণ্ডার নেয় এবং প্রতিটি শব্দ-সূচকের জন্য এমবেডিং ভেক্টর সন্ধান করে। এই ভেক্টর মডেল ট্রেন হিসাবে শেখা হয়. ভেক্টর আউটপুট অ্যারেতে একটি মাত্রা যোগ করে। ফলস্বরূপ মাত্রাগুলি হল: (batch, sequence, embedding)

  • GlobalAveragePooling1D স্তরটি ক্রম মাত্রার গড় করে প্রতিটি উদাহরণের জন্য একটি নির্দিষ্ট দৈর্ঘ্যের আউটপুট ভেক্টর প্রদান করে। এটি মডেলটিকে পরিবর্তনশীল দৈর্ঘ্যের ইনপুট পরিচালনা করতে দেয়, সহজতম উপায়ে।

  • স্থির-দৈর্ঘ্যের আউটপুট ভেক্টরটি 16টি লুকানো ইউনিট সহ একটি সম্পূর্ণ-সংযুক্ত ( Dense ) স্তরের মাধ্যমে পাইপ করা হয়।

  • শেষ স্তরটি একটি একক আউটপুট নোডের সাথে ঘনভাবে সংযুক্ত।

embedding_dim=16

model = Sequential([
  vectorize_layer,
  Embedding(vocab_size, embedding_dim, name="embedding"),
  GlobalAveragePooling1D(),
  Dense(16, activation='relu'),
  Dense(1)
])

মডেল কম্পাইল এবং প্রশিক্ষণ

ক্ষতি এবং নির্ভুলতা সহ মেট্রিক্স কল্পনা করতে আপনি TensorBoard ব্যবহার করবেন। একটি tf.keras.callbacks.TensorBoard তৈরি করুন।

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="logs")

Adam অপ্টিমাইজার এবং BinaryCrossentropy লস ব্যবহার করে মডেলটি কম্পাইল করুন এবং প্রশিক্ষণ দিন।

model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])
model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=15,
    callbacks=[tensorboard_callback])
Epoch 1/15
20/20 [==============================] - 2s 71ms/step - loss: 0.6910 - accuracy: 0.5028 - val_loss: 0.6878 - val_accuracy: 0.4886
Epoch 2/15
20/20 [==============================] - 1s 57ms/step - loss: 0.6838 - accuracy: 0.5028 - val_loss: 0.6791 - val_accuracy: 0.4886
Epoch 3/15
20/20 [==============================] - 1s 58ms/step - loss: 0.6726 - accuracy: 0.5028 - val_loss: 0.6661 - val_accuracy: 0.4886
Epoch 4/15
20/20 [==============================] - 1s 58ms/step - loss: 0.6563 - accuracy: 0.5028 - val_loss: 0.6481 - val_accuracy: 0.4886
Epoch 5/15
20/20 [==============================] - 1s 58ms/step - loss: 0.6343 - accuracy: 0.5061 - val_loss: 0.6251 - val_accuracy: 0.5066
Epoch 6/15
20/20 [==============================] - 1s 58ms/step - loss: 0.6068 - accuracy: 0.5634 - val_loss: 0.5982 - val_accuracy: 0.5762
Epoch 7/15
20/20 [==============================] - 1s 58ms/step - loss: 0.5752 - accuracy: 0.6405 - val_loss: 0.5690 - val_accuracy: 0.6386
Epoch 8/15
20/20 [==============================] - 1s 58ms/step - loss: 0.5412 - accuracy: 0.7036 - val_loss: 0.5390 - val_accuracy: 0.6850
Epoch 9/15
20/20 [==============================] - 1s 59ms/step - loss: 0.5064 - accuracy: 0.7479 - val_loss: 0.5106 - val_accuracy: 0.7222
Epoch 10/15
20/20 [==============================] - 1s 59ms/step - loss: 0.4734 - accuracy: 0.7774 - val_loss: 0.4855 - val_accuracy: 0.7430
Epoch 11/15
20/20 [==============================] - 1s 59ms/step - loss: 0.4432 - accuracy: 0.7971 - val_loss: 0.4636 - val_accuracy: 0.7570
Epoch 12/15
20/20 [==============================] - 1s 58ms/step - loss: 0.4161 - accuracy: 0.8155 - val_loss: 0.4453 - val_accuracy: 0.7674
Epoch 13/15
20/20 [==============================] - 1s 59ms/step - loss: 0.3921 - accuracy: 0.8304 - val_loss: 0.4303 - val_accuracy: 0.7780
Epoch 14/15
20/20 [==============================] - 1s 61ms/step - loss: 0.3711 - accuracy: 0.8398 - val_loss: 0.4181 - val_accuracy: 0.7884
Epoch 15/15
20/20 [==============================] - 1s 58ms/step - loss: 0.3524 - accuracy: 0.8493 - val_loss: 0.4082 - val_accuracy: 0.7948
<keras.callbacks.History at 0x7fca579745d0>

এই পদ্ধতির সাথে মডেলটি প্রায় 78% এর বৈধতা নির্ভুলতায় পৌঁছেছে (উল্লেখ্য যে প্রশিক্ষণের নির্ভুলতা বেশি হওয়ায় মডেলটি ওভারফিটিং)।

আপনি মডেলের প্রতিটি স্তর সম্পর্কে আরও জানতে মডেল সারাংশ দেখতে পারেন।

model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 text_vectorization (TextVec  (None, 100)              0         
 torization)                                                     
                                                                 
 embedding (Embedding)       (None, 100, 16)           160000    
                                                                 
 global_average_pooling1d (G  (None, 16)               0         
 lobalAveragePooling1D)                                          
                                                                 
 dense (Dense)               (None, 16)                272       
                                                                 
 dense_1 (Dense)             (None, 1)                 17        
                                                                 
=================================================================
Total params: 160,289
Trainable params: 160,289
Non-trainable params: 0
_________________________________________________________________

TensorBoard-এ মডেল মেট্রিক্স ভিজ্যুয়ালাইজ করুন।

#docs_infra: no_execute
%load_ext tensorboard
%tensorboard --logdir logs

embeddings_classifier_accuracy.png

প্রশিক্ষিত শব্দ এমবেডিং পুনরুদ্ধার করুন এবং ডিস্কে সংরক্ষণ করুন

এর পরে, প্রশিক্ষণের সময় শেখা এম্বেডিং শব্দটি পুনরুদ্ধার করুন। এমবেডিংগুলি হল মডেলের এমবেডিং স্তরের ওজন। ওজন ম্যাট্রিক্স আকৃতির (vocab_size, embedding_dimension)

get_layer() এবং get_weights() ) ব্যবহার করে মডেল থেকে ওজন প্রাপ্ত করুন। get_vocabulary() ফাংশন প্রতি লাইনে একটি টোকেন সহ একটি মেটাডেটা ফাইল তৈরি করতে শব্দভান্ডার প্রদান করে।

weights = model.get_layer('embedding').get_weights()[0]
vocab = vectorize_layer.get_vocabulary()

ডিস্কে ওজন লিখুন। এমবেডিং প্রজেক্টর ব্যবহার করার জন্য, আপনি দুটি ফাইল ট্যাব আলাদা বিন্যাসে আপলোড করবেন: ভেক্টরের একটি ফাইল (এম্বেডিং ধারণকারী), এবং মেটা ডেটার একটি ফাইল (শব্দগুলি ধারণকারী)।

out_v = io.open('vectors.tsv', 'w', encoding='utf-8')
out_m = io.open('metadata.tsv', 'w', encoding='utf-8')

for index, word in enumerate(vocab):
  if index == 0:
    continue  # skip 0, it's padding.
  vec = weights[index]
  out_v.write('\t'.join([str(x) for x in vec]) + "\n")
  out_m.write(word + "\n")
out_v.close()
out_m.close()

আপনি যদি Colaboratory- তে এই টিউটোরিয়ালটি চালাচ্ছেন, তাহলে আপনি এই ফাইলগুলিকে আপনার স্থানীয় মেশিনে ডাউনলোড করতে নিম্নলিখিত স্নিপেটটি ব্যবহার করতে পারেন (বা ফাইল ব্রাউজার ব্যবহার করুন, দেখুন -> বিষয়বস্তুর সারণী -> ফাইল ব্রাউজার )।

try:
  from google.colab import files
  files.download('vectors.tsv')
  files.download('metadata.tsv')
except Exception:
  pass

এমবেডিংগুলিকে কল্পনা করুন৷

এমবেডিংগুলিকে কল্পনা করতে, এম্বেডিং প্রজেক্টরে আপলোড করুন৷

এমবেডিং প্রজেক্টর খুলুন (এটি স্থানীয় টেনসরবোর্ডের উদাহরণেও চলতে পারে)।

  • "লোড ডেটা" এ ক্লিক করুন।

  • আপনি উপরে যে দুটি ফাইল তৈরি করেছেন তা আপলোড করুন: vecs.tsv এবং meta.tsv

আপনার প্রশিক্ষণ দেওয়া এমবেডিংগুলি এখন প্রদর্শিত হবে৷ আপনি তাদের নিকটতম প্রতিবেশীদের খুঁজে পেতে শব্দ অনুসন্ধান করতে পারেন। উদাহরণস্বরূপ, "সুন্দর" অনুসন্ধান করার চেষ্টা করুন। আপনি "বিস্ময়কর" মত প্রতিবেশীদের দেখতে পারেন.

পরবর্তী পদক্ষেপ

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