This page was translated by the Cloud Translation API.
Switch to English

বেসিক পাঠ্য শ্রেণিবদ্ধকরণ

টেনসরফ্লো.আর.জে দেখুন গুগল কোলাবে চালান গিটহাবের উত্স দেখুন নোটবুক ডাউনলোড করুন

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

 import matplotlib.pyplot as plt
import os
import re
import shutil
import string
import tensorflow as tf

from tensorflow.keras import layers
from tensorflow.keras import losses
from tensorflow.keras import preprocessing
from tensorflow.keras.layers.experimental.preprocessing import TextVectorization
 
 print(tf.__version__)
 
2.3.0

অনুভূতির বিশ্লেষণ

এই নোটবুকটি পর্যালোচনার পাঠ্যের উপর ভিত্তি করে সিনেমার পর্যালোচনাগুলিকে ধনাত্মক বা নেতিবাচক হিসাবে শ্রেণিবদ্ধ করতে একটি সংবেদন বিশ্লেষণ মডেলকে প্রশিক্ষণ দেয়। এটি বাইনারি -দ্বি-শ্রেণির — শ্রেণিবিন্যাসের একটি উদাহরণ, একটি গুরুত্বপূর্ণ এবং ব্যাপকভাবে প্রয়োগযোগ্য ধরণের মেশিন লার্নিং সমস্যা।

আপনি বড় মুভি রিভিউ ডেটাসেট ব্যবহার করবেন যাতে ইন্টারনেট মুভি ডাটাবেস থেকে 50,000 চলচ্চিত্রের পর্যালোচনার পাঠ্য রয়েছে। এগুলি প্রশিক্ষণের জন্য 25,000 পর্যালোচনা এবং পরীক্ষার জন্য 25,000 পর্যালোচনাগুলিতে বিভক্ত। প্রশিক্ষণ এবং পরীক্ষার সেটগুলি ভারসাম্যযুক্ত , যার মধ্যে তারা সমান সংখ্যক ইতিবাচক এবং নেতিবাচক পর্যালোচনা ধারণ করে।

আইএমডিবি ডেটাসেটটি ডাউনলোড এবং অন্বেষণ করুন

আসুন ডাউনলোড করুন এবং ডেটাসেটটি এক্সট্রাক্ট করুন, তারপরে ডিরেক্টরি কাঠামোটি অনুসন্ধান করুন।

 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')
 
Downloading data from https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
84131840/84125825 [==============================] - 7s 0us/step

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

aclImdb/train/pos aclImdb/train/neg এবং aclImdb/train/neg ডিরেক্টরিতে অনেকগুলি পাঠ্য ফাইল থাকে, যার প্রতিটিই একক সিনেমার পর্যালোচনা। আসুন সেগুলির মধ্যে একটির দিকে একবার নজর দিন।

 sample_file = os.path.join(train_dir, 'pos/1181_9.txt')
with open(sample_file) as f:
  print(f.read())
 
Rachel Griffiths writes and directs this award winning short film. A heartwarming story about coping with grief and cherishing the memory of those we've loved and lost. Although, only 15 minutes long, Griffiths manages to capture so much emotion and truth onto film in the short space of time. Bud Tingwell gives a touching performance as Will, a widower struggling to cope with his wife's death. Will is confronted by the harsh reality of loneliness and helplessness as he proceeds to take care of Ruth's pet cow, Tulip. The film displays the grief and responsibility one feels for those they have loved and lost. Good cinematography, great direction, and superbly acted. It will bring tears to all those who have lost a loved one, and survived.

ডেটাसेट লোড করুন

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

 main_directory/
...class_a/
......a_text_1.txt
......a_text_2.txt
...class_b/
......b_text_1.txt
......b_text_2.txt
 

বাইনারি শ্রেণিবদ্ধকরণের জন্য একটি ডেটাসেট প্রস্তুত করতে আপনার class_a এবং class_b class_a ডিস্কে দুটি ফোল্ডার class_b । এগুলি ইতিবাচক এবং নেতিবাচক চলচ্চিত্রের পর্যালোচনাগুলি হবে, যা aclImdb/train/pos এবং aclImdb/train/neg aclImdb/train/pos পাওয়া যাবে। যেমন আইএমডিবি ডেটাসেটে অতিরিক্ত ফোল্ডার রয়েছে, আপনি এই ইউটিলিটিটি ব্যবহার করার আগে সেগুলি সরিয়ে ফেলবেন।

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

এরপরে, আপনি লেবেলযুক্ত tf.data.Dataset তৈরি করতে text_dataset_from_directory ইউটিলিটিটি ব্যবহার tf.data.Datasettf.data ডেটা নিয়ে কাজ করার জন্য সরঞ্জামগুলির একটি শক্তিশালী সংগ্রহ।

মেশিন লার্নিং পরীক্ষা চালানোর সময়, আপনার ডেটাসেটকে তিনটি ভাগে বিভক্ত করা সর্বোত্তম অনুশীলন: ট্রেন , বৈধতা এবং পরীক্ষা

আইএমডিবি ডেটাসেটটি ইতিমধ্যে ট্রেন এবং পরীক্ষায় বিভক্ত হয়েছে, তবে এটিতে একটি বৈধতা সেট নেই। নীচে validation_split যুক্তি ব্যবহার করে প্রশিক্ষণের ডেটা বিভক্ত করে একটি 80:20 ব্যবহার করে একটি বৈধতা সেট তৈরি করি।

 batch_size = 32
seed = 42

raw_train_ds = tf.keras.preprocessing.text_dataset_from_directory(
    'aclImdb/train', 
    batch_size=batch_size, 
    validation_split=0.2, 
    subset='training', 
    seed=seed)
 
Found 25000 files belonging to 2 classes.
Using 20000 files for training.

আপনি উপরে দেখতে পারেন, প্রশিক্ষণ ফোল্ডারে 25,000 উদাহরণ রয়েছে, যার মধ্যে আপনি প্রশিক্ষণের জন্য 80% (বা 20,000) ব্যবহার করবেন। আপনি যেমন একটি মুহুর্তে দেখতে পাবেন, আপনি সরাসরি model.fit একটি ডেটাসেট পাস করে একটি মডেলকে প্রশিক্ষণ দিতে পারেন। আপনি যদি tf.data নতুন হন tf.data আপনি ডেটাসেটের মাধ্যমে পুনরাবৃত্তি করতে পারেন এবং নীচে কয়েকটি উদাহরণ মুদ্রণ করতে পারেন।

 for text_batch, label_batch in raw_train_ds.take(1):
  for i in range(3):
    print("Review", text_batch.numpy()[i])
    print("Label", label_batch.numpy()[i])
 
Review b'"Pandemonium" is a horror movie spoof that comes off more stupid than funny. Believe me when I tell you, I love comedies. Especially comedy spoofs. "Airplane", "The Naked Gun" trilogy, "Blazing Saddles", "High Anxiety", and "Spaceballs" are some of my favorite comedies that spoof a particular genre. "Pandemonium" is not up there with those films. Most of the scenes in this movie had me sitting there in stunned silence because the movie wasn\'t all that funny. There are a few laughs in the film, but when you watch a comedy, you expect to laugh a lot more than a few times and that\'s all this film has going for it. Geez, "Scream" had more laughs than this film and that was more of a horror film. How bizarre is that?<br /><br />*1/2 (out of four)'
Label 0
Review b"David Mamet is a very interesting and a very un-equal director. His first movie 'House of Games' was the one I liked best, and it set a series of films with characters whose perspective of life changes as they get into complicated situations, and so does the perspective of the viewer.<br /><br />So is 'Homicide' which from the title tries to set the mind of the viewer to the usual crime drama. The principal characters are two cops, one Jewish and one Irish who deal with a racially charged area. The murder of an old Jewish shop owner who proves to be an ancient veteran of the Israeli Independence war triggers the Jewish identity in the mind and heart of the Jewish detective.<br /><br />This is were the flaws of the film are the more obvious. The process of awakening is theatrical and hard to believe, the group of Jewish militants is operatic, and the way the detective eventually walks to the final violent confrontation is pathetic. The end of the film itself is Mamet-like smart, but disappoints from a human emotional perspective.<br /><br />Joe Mantegna and William Macy give strong performances, but the flaws of the story are too evident to be easily compensated."
Label 0
Review b'Great documentary about the lives of NY firefighters during the worst terrorist attack of all time.. That reason alone is why this should be a must see collectors item.. What shocked me was not only the attacks, but the"High Fat Diet" and physical appearance of some of these firefighters. I think a lot of Doctors would agree with me that,in the physical shape they were in, some of these firefighters would NOT of made it to the 79th floor carrying over 60 lbs of gear. Having said that i now have a greater respect for firefighters and i realize becoming a firefighter is a life altering job. The French have a history of making great documentary\'s and that is what this is, a Great Documentary.....'
Label 1

পর্যালোচনাগুলিতে কাঁচা পাঠ্য রয়েছে তা লক্ষ্য করুন (বিরামচিহ্ন এবং মাঝে মাঝে এইচটিএমএল ট্যাগগুলির সাথে <br/> । নিম্নলিখিত বিভাগে কীভাবে এগুলি পরিচালনা করবেন আপনি তা প্রদর্শন করবেন।

লেবেলগুলি 0 বা 1 these এর মধ্যে কোনটি ইতিবাচক এবং নেতিবাচক চলচ্চিত্রের পর্যালোচনার সাথে মিলে যায় তা দেখতে আপনি class_names যাচাই করতে পারেন।

 print("Label 0 corresponds to", raw_train_ds.class_names[0])
print("Label 1 corresponds to", raw_train_ds.class_names[1])
 
Label 0 corresponds to neg
Label 1 corresponds to pos

এরপরে, আপনি একটি বৈধতা এবং পরীক্ষা ডেটাসেট তৈরি করবেন। বৈধতার জন্য আপনি প্রশিক্ষণ সেট থেকে বাকি 5,000 টি পর্যালোচনা ব্যবহার করবেন।

 raw_val_ds = tf.keras.preprocessing.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 5000 files for validation.

 raw_test_ds = tf.keras.preprocessing.text_dataset_from_directory(
    'aclImdb/test', 
    batch_size=batch_size)
 
Found 25000 files belonging to 2 classes.

প্রশিক্ষণের জন্য ডেটাসেট প্রস্তুত করুন

এরপরে, আপনি সহায়ক preprocessing.TextVectorization ব্যবহার করে ডেটাটিকে মানককরণ, টোকেনাইজ এবং ভেক্টরাইজ করবেন e পাঠ্যবীক্ষণকরণ স্তর।

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

আপনি উপরে যেমন দেখেছেন, পর্যালোচনাগুলিতে বিভিন্ন HTML টি ট্যাগ রয়েছে যেমন <br /> । এই ট্যাগগুলি TextVectorization লেয়ারের ডিফল্ট স্ট্যান্ডার্ডাইজার দ্বারা সরানো হবে না (যা পাঠ্যকে লোকেসে রূপান্তরিত করে এবং ডিফল্টরূপে বিরামচিহ্নগুলিকে স্ট্রিপ করে, তবে এইচটিএমএল স্ট্রিপ করে না)। আপনি এইচটিএমএল সরানোর জন্য একটি কাস্টম মানককরণ ফাংশন লিখবেন।

 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),
                                  '')
 

এরপরে, আপনি একটি TextVectorization স্তর তৈরি করবেন। আপনি আমাদের স্তরটিকে মানককরণ, টোকেনাইজ করতে এবং ভেক্টরাইজ করতে এই স্তরটি ব্যবহার করবেন। আপনি সেট output_mode করার int প্রতিটি টোকেন জন্য অনন্য পূর্ণসংখ্যা সূচকের তৈরি করুন।

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

 max_features = 10000
sequence_length = 250

vectorize_layer = TextVectorization(
    standardize=custom_standardization,
    max_tokens=max_features,
    output_mode='int',
    output_sequence_length=sequence_length)
 

এরপরে, আপনি ডেটাসেটে প্রিপ্রসেসিং লেয়ারের অবস্থার adapt জন্য কল করবেন। এর ফলে মডেলটি পূর্ণসংখ্যার সাথে স্ট্রিংয়ের একটি সূচক তৈরি করতে পারে।

 # Make a text-only dataset (without labels), then call adapt
train_text = raw_train_ds.map(lambda x, y: x)
vectorize_layer.adapt(train_text)
 

আসুন কিছু ডেটা প্রিপ্রোসেস করতে এই স্তরটি ব্যবহারের ফলাফল দেখতে একটি ফাংশন তৈরি করি।

 def vectorize_text(text, label):
  text = tf.expand_dims(text, -1)
  return vectorize_layer(text), label
 
 # retrieve a batch (of 32 reviews and labels) from the dataset
text_batch, label_batch = next(iter(raw_train_ds))
first_review, first_label = text_batch[0], label_batch[0]
print("Review", first_review)
print("Label", raw_train_ds.class_names[first_label])
print("Vectorized review", vectorize_text(first_review, first_label))
 
Review tf.Tensor(b'Silent Night, Deadly Night 5 is the very last of the series, and like part 4, it\'s unrelated to the first three except by title and the fact that it\'s a Christmas-themed horror flick.<br /><br />Except to the oblivious, there\'s some obvious things going on here...Mickey Rooney plays a toymaker named Joe Petto and his creepy son\'s name is Pino. Ring a bell, anyone? Now, a little boy named Derek heard a knock at the door one evening, and opened it to find a present on the doorstep for him. Even though it said "don\'t open till Christmas", he begins to open it anyway but is stopped by his dad, who scolds him and sends him to bed, and opens the gift himself. Inside is a little red ball that sprouts Santa arms and a head, and proceeds to kill dad. Oops, maybe he should have left well-enough alone. Of course Derek is then traumatized by the incident since he watched it from the stairs, but he doesn\'t grow up to be some killer Santa, he just stops talking.<br /><br />There\'s a mysterious stranger lurking around, who seems very interested in the toys that Joe Petto makes. We even see him buying a bunch when Derek\'s mom takes him to the store to find a gift for him to bring him out of his trauma. And what exactly is this guy doing? Well, we\'re not sure but he does seem to be taking these toys apart to see what makes them tick. He does keep his landlord from evicting him by promising him to pay him in cash the next day and presents him with a "Larry the Larvae" toy for his kid, but of course "Larry" is not a good toy and gets out of the box in the car and of course, well, things aren\'t pretty.<br /><br />Anyway, eventually what\'s going on with Joe Petto and Pino is of course revealed, and as with the old story, Pino is not a "real boy". Pino is probably even more agitated and naughty because he suffers from "Kenitalia" (a smooth plastic crotch) so that could account for his evil ways. And the identity of the lurking stranger is revealed too, and there\'s even kind of a happy ending of sorts. Whee.<br /><br />A step up from part 4, but not much of one. Again, Brian Yuzna is involved, and Screaming Mad George, so some decent special effects, but not enough to make this great. A few leftovers from part 4 are hanging around too, like Clint Howard and Neith Hunter, but that doesn\'t really make any difference. Anyway, I now have seeing the whole series out of my system. Now if I could get some of it out of my brain. 4 out of 5.', shape=(), dtype=string)
Label neg
Vectorized review (<tf.Tensor: shape=(1, 250), dtype=int64, numpy=
array([[1287,  313, 2380,  313,  661,    7,    2,   52,  229,    5,    2,
         200,    3,   38,  170,  669,   29, 5492,    6,    2,   83,  297,
         549,   32,  410,    3,    2,  186,   12,   29,    4,    1,  191,
         510,  549,    6,    2, 8229,  212,   46,  576,  175,  168,   20,
           1, 5361,  290,    4,    1,  761,  969,    1,    3,   24,  935,
        2271,  393,    7,    1, 1675,    4, 3747,  250,  148,    4,  112,
         436,  761, 3529,  548,    4, 3633,   31,    2, 1331,   28, 2096,
           3, 2912,    9,    6,  163,    4, 1006,   20,    2,    1,   15,
          85,   53,  147,    9,  292,   89,  959, 2314,  984,   27,  762,
           6,  959,    9,  564,   18,    7, 2140,   32,   24, 1254,   36,
           1,   85,    3, 3298,   85,    6, 1410,    3, 1936,    2, 3408,
         301,  965,    7,    4,  112,  740, 1977,   12,    1, 2014, 2772,
           3,    4,  428,    3, 5177,    6,  512, 1254,    1,  278,   27,
         139,   25,  308,    1,  579,    5,  259, 3529,    7,   92, 8981,
          32,    2, 3842,  230,   27,  289,    9,   35,    2, 5712,   18,
          27,  144, 2166,   56,    6,   26,   46,  466, 2014,   27,   40,
        2745,  657,  212,    4, 1376, 3002, 7080,  183,   36,  180,   52,
         920,    8,    2, 4028,   12,  969,    1,  158,   71,   53,   67,
          85, 2754,    4,  734,   51,    1, 1611,  294,   85,    6,    2,
        1164,    6,  163,    4, 3408,   15,   85,    6,  717,   85,   44,
           5,   24, 7158,    3,   48,  604,    7,   11,  225,  384,   73,
          65,   21,  242,   18,   27,  120,  295,    6,   26,  667,  129,
        4028,  948,    6,   67,   48,  158,   93,    1]])>, <tf.Tensor: shape=(), dtype=int32, numpy=0>)

আপনি উপরে দেখতে পারেন, প্রতিটি টোকেন একটি পূর্ণসংখ্যা দ্বারা প্রতিস্থাপিত হয়েছে। প্রতিটি পূর্ণসংখ্যার স্তরের .get_vocabulary() এ কল করে আপনি যে টোকেন (স্ট্রিং) এর সাথে সম্পর্কিত তা দেখতে পারেন।

 print("1287 ---> ",vectorize_layer.get_vocabulary()[1287])
print(" 313 ---> ",vectorize_layer.get_vocabulary()[313])
print('Vocabulary size: {}'.format(len(vectorize_layer.get_vocabulary())))
 
1287 --->  silent
 313 --->  night
Vocabulary size: 10000

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

 train_ds = raw_train_ds.map(vectorize_text)
val_ds = raw_val_ds.map(vectorize_text)
test_ds = raw_test_ds.map(vectorize_text)
 

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

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

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

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

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

 AUTOTUNE = tf.data.experimental.AUTOTUNE

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

মডেল তৈরি করুন

এটি আমাদের নিউরাল নেটওয়ার্ক তৈরির সময়:

 embedding_dim = 16
 
 model = tf.keras.Sequential([
  layers.Embedding(max_features + 1, embedding_dim),
  layers.Dropout(0.2),
  layers.GlobalAveragePooling1D(),
  layers.Dropout(0.2),
  layers.Dense(1)])

model.summary()
 
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding (Embedding)        (None, None, 16)          160016    
_________________________________________________________________
dropout (Dropout)            (None, None, 16)          0         
_________________________________________________________________
global_average_pooling1d (Gl (None, 16)                0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 16)                0         
_________________________________________________________________
dense (Dense)                (None, 1)                 17        
=================================================================
Total params: 160,033
Trainable params: 160,033
Non-trainable params: 0
_________________________________________________________________

শ্রেণিবদ্ধকারী তৈরি করতে স্তরগুলি ক্রমান্বয়ে স্ট্যাক করা হয়:

  1. প্রথম স্তরটি একটি Embedding স্তর। এই স্তরটি পূর্ণসংখ্যার-এনকোডেড পর্যালোচনা নেয় এবং প্রতিটি শব্দ-সূচীর জন্য একটি এম্বেডিং ভেক্টর সন্ধান করে। এই ভেক্টরগুলি মডেল ট্রেন হিসাবে শিখেছে। ভেক্টরগুলি আউটপুট অ্যারেতে একটি মাত্রা যুক্ত করে। ফলাফলের মাত্রা (batch, sequence, embedding) : (batch, sequence, embedding) । এম্বেডিং সম্পর্কে আরও জানতে, এম্বেডিং টিউটোরিয়াল শব্দটি দেখুন।
  2. এর পরে, GlobalAveragePooling1D স্তরটি প্রতিটি উদাহরণের জন্য সিকোয়েন্সের মাত্রাটির গড় গড় দিয়ে একটি নির্দিষ্ট দৈর্ঘ্যের আউটপুট ভেক্টরকে প্রদান করে। এটি মডেলটিকে ভ্যারিয়েবল দৈর্ঘ্যের ইনপুট হ্যান্ডেল করতে দেয়, সহজতম উপায়ে।
  3. এই স্থির দৈর্ঘ্যের আউটপুট ভেক্টরটি 16 টি গোপন ইউনিট সহ সম্পূর্ণ-সংযুক্ত ( Dense ) স্তরটির মাধ্যমে পাইপ করা হয়।
  4. শেষ স্তরটি একক আউটপুট নোডের সাথে ঘনভাবে সংযুক্ত।

ক্ষতি ফাংশন এবং অপ্টিমাইজার

প্রশিক্ষণের জন্য কোনও মডেলের ক্ষতি ক্ষতি এবং অপ্টিমাইজার প্রয়োজন। যেহেতু এটি একটি বাইনারি শ্রেণিবদ্ধকরণ সমস্যা এবং মডেলটি একটি সম্ভাব্যতা (সিগময়েড অ্যাক্টিভেশন সহ একটি একক-ইউনিট স্তর) আউটপুট দেয়, তাই আপনি ক্ষতির ব্যবহার করবেন losses.BinaryCrossentropy ক্ষতি ফাংশন।

এখন, অপ্টিমাইজার এবং ক্ষতির ফাংশনটি ব্যবহার করতে মডেলটি কনফিগার করুন:

 model.compile(loss=losses.BinaryCrossentropy(from_logits=True), optimizer='adam', metrics=tf.metrics.BinaryAccuracy(threshold=0.0))
 

মডেল প্রশিক্ষণ

আপনি ফিট পদ্ধতিতে dataset অবজেক্টটি পাস করে মডেলটিকে প্রশিক্ষণ দেবেন।

 epochs = 10
history = model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=epochs)
 
Epoch 1/10
625/625 [==============================] - 3s 5ms/step - loss: 0.6632 - binary_accuracy: 0.6931 - val_loss: 0.6135 - val_binary_accuracy: 0.7752
Epoch 2/10
625/625 [==============================] - 3s 4ms/step - loss: 0.5472 - binary_accuracy: 0.8003 - val_loss: 0.4968 - val_binary_accuracy: 0.8220
Epoch 3/10
625/625 [==============================] - 3s 4ms/step - loss: 0.4434 - binary_accuracy: 0.8459 - val_loss: 0.4187 - val_binary_accuracy: 0.8486
Epoch 4/10
625/625 [==============================] - 3s 4ms/step - loss: 0.3770 - binary_accuracy: 0.8660 - val_loss: 0.3726 - val_binary_accuracy: 0.8622
Epoch 5/10
625/625 [==============================] - 2s 4ms/step - loss: 0.3349 - binary_accuracy: 0.8786 - val_loss: 0.3442 - val_binary_accuracy: 0.8678
Epoch 6/10
625/625 [==============================] - 2s 4ms/step - loss: 0.3046 - binary_accuracy: 0.8889 - val_loss: 0.3253 - val_binary_accuracy: 0.8722
Epoch 7/10
625/625 [==============================] - 2s 4ms/step - loss: 0.2807 - binary_accuracy: 0.8977 - val_loss: 0.3118 - val_binary_accuracy: 0.8726
Epoch 8/10
625/625 [==============================] - 2s 4ms/step - loss: 0.2609 - binary_accuracy: 0.9046 - val_loss: 0.3026 - val_binary_accuracy: 0.8762
Epoch 9/10
625/625 [==============================] - 2s 4ms/step - loss: 0.2443 - binary_accuracy: 0.9123 - val_loss: 0.2961 - val_binary_accuracy: 0.8774
Epoch 10/10
625/625 [==============================] - 2s 4ms/step - loss: 0.2309 - binary_accuracy: 0.9163 - val_loss: 0.2915 - val_binary_accuracy: 0.8804

মডেল মূল্যায়ন

দেখা যাক কীভাবে মডেল অভিনয় করে। দুটি মান ফিরে আসবে। ক্ষতি (এমন একটি সংখ্যা যা আমাদের ত্রুটির প্রতিনিধিত্ব করে, নিম্ন মানগুলি আরও ভাল) এবং নির্ভুলতা।

 loss, accuracy = model.evaluate(test_ds)

print("Loss: ", loss)
print("Accuracy: ", accuracy)
 
782/782 [==============================] - 2s 3ms/step - loss: 0.3097 - binary_accuracy: 0.8740
Loss:  0.30967268347740173
Accuracy:  0.8740400075912476

এই মোটামুটি নিষ্পাপ দৃষ্টিভঙ্গি প্রায় 86% এর নির্ভুলতা অর্জন করে।

সময়ের সাথে সাথে নির্ভুলতা এবং ক্ষতির প্লট তৈরি করুন

model.fit() একটি History অবজেক্ট ফেরত দেয় যা প্রশিক্ষণের সময় ঘটেছিল এমন সমস্ত কিছুর সাথে একটি অভিধান থাকে:

 history_dict = history.history
history_dict.keys()
 
dict_keys(['loss', 'binary_accuracy', 'val_loss', 'val_binary_accuracy'])

চারটি এন্ট্রি রয়েছে: প্রশিক্ষণ এবং বৈধতার সময় প্রতিটি মনিটরিং মেট্রিকের জন্য একটি। আপনি এগুলি তুলনা করার জন্য প্রশিক্ষণ এবং বৈধতা হারাতে, পাশাপাশি প্রশিক্ষণ এবং বৈধতা নির্ভুলতার প্লট করতে ব্যবহার করতে পারেন:

 acc = history_dict['binary_accuracy']
val_acc = history_dict['val_binary_accuracy']
loss = history_dict['loss']
val_loss = history_dict['val_loss']

epochs = range(1, len(acc) + 1)

# "bo" is for "blue dot"
plt.plot(epochs, loss, 'bo', label='Training loss')
# b is for "solid blue line"
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()
 

PNG

 plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')

plt.show()
 

PNG

এই প্লটে, বিন্দুগুলি প্রশিক্ষণের ক্ষতি এবং যথার্থতা উপস্থাপন করে এবং শক্ত লাইনগুলি বৈধতা হ্রাস এবং নির্ভুলতা।

প্রতিটি যুগের সাথে প্রশিক্ষণের ক্ষতি হ্রাস লক্ষ্য করুন এবং প্রশিক্ষণের যথাযথতা প্রতিটি যুগের সাথে বৃদ্ধি পায় । গ্রেডিয়েন্ট বংশোদ্ভূত অপ্টিমাইজেশন ব্যবহার করার সময় এটি প্রত্যাশিত — এটি প্রতিটি পুনরাবৃত্তিতে পছন্দসই পরিমাণ হ্রাস করা উচিত।

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

এই নির্দিষ্ট ক্ষেত্রে, যখন বৈধতা নির্ভুলতা আর বাড়ছে না তখন আপনি কেবল প্রশিক্ষণ বন্ধ করে অতিরিক্ত চাপ প্রতিরোধ করতে পারেন। এটি করার একটি উপায় হ'ল আর্লিস্টপিং কলব্যাক ব্যবহার করা।

মডেলটি রফতানি করুন

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

 export_model = tf.keras.Sequential([
  vectorize_layer,
  model,
  layers.Activation('sigmoid')
])

export_model.compile(
    loss=losses.BinaryCrossentropy(from_logits=False), optimizer="adam", metrics=['accuracy']
)

# Test it with `raw_test_ds`, which yields raw strings
loss, accuracy = export_model.evaluate(raw_test_ds)
print(accuracy)
 
782/782 [==============================] - 3s 4ms/step - loss: 0.3097 - accuracy: 0.8740
0.8740400075912476

আপনার মডেলের অভ্যন্তরে পাঠ্য প্রিপ্রোসেসিং যুক্তি অন্তর্ভুক্ত করা আপনাকে উত্পাদন জন্য এমন একটি মডেল রফতানি করতে সক্ষম করে যা মোতায়েনকে সহজ করে তোলে এবং ট্রেন / পরীক্ষার স্কিউর সম্ভাবনা হ্রাস করে।

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

মডেলগুলি সংরক্ষণের বিষয়ে আরও জানতে এই টিউটোরিয়ালটি দেখুন।

অনুশীলন: স্ট্যাক ওভারফ্লো প্রশ্নগুলিতে মাল্টিক্লাস শ্রেণিবদ্ধকরণ

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

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

ডেটা সেটটি আপনার সঙ্গে কাজ করবে উপর অনেক বড় পাবলিক স্ট্যাক ওভারফ্লো ডেটা সেটটি থেকে নিষ্কাশিত কয়েক হাজার প্রশ্ন রয়েছে BigQuery- তে , যা তুলনায় আরো 17 মিলিয়ন পোস্ট ধারণ করে।

ডেটাसेटটি ডাউনলোড করার পরে আপনি দেখতে পাবেন যে এটির আগে আপনি যে আইএমডিবি ডেটাসেটের সাথে কাজ করেছিলেন তার মতো ডিরেক্টরি কাঠামো রয়েছে:

 train/
...python/
......0.txt
......1.txt
...javascript/
......0.txt
......1.txt
...csharp/
......0.txt
......1.txt
...java/
......0.txt
......1.txt
 

এই অনুশীলনটি সম্পূর্ণ করার জন্য, নিম্নলিখিত লিখিত পরিবর্তনগুলি করে আপনার স্ট্যাক ওভারফ্লো ডেটাসেটের সাথে কাজ করার জন্য এই নোটবুকটি পরিবর্তন করতে হবে:

  1. আপনার নোটবুকের শীর্ষে, স্টেম ওভারফ্লো ডেটাসেটটি আমরা প্রস্তুত করে রেখেছি এমন কোডটি আপডেট করুন যা আইএমডিবি ডেটাसेटকে কোড সহ ডাউনলোড করে। স্ট্যাক ওভারফ্লো ডেটাসেটের অনুরূপ ডিরেক্টরি কাঠামো রয়েছে, আপনাকে অনেকগুলি পরিবর্তন করার প্রয়োজন হবে না।

  2. Dense(4) পড়তে আপনার মডেলের শেষ স্তরটি সংশোধন করুন, কারণ এখন চারটি আউটপুট ক্লাস রয়েছে।

  3. আপনি যখন আপনার মডেলটি সংকলন করেন, লোকসানটিকে স্পার্সে বিভাগীয় ক্রসসেন্ট্রোপিতে পরিবর্তন করুন change এটি একটি বহুবিধ শ্রেণীর শ্রেণিবিন্যাস সমস্যার জন্য সঠিক ক্ষতি ফাংশন, যখন প্রতিটি শ্রেণির জন্য লেবেলগুলি পূর্ণসংখ্যা হয় (আমাদের ক্ষেত্রে, এটি 0, 1 , 2 , বা 3 হতে পারে )।

  4. এই পরিবর্তনগুলি সম্পূর্ণ হয়ে গেলে, আপনি একটি মাল্টিক্লাস শ্রেণিবদ্ধ প্রশিক্ষণ দিতে সক্ষম হবেন।

আপনি যদি আটকে যান তবে আপনি এখানে একটি সমাধান খুঁজে পেতে পারেন।

আরও শিখছি

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

 
#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.