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

অনুভূতির শ্রেণীবিভাগ জন্য গ্রাফ নিয়মিতকরণ সংশ্লেষিত গ্রাফ ব্যবহার

TensorFlow.org দেখুন গুগল Colab চালনা করুন GitHub থেকে উৎস দেখুন

সংক্ষিপ্ত বিবরণ

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

আমরা দেওয়া ইনপুট থেকে গ্রাফ নির্মাণের দ্বারা এই নোটবুক গ্রাফ নিয়মিতকরণ ব্যবহার প্রদর্শন করবে। গ্রাফ-নিয়মিত মডেল নিউরাল স্ট্রাকচার্ড শিক্ষণ (NSL) পরিকাঠামোকে ব্যবহার করে তুলবার জন্য সাধারণ রেসিপি যখন ইনপুট একটি সুনির্দিষ্ট গ্রাফ ধারণ করে না নিম্নরূপ হল:

  1. ইনপুট প্রতিটি টেক্সট নমুনা জন্য embeddings তৈরি করুন। এই যেমন প্রাক প্রশিক্ষিত মডেলগুলি ব্যবহার করা যেতে পারে word2vec , সুইভেল , বার্ট ইত্যাদি
  2. একটা মিল ব্যবহার করে এই embeddings উপর ভিত্তি করে একটি গ্রাফ তৈরি করুন মেট্রিক যেমন 'ও L2' দূরত্ব 'কোসাইন' গ্রাফ মিলা মধ্যে নমুনা এবং প্রান্ত গ্রাফ মিলা মিল থেকে নমুনা জোড়া মধ্যে দূরত্ব, ইত্যাদি নোড হিসাবে।
  3. উপরে সংশ্লেষিত গ্রাফ এবং নমুনা বৈশিষ্ট্য থেকে প্রশিক্ষণ ডাটা জেনারেট করুন। ফলে প্রশিক্ষণ ডেটা মূল নোড বৈশিষ্ট্য ছাড়াও প্রতিবেশী বৈশিষ্ট্য উপস্থিত থাকবে।
  4. Keras অনুক্রমিক, কার্যকরী, অথবা উপশ্রেণী API ব্যবহার করে একটি বেস মডেল হিসাবে একটি স্নায়ুর নেটওয়ার্ক তৈরি করুন।
  5. GraphRegularization রাপার ক্লাস, যা NSL ফ্রেমওয়ার্ক দ্বারা প্রদান করা হয় বেস মডেল মোড়ানো, একটি নতুন গ্রাফ Keras মডেল তৈরি করুন। এই নতুন মডেল তার প্রশিক্ষণ উদ্দেশ্য মধ্যে নিয়মিতকরণ মেয়াদ হিসাবে একটি গ্রাফ নিয়মিতকরণ ক্ষতি অন্তর্ভুক্ত করা হবে।
  6. ট্রেন ও গ্রাফ Keras মডেল নির্ণয় করা।

আবশ্যকতা

  1. নিউরাল স্ট্রাকচার্ড শিক্ষণ প্যাকেজ ইনস্টল করুন।
  2. tensorflow-হাব ইনস্টল করুন।
pip install --quiet neural-structured-learning
pip install --quiet tensorflow-hub

অধীনস্থ এলাকা এবং আমদানির

 import matplotlib.pyplot as plt
import numpy as np

import neural_structured_learning as nsl

import tensorflow as tf
import tensorflow_hub as hub

# Resets notebook state
tf.keras.backend.clear_session()

print("Version: ", tf.__version__)
print("Eager mode: ", tf.executing_eagerly())
print("Hub version: ", hub.__version__)
print(
    "GPU is",
    "available" if tf.config.list_physical_devices("GPU") else "NOT AVAILABLE")
 
Version:  2.3.0
Eager mode:  True
Hub version:  0.8.0
GPU is NOT AVAILABLE

IMDB, ডেটা সেটটি

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

এই টিউটোরিয়াল, আমরা IMDB, ডেটাসেটের একটি preprocessed সংস্করণ ব্যবহার করবে।

ডাউনলোড preprocessed IMDB, ডেটা সেটটি

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

নিম্নলিখিত কোড ডাউনলোডসমূহ IMDB, ডেটা সেটটি (বা একটি ক্যাশে প্রতিলিপিটি ব্যবহার করে এটি আগে থেকেই ডাউনলোড করা হয়েছে):

 imdb = tf.keras.datasets.imdb
(pp_train_data, pp_train_labels), (pp_test_data, pp_test_labels) = (
    imdb.load_data(num_words=10000))
 
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz
17465344/17464789 [==============================] - 0s 0us/step

যুক্তি num_words=10000 প্রশিক্ষণ ডেটা শীর্ষ 10,000 সবচেয়ে বেশিবার যে শব্দ রাখে। বিরল শব্দ শব্দভান্ডার সামলানো আকার রাখার বাতিল করা হয়।

ডেটা এক্সপ্লোর

ডেটা বিন্যাস বুঝতে করার জন্য একটু সময় দিন। ডেটা সেটটি preprocessed আসে: প্রতিটি উদাহরণ সিনেমা পর্যালোচনা শব্দের প্রতিনিধিত্বকারী পূর্ণসংখ্যার একটি অ্যারে। প্রতিটি লেবেল, হয় 0 বা 1 এর একটি পূর্ণসংখ্যা মান যেখানে 0 একটি নেতিবাচক পর্যালোচনা, এবং আরও 1 ইতিবাচক পর্যালোচনা।

 print('Training entries: {}, labels: {}'.format(
    len(pp_train_data), len(pp_train_labels)))
training_samples_count = len(pp_train_data)
 
Training entries: 25000, labels: 25000

রিভিউ টেক্সট পূর্ণসংখ্যার, যেখানে প্রতিটি পূর্ণসংখ্যা একটি অভিধান একটি নির্দিষ্ট শব্দ প্রতিনিধিত্ব করে রূপান্তরিত করা হয়েছে। এখানে প্রথম পর্যালোচনা দেখতে কেমন আছে:

 print(pp_train_data[0])
 
[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]

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

 len(pp_train_data[0]), len(pp_train_data[1])
 
(218, 189)

কথায় পূর্ণসংখ্যার রূপান্তর ফিরে

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

 def build_reverse_word_index():
  # A dictionary mapping words to an integer index
  word_index = imdb.get_word_index()

  # The first indices are reserved
  word_index = {k: (v + 3) for k, v in word_index.items()}
  word_index['<PAD>'] = 0
  word_index['<START>'] = 1
  word_index['<UNK>'] = 2  # unknown
  word_index['<UNUSED>'] = 3
  return dict((value, key) for (key, value) in word_index.items())

reverse_word_index = build_reverse_word_index()

def decode_review(text):
  return ' '.join([reverse_word_index.get(i, '?') for i in text])
 
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json
1646592/1641221 [==============================] - 0s 0us/step

এখন আমরা ব্যবহার করতে পারেন decode_review প্রথম পর্যালোচনা জন্য পাঠ্য প্রদর্শন করে ফাংশন:

 decode_review(pp_train_data[0])
 
"<START> this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert <UNK> is an amazing actor and now the same being director <UNK> father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for <UNK> and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also <UNK> to the two little boy's that played the <UNK> of norman and paul they were just brilliant children are often left out of the <UNK> list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all"

গ্রাফ নির্মাণ

গ্রাফ নির্মাণ টেক্সট নমুনার জন্য embeddings তৈরি এবং তারপর embeddings তুলনা করার জন্য একটি আদল ফাংশন ব্যবহার করে জড়িত থাকে।

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

mkdir -p /tmp/imdb

নমুনা embeddings তৈরি করুন

আমরা pretrained সুইভেল embeddings ব্যবহার embeddings তৈরি করতে হবে tf.train.Example ইনপুট প্রতিটি নমুনা জন্য বিন্যাস। আমরা ফলে embeddings সংরক্ষণ করবে TFRecord একটি অতিরিক্ত বৈশিষ্ট্য প্রতিটি নমুনা আইডি প্রতিনিধিত্ব করে সহ বিন্যাস। এটি গুরুত্বপূর্ণ এবং আমাদের গ্রাফ সংশ্লিষ্ট নোড পরে নমুনা embeddings মেলে অনুমতি দেবে।

 pretrained_embedding = 'https://  tfhub.dev  /google/tf2-preview/gnews-swivel-20dim/1'

hub_layer = hub.KerasLayer(
    pretrained_embedding, input_shape=[], dtype=tf.string, trainable=True)
 
 def _int64_feature(value):
  """Returns int64 tf.train.Feature."""
  return tf.train.Feature(int64_list=tf.train.Int64List(value=value.tolist()))


def _bytes_feature(value):
  """Returns bytes tf.train.Feature."""
  return tf.train.Feature(
      bytes_list=tf.train.BytesList(value=[value.encode('utf-8')]))


def _float_feature(value):
  """Returns float tf.train.Feature."""
  return tf.train.Feature(float_list=tf.train.FloatList(value=value.tolist()))


def create_embedding_example(word_vector, record_id):
  """Create tf.Example containing the sample's embedding and its ID."""

  text = decode_review(word_vector)

  # Shape = [batch_size,].
  sentence_embedding = hub_layer(tf.reshape(text, shape=[-1,]))

  # Flatten the sentence embedding back to 1-D.
  sentence_embedding = tf.reshape(sentence_embedding, shape=[-1])

  features = {
      'id': _bytes_feature(str(record_id)),
      'embedding': _float_feature(sentence_embedding.numpy())
  }
  return tf.train.Example(features=tf.train.Features(feature=features))


def create_embeddings(word_vectors, output_path, starting_record_id):
  record_id = int(starting_record_id)
  with tf.io.TFRecordWriter(output_path) as writer:
    for word_vector in word_vectors:
      example = create_embedding_example(word_vector, record_id)
      record_id = record_id + 1
      writer.write(example.SerializeToString())
  return record_id


# Persist TF.Example features containing embeddings for training data in
# TFRecord format.
create_embeddings(pp_train_data, '/tmp/imdb/embeddings.tfr', 0)
 
25000

গ্রাফ তৈরি করুন

এখন আমরা নমুনা embeddings আছে, আমরা তাদের ব্যবহার, একটি আদল গ্রাফ নির্মাণ করতে এই গ্রাফে অর্থাত, এই গ্রাফে নোড নমুনা এবং প্রান্ত মিলা হবে নোড জোড়া মধ্যে মিল মিলা হবে।

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

 nsl.tools.build_graph(['/tmp/imdb/embeddings.tfr'],
                      '/tmp/imdb/graph_99.tsv',
                      similarity_threshold=0.99)
 

নমুনা বৈশিষ্ট্য

আমরা ব্যবহার আমাদের সমস্যা জন্য নমুনা বৈশিষ্ট্য তৈরি tf.train.Example বিন্যাস এবং তাদের মধ্যে জিদ TFRecord বিন্যাস। প্রতিটি নমুনা নিম্নলিখিত তিনটি বৈশিষ্ট্য অন্তর্ভুক্ত করা হবে:

  1. আইডি: নমুনা নোড আইডি।
  2. শব্দ: একটি int64 শব্দ ID- র ধারণকারী তালিকা।
  3. ট্যাগ: পর্যালোচনার লক্ষ্য বর্গ চিহ্নিতকরণের int64 একটি Singleton।
 def create_example(word_vector, label, record_id):
  """Create tf.Example containing the sample's word vector, label, and ID."""
  features = {
      'id': _bytes_feature(str(record_id)),
      'words': _int64_feature(np.asarray(word_vector)),
      'label': _int64_feature(np.asarray([label])),
  }
  return tf.train.Example(features=tf.train.Features(feature=features))

def create_records(word_vectors, labels, record_path, starting_record_id):
  record_id = int(starting_record_id)
  with tf.io.TFRecordWriter(record_path) as writer:
    for word_vector, label in zip(word_vectors, labels):
      example = create_example(word_vector, label, record_id)
      record_id = record_id + 1
      writer.write(example.SerializeToString())
  return record_id

# Persist TF.Example features (word vectors and labels) for training and test
# data in TFRecord format.
next_record_id = create_records(pp_train_data, pp_train_labels,
                                '/tmp/imdb/train_data.tfr', 0)
create_records(pp_test_data, pp_test_labels, '/tmp/imdb/test_data.tfr',
               next_record_id)
 
50000

গ্রাফ প্রতিবেশীদের সঙ্গে বৃদ্ধি প্রশিক্ষণ ডেটা

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

এই টিউটোরিয়াল, আমরা undirected প্রান্ত বিবেচনা এবং গ্রাফ প্রতিবেশীদের সঙ্গে বৃদ্ধি প্রশিক্ষণ ডেটাতে নমুনা প্রতি 3 প্রতিবেশীদের সর্বোচ্চ ব্যবহার করুন।

 nsl.tools.pack_nbrs(
    '/tmp/imdb/train_data.tfr',
    '',
    '/tmp/imdb/graph_99.tsv',
    '/tmp/imdb/nsl_train_data.tfr',
    add_undirected_edges=True,
    max_nbrs=3)
 

বেজ মডেল

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

গ্লোবাল ভেরিয়েবল

 NBR_FEATURE_PREFIX = 'NL_nbr_'
NBR_WEIGHT_SUFFIX = '_weight'
 

Hyperparameters

আমরা একটি দৃষ্টান্ত ব্যবহার করবে HParams বিভিন্ন hyperparameters এবং ধ্রুবক প্রশিক্ষণ ও পরীক্ষা নিরীক্ষার জন্য ব্যবহৃত inclue করতে। আমরা সংক্ষেপে নিচে তাদের প্রতিটি বর্ণনা:

  • num_classes: - ধনাত্মক এবং ঋণাত্মক এখানে আছে 2 শ্রেণীর হয়।

  • max_seq_length এই এই উদাহরণে প্রতিটি সিনেমা পর্যালোচনা থেকে বিবেচনা শব্দের সর্বোচ্চ সংখ্যা হল।

  • vocab_size এই শব্দভান্ডার এই উদাহরণে জন্য বিবেচনা মাপ।

  • distance_type এই দূরত্ব মেট্রিক তার প্রতিবেশীদের সঙ্গে নমুনা নিয়মিত করার ব্যবহার করা হয়।

  • graph_regularization_multiplier এই নিয়ন্ত্রণ সামগ্রিক ক্ষয় ফাংশনে গ্রাফ নিয়মিতকরণ শব্দটি আপেক্ষিক ওজন।

  • num_neighbors: গ্রাফ নিয়মিতকরণ জন্য ব্যবহৃত প্রতিবেশীদের সংখ্যা। এই মান এর চেয়ে বড় বা কম সমান হতে হয়েছে max_nbrs যখন invoking উপরে ব্যবহৃত যুক্তি nsl.tools.pack_nbrs

  • num_fc_units: স্নায়ুর নেটওয়ার্ক সম্পূর্ণ সংযুক্ত স্তরে ইউনিট সংখ্যা।

  • train_epochs: প্রশিক্ষণ সময়কাল সংখ্যা।

  • batch_size: ব্যাচ আকার প্রশিক্ষণ ও পরীক্ষা নিরীক্ষার জন্য ব্যবহৃত।

  • eval_steps: মূল্যায়ন deeming সামনে প্রক্রিয়া ব্যাচ সংখ্যা সম্পূর্ণ। যদি সেট করা None , পরীক্ষা সেটে সমস্ত উদাহরণ মূল্যায়ন করা হয়।

 class HParams(object):
  """Hyperparameters used for training."""
  def __init__(self):
    ### dataset parameters
    self.num_classes = 2
    self.max_seq_length = 256
    self.vocab_size = 10000
    ### neural graph learning parameters
    self.distance_type = nsl.configs.DistanceType.L2
    self.graph_regularization_multiplier = 0.1
    self.num_neighbors = 2
    ### model architecture
    self.num_embedding_dims = 16
    self.num_lstm_dims = 64
    self.num_fc_units = 64
    ### training parameters
    self.train_epochs = 10
    self.batch_size = 128
    ### eval parameters
    self.eval_steps = None  # All instances in the test set are evaluated.

HPARAMS = HParams()
 

তথ্য প্রস্তুত

রিভিউ অফ অ্যারে পূর্ণসংখ্যার-আবশ্যক স্নায়ুর নেটওয়ার্ক মধ্যে প্রতিপালিত হবার আগে tensors রূপান্তরিত করা। এই রূপান্তর উপায়ে একটি দম্পতি করা সম্ভব:

  • এর ভেক্টর মধ্যে অ্যারে রূপান্তর করুন 0 s এবং 1 শব্দ সংঘটন, একটি এক-গরম এনকোডিং অনুরূপ ইঙ্গিত গুলি। উদাহরণস্বরূপ, ক্রম [3, 5] একটি হয়ে 10000 -dimensional ভেক্টর সূচকের ছাড়া সব zeros যে 3 এবং 5 , যা বেশী। তারপর, এই আমাদের প্রথম স্তর করা নেটওয়ার্ক-একটি Dense স্তর-যে বিন্দু ভেক্টর ডাটা ভাসমান সব ব্যবস্থা করতে সক্ষম। এই পদ্ধতির একটি প্রয়োজন, মেমরি নিবিড়, যদিও num_words * num_reviews আকার ম্যাট্রিক্স।

  • অন্যথা, আমরা প্যাড অ্যারে যাতে তারা সব একই দৈর্ঘ্য থাকে, তখন আকৃতি একটি পূর্ণসংখ্যা টেন্সর তৈরি করতে পারেন max_length * num_reviews । আমরা একটি এম্বেড স্তর আমাদের নেটওয়ার্ক প্রথম স্তর হিসাবে এই আকৃতি নিয়ন্ত্রণ করতে সক্ষম ব্যবহার করতে পারেন।

এই টিউটোরিয়াল, আমরা দ্বিতীয় পদ্ধতির ব্যবহার করবে।

যেহেতু সিনেমা পর্যালোচনা একই দৈর্ঘ্য হতে হবে, আমরা ব্যবহার করবে pad_sequence লেন্থ প্রমিত ফাংশন নিম্নে বর্ণিত।

 def make_dataset(file_path, training=False):
  """Creates a `tf.data.TFRecordDataset`.

  Args:
    file_path: Name of the file in the `.tfrecord` format containing
      `tf.train.Example` objects.
    training: Boolean indicating if we are in training mode.

  Returns:
    An instance of `tf.data.TFRecordDataset` containing the `tf.train.Example`
    objects.
  """

  def pad_sequence(sequence, max_seq_length):
    """Pads the input sequence (a `tf.SparseTensor`) to `max_seq_length`."""
    pad_size = tf.maximum([0], max_seq_length - tf.shape(sequence)[0])
    padded = tf.concat(
        [sequence.values,
         tf.fill((pad_size), tf.cast(0, sequence.dtype))],
        axis=0)
    # The input sequence may be larger than max_seq_length. Truncate down if
    # necessary.
    return tf.slice(padded, [0], [max_seq_length])

  def parse_example(example_proto):
    """Extracts relevant fields from the `example_proto`.

    Args:
      example_proto: An instance of `tf.train.Example`.

    Returns:
      A pair whose first value is a dictionary containing relevant features
      and whose second value contains the ground truth labels.
    """
    # The 'words' feature is a variable length word ID vector.
    feature_spec = {
        'words': tf.io.VarLenFeature(tf.int64),
        'label': tf.io.FixedLenFeature((), tf.int64, default_value=-1),
    }
    # We also extract corresponding neighbor features in a similar manner to
    # the features above during training.
    if training:
      for i in range(HPARAMS.num_neighbors):
        nbr_feature_key = '{}{}_{}'.format(NBR_FEATURE_PREFIX, i, 'words')
        nbr_weight_key = '{}{}{}'.format(NBR_FEATURE_PREFIX, i,
                                         NBR_WEIGHT_SUFFIX)
        feature_spec[nbr_feature_key] = tf.io.VarLenFeature(tf.int64)

        # We assign a default value of 0.0 for the neighbor weight so that
        # graph regularization is done on samples based on their exact number
        # of neighbors. In other words, non-existent neighbors are discounted.
        feature_spec[nbr_weight_key] = tf.io.FixedLenFeature(
            [1], tf.float32, default_value=tf.constant([0.0]))

    features = tf.io.parse_single_example(example_proto, feature_spec)

    # Since the 'words' feature is a variable length word vector, we pad it to a
    # constant maximum length based on HPARAMS.max_seq_length
    features['words'] = pad_sequence(features['words'], HPARAMS.max_seq_length)
    if training:
      for i in range(HPARAMS.num_neighbors):
        nbr_feature_key = '{}{}_{}'.format(NBR_FEATURE_PREFIX, i, 'words')
        features[nbr_feature_key] = pad_sequence(features[nbr_feature_key],
                                                 HPARAMS.max_seq_length)

    labels = features.pop('label')
    return features, labels

  dataset = tf.data.TFRecordDataset([file_path])
  if training:
    dataset = dataset.shuffle(10000)
  dataset = dataset.map(parse_example)
  dataset = dataset.batch(HPARAMS.batch_size)
  return dataset


train_dataset = make_dataset('/tmp/imdb/nsl_train_data.tfr', True)
test_dataset = make_dataset('/tmp/imdb/test_data.tfr')
 

মডেল নির্মান

একটি স্নায়ুর নেটওয়ার্ক সারিবদ্ধ দ্বারা তৈরি করা হয় স্তর-এই দুটি প্রধান স্থাপত্য সিদ্ধান্ত প্রয়োজন:

  • কত স্তর মডেল ব্যবহার করতে হয়?
  • কত গোপন ইউনিট প্রতিটি স্তরের ব্যবহার করতে হয়?

এই উদাহরণে, ইনপুট ডেটা শব্দ-সূচকের একটি অ্যারের নিয়ে গঠিত। লেবেল ভবিষ্যদ্বাণী করা হয় 0 বা 1 আছে।

আমরা এই টিউটোরিয়ালে আমাদের বেস মডেল হিসাবে একটি দ্বি-মুখী LSTM ব্যবহার করবে।

 # This function exists as an alternative to the bi-LSTM model used in this
# notebook.
def make_feed_forward_model():
  """Builds a simple 2 layer feed forward neural network."""
  inputs = tf.keras.Input(
      shape=(HPARAMS.max_seq_length,), dtype='int64', name='words')
  embedding_layer = tf.keras.layers.Embedding(HPARAMS.vocab_size, 16)(inputs)
  pooling_layer = tf.keras.layers.GlobalAveragePooling1D()(embedding_layer)
  dense_layer = tf.keras.layers.Dense(16, activation='relu')(pooling_layer)
  outputs = tf.keras.layers.Dense(1, activation='sigmoid')(dense_layer)
  return tf.keras.Model(inputs=inputs, outputs=outputs)


def make_bilstm_model():
  """Builds a bi-directional LSTM model."""
  inputs = tf.keras.Input(
      shape=(HPARAMS.max_seq_length,), dtype='int64', name='words')
  embedding_layer = tf.keras.layers.Embedding(HPARAMS.vocab_size,
                                              HPARAMS.num_embedding_dims)(
                                                  inputs)
  lstm_layer = tf.keras.layers.Bidirectional(
      tf.keras.layers.LSTM(HPARAMS.num_lstm_dims))(
          embedding_layer)
  dense_layer = tf.keras.layers.Dense(
      HPARAMS.num_fc_units, activation='relu')(
          lstm_layer)
  outputs = tf.keras.layers.Dense(1, activation='sigmoid')(dense_layer)
  return tf.keras.Model(inputs=inputs, outputs=outputs)


# Feel free to use an architecture of your choice.
model = make_bilstm_model()
model.summary()
 
Model: "functional_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
words (InputLayer)           [(None, 256)]             0         
_________________________________________________________________
embedding (Embedding)        (None, 256, 16)           160000    
_________________________________________________________________
bidirectional (Bidirectional (None, 128)               41472     
_________________________________________________________________
dense (Dense)                (None, 64)                8256      
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 65        
=================================================================
Total params: 209,793
Trainable params: 209,793
Non-trainable params: 0
_________________________________________________________________

স্তর কার্যকরভাবে ক্লাসিফায়ার গড়ে তুলতে ক্রমানুসারে সজ্জিত হয়:

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

লুকায়িত ইউনিট

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

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

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

একটি মডেল একটি ক্ষতি ফাংশন এবং প্রশিক্ষণের জন্য একটি অপটিমাইজার প্রয়োজন। যেহেতু এই একটি বাইনারি শ্রেণীবিন্যাস সমস্যা এবং সম্ভাবনা আউটপুট মডেল (ক সিগমা অ্যাক্টিভেশন সঙ্গে একটি একক ইউনিট স্তর), আমরা ব্যবহার করব binary_crossentropy ক্ষতি ফাংশন।

 model.compile(
    optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
 

একটি যাচাইকরণ সেট তৈরি

যখন প্রশিক্ষণ, আমরা মডেল ডেটার উপর এটা আগে দেখেন নি নির্ভুলতা চেক করতে চান। মূল প্রশিক্ষণ ডেটার একটি ভগ্নাংশ পৃথক্ সেট করে একটি যাচাইকরণ সেট তৈরি করুন। (বর্তমানে পরীক্ষামূলক সেট ব্যবহার কেন নয়? আমাদের লক্ষ্য শুধুমাত্র প্রশিক্ষণ ডেটা ব্যবহার বিকাশ এবং সুর আমাদের মডেল, তারপর মাত্র একবার পরীক্ষা ডেটা ব্যবহার আমাদের সঠিকতা নির্ণয় করা যায়)।

এই টিউটোরিয়ালে আমরা প্রশিক্ষণ জন্য লেবেলযুক্ত ডেটা এবং বৈধতা তথ্য হিসাবে অবশিষ্ট হিসাবে প্রাথমিক প্রশিক্ষণ নমুনার মোটামুটিভাবে 10% (25000 10%) নিতে। যেহেতু প্রাথমিক ট্রেন / পরীক্ষা বিভক্ত 50/50 ছিল (25000 নমুনা প্রতিটি), কার্যকর ট্রেন / বৈধতা / পরীক্ষা বিভক্ত এখন আমরা আছে 5/45/50 হয়।

উল্লেখ্য যে 'train_dataset' ইতিমধ্যে শ্রেণীবদ্ধ করা হয়েছে এবং অদলবদল করেছে।

 validation_fraction = 0.9
validation_size = int(validation_fraction *
                      int(training_samples_count / HPARAMS.batch_size))
print(validation_size)
validation_dataset = train_dataset.take(validation_size)
train_dataset = train_dataset.skip(validation_size)
 
175

মডেল ট্রেন

মিনি- ব্যাচে মডেল ট্রেন। যদিও প্রশিক্ষণ, মডেল এর কমে যাওয়া এবং বৈধতা সেটে সঠিকতা নজর রাখুন:

 history = model.fit(
    train_dataset,
    validation_data=validation_dataset,
    epochs=HPARAMS.train_epochs,
    verbose=1)
 
Epoch 1/10

/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/functional.py:543: UserWarning: Input dict contained keys ['NL_nbr_0_words', 'NL_nbr_1_words', 'NL_nbr_0_weight', 'NL_nbr_1_weight'] which did not match any model input. They will be ignored by the model.
  [n for n in tensors.keys() if n not in ref_input_names])

21/21 [==============================] - 19s 925ms/step - loss: 0.6930 - accuracy: 0.5092 - val_loss: 0.6924 - val_accuracy: 0.5006
Epoch 2/10
21/21 [==============================] - 19s 894ms/step - loss: 0.6890 - accuracy: 0.5465 - val_loss: 0.7294 - val_accuracy: 0.5698
Epoch 3/10
21/21 [==============================] - 19s 883ms/step - loss: 0.6785 - accuracy: 0.6208 - val_loss: 0.6489 - val_accuracy: 0.7043
Epoch 4/10
21/21 [==============================] - 19s 890ms/step - loss: 0.6592 - accuracy: 0.6400 - val_loss: 0.6523 - val_accuracy: 0.6866
Epoch 5/10
21/21 [==============================] - 19s 883ms/step - loss: 0.6413 - accuracy: 0.6923 - val_loss: 0.6335 - val_accuracy: 0.7004
Epoch 6/10
21/21 [==============================] - 21s 982ms/step - loss: 0.6053 - accuracy: 0.7188 - val_loss: 0.5716 - val_accuracy: 0.7183
Epoch 7/10
21/21 [==============================] - 18s 879ms/step - loss: 0.5204 - accuracy: 0.7619 - val_loss: 0.4511 - val_accuracy: 0.7930
Epoch 8/10
21/21 [==============================] - 19s 882ms/step - loss: 0.4719 - accuracy: 0.7758 - val_loss: 0.4244 - val_accuracy: 0.8094
Epoch 9/10
21/21 [==============================] - 18s 880ms/step - loss: 0.3695 - accuracy: 0.8431 - val_loss: 0.3567 - val_accuracy: 0.8487
Epoch 10/10
21/21 [==============================] - 19s 891ms/step - loss: 0.3504 - accuracy: 0.8500 - val_loss: 0.3219 - val_accuracy: 0.8652

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

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

 results = model.evaluate(test_dataset, steps=HPARAMS.eval_steps)
print(results)
 
196/196 [==============================] - 17s 85ms/step - loss: 0.4116 - accuracy: 0.8221
[0.4116455018520355, 0.8221200108528137]

সময়ের সাথে সঠিকতা / ক্ষতির গ্রাফ তৈরি করুন

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

 history_dict = history.history
history_dict.keys()
 
dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])

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

 acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
loss = history_dict['loss']
val_loss = history_dict['val_loss']

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

# "-r^" is for solid red line with triangle markers.
plt.plot(epochs, loss, '-r^', label='Training loss')
# "-b0" is for solid blue line with circle markers.
plt.plot(epochs, val_loss, '-bo', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='best')

plt.show()
 

PNG

 plt.clf()   # clear figure

plt.plot(epochs, acc, '-r^', label='Training acc')
plt.plot(epochs, val_acc, '-bo', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='best')

plt.show()
 

PNG

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

গ্রাফ নিয়মিতকরণ

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

গ্রাফ-নিয়মিত মডেল তৈরি করুন

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

 # Build a new base LSTM model.
base_reg_model = make_bilstm_model()
 
 # Wrap the base model with graph regularization.
graph_reg_config = nsl.configs.make_graph_reg_config(
    max_neighbors=HPARAMS.num_neighbors,
    multiplier=HPARAMS.graph_regularization_multiplier,
    distance_type=HPARAMS.distance_type,
    sum_over_axis=-1)
graph_reg_model = nsl.keras.GraphRegularization(base_reg_model,
                                                graph_reg_config)
graph_reg_model.compile(
    optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
 

মডেল ট্রেন

 graph_reg_history = graph_reg_model.fit(
    train_dataset,
    validation_data=validation_dataset,
    epochs=HPARAMS.train_epochs,
    verbose=1)
 
Epoch 1/10

/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/framework/indexed_slices.py:432: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.
  "Converting sparse IndexedSlices to a dense Tensor of unknown shape. "

21/21 [==============================] - 22s 1s/step - loss: 0.6930 - accuracy: 0.5246 - scaled_graph_loss: 2.9800e-06 - val_loss: 0.6929 - val_accuracy: 0.4998
Epoch 2/10
21/21 [==============================] - 21s 988ms/step - loss: 0.6909 - accuracy: 0.5200 - scaled_graph_loss: 7.8452e-06 - val_loss: 0.6838 - val_accuracy: 0.5917
Epoch 3/10
21/21 [==============================] - 21s 980ms/step - loss: 0.6656 - accuracy: 0.6277 - scaled_graph_loss: 6.1205e-04 - val_loss: 0.6591 - val_accuracy: 0.6905
Epoch 4/10
21/21 [==============================] - 21s 981ms/step - loss: 0.6395 - accuracy: 0.6846 - scaled_graph_loss: 0.0016 - val_loss: 0.5860 - val_accuracy: 0.7171
Epoch 5/10
21/21 [==============================] - 21s 980ms/step - loss: 0.5388 - accuracy: 0.7573 - scaled_graph_loss: 0.0043 - val_loss: 0.4910 - val_accuracy: 0.7844
Epoch 6/10
21/21 [==============================] - 21s 989ms/step - loss: 0.4105 - accuracy: 0.8281 - scaled_graph_loss: 0.0146 - val_loss: 0.3353 - val_accuracy: 0.8612
Epoch 7/10
21/21 [==============================] - 21s 986ms/step - loss: 0.3416 - accuracy: 0.8681 - scaled_graph_loss: 0.0203 - val_loss: 0.4134 - val_accuracy: 0.8209
Epoch 8/10
21/21 [==============================] - 21s 981ms/step - loss: 0.4230 - accuracy: 0.8273 - scaled_graph_loss: 0.0144 - val_loss: 0.4755 - val_accuracy: 0.7696
Epoch 9/10
21/21 [==============================] - 22s 1s/step - loss: 0.4905 - accuracy: 0.7950 - scaled_graph_loss: 0.0080 - val_loss: 0.3862 - val_accuracy: 0.8382
Epoch 10/10
21/21 [==============================] - 21s 978ms/step - loss: 0.3384 - accuracy: 0.8754 - scaled_graph_loss: 0.0215 - val_loss: 0.3002 - val_accuracy: 0.8811

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

 graph_reg_results = graph_reg_model.evaluate(test_dataset, steps=HPARAMS.eval_steps)
print(graph_reg_results)
 
196/196 [==============================] - 16s 84ms/step - loss: 0.3852 - accuracy: 0.8301
[0.385225385427475, 0.830079972743988]

সময়ের সাথে সঠিকতা / ক্ষতির গ্রাফ তৈরি করুন

 graph_reg_history_dict = graph_reg_history.history
graph_reg_history_dict.keys()
 
dict_keys(['loss', 'accuracy', 'scaled_graph_loss', 'val_loss', 'val_accuracy'])

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

 acc = graph_reg_history_dict['accuracy']
val_acc = graph_reg_history_dict['val_accuracy']
loss = graph_reg_history_dict['loss']
graph_loss = graph_reg_history_dict['scaled_graph_loss']
val_loss = graph_reg_history_dict['val_loss']

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

plt.clf()   # clear figure

# "-r^" is for solid red line with triangle markers.
plt.plot(epochs, loss, '-r^', label='Training loss')
# "-gD" is for solid green line with diamond markers.
plt.plot(epochs, graph_loss, '-gD', label='Training graph loss')
# "-b0" is for solid blue line with circle markers.
plt.plot(epochs, val_loss, '-bo', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='best')

plt.show()
 

PNG

 plt.clf()   # clear figure

plt.plot(epochs, acc, '-r^', label='Training acc')
plt.plot(epochs, val_acc, '-bo', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='best')

plt.show()
 

PNG

আধা তত্ত্বাবধানে থাকা শেখার ক্ষমতা

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

আমরা যা প্রশিক্ষণ, বৈধতা, এবং পরীক্ষা নমুনা অন্তর্ভুক্ত নমুনা মোট সংখ্যা নমুনা প্রশিক্ষণ অনুপাত হিসাবে তত্ত্বাবধানে অনুপাত নির্ধারণ করুন। এই নোটবুক, আমরা 0.05 (অর্থাত, লেবেল করা ডেটার 5%) এবং সেইসাথে প্রশিক্ষণ উভয় বেস মডেল জন্য গ্রাফ-নিয়মিত মডেলের তত্ত্বাবধানে অনুপাত ব্যবহার করেছেন। আমরা নিচের কক্ষে মডেল সঠিকতা প্রসঙ্গে তত্ত্বাবধানে অনুপাত প্রভাব চিত্রিত করা।

 # Accuracy values for both the Bi-LSTM model and the feed forward NN model have
# been precomputed for the following supervision ratios.

supervision_ratios = [0.3, 0.15, 0.05, 0.03, 0.02, 0.01, 0.005]

model_tags = ['Bi-LSTM model', 'Feed Forward NN model']
base_model_accs = [[84, 84, 83, 80, 65, 52, 50], [87, 86, 76, 74, 67, 52, 51]]
graph_reg_model_accs = [[84, 84, 83, 83, 65, 63, 50],
                        [87, 86, 80, 75, 67, 52, 50]]

plt.clf()  # clear figure

fig, axes = plt.subplots(1, 2)
fig.set_size_inches((12, 5))

for ax, model_tag, base_model_acc, graph_reg_model_acc in zip(
    axes, model_tags, base_model_accs, graph_reg_model_accs):

  # "-r^" is for solid red line with triangle markers.
  ax.plot(base_model_acc, '-r^', label='Base model')
  # "-gD" is for solid green line with diamond markers.
  ax.plot(graph_reg_model_acc, '-gD', label='Graph-regularized model')
  ax.set_title(model_tag)
  ax.set_xlabel('Supervision ratio')
  ax.set_ylabel('Accuracy(%)')
  ax.set_ylim((25, 100))
  ax.set_xticks(range(len(supervision_ratios)))
  ax.set_xticklabels(supervision_ratios)
  ax.legend(loc='best')

plt.show()
 
<Figure size 432x288 with 0 Axes>

PNG

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

উপসংহার

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