TensorFlow.org এ দেখুন | Google Colab-এ চালান | GitHub এ দেখুন | নোটবুক ডাউনলোড করুন |
এই নোটবুকটি TFCO লাইব্রেরি ব্যবহার করে সীমাবদ্ধ সমস্যা তৈরি এবং অপ্টিমাইজ করার একটি সহজ উপায় প্রদর্শন করে। যখন আমরা এটি যে তারা আমাদের ডেটা, বিভিন্ন টুকরা যা আমরা ব্যবহার চিহ্নিত করতে পারেন জুড়ে সমানভাবে ভাল করণ করছি না এই পদ্ধতি মডেলের উন্নতিতে উপযোগী হতে পারে ফর্সা সূচক । Google-এর AI নীতিগুলির দ্বিতীয়টি বলে যে আমাদের প্রযুক্তির উচিত অন্যায্য পক্ষপাত তৈরি করা বা শক্তিশালী করা এড়ানো, এবং আমরা বিশ্বাস করি যে এই কৌশলটি কিছু পরিস্থিতিতে মডেল ন্যায্যতা উন্নত করতে সাহায্য করতে পারে। বিশেষ করে, এই নোটবুকটি হবে:
- ব্যবহার চিত্র একজন ব্যক্তির হাসি সনাক্ত করতে একটি সহজ, সংকোচহীন স্নায়ুর নেটওয়ার্ক মডেল ট্রেন
tf.keras
এবং বড় মাপের CelebFaces গুণাবলী ( CelebA ) ডেটা সেটটি। - ন্যায্যতা সূচক ব্যবহার করে, বয়সের গোষ্ঠী জুড়ে একটি সাধারণভাবে ব্যবহৃত ন্যায্যতা মেট্রিকের বিপরীতে মডেলের কার্যকারিতা মূল্যায়ন করুন।
- একটি সাধারণ সীমাবদ্ধ অপ্টিমাইজেশান সমস্যা সেট আপ করুন বয়সের গোষ্ঠী জুড়ে ন্যায্য কর্মক্ষমতা অর্জন করতে।
- এখন সীমাবদ্ধ মডেলকে আবার শেখতে এবং আবার কর্মক্ষমতা মূল্যায়ন নিশ্চিত যে আমাদের মনোনীত সততা মেট্রিক উন্নত হয়েছে।
শেষ আপডেট: 3/11 ফেব্রুয়ারী 2020
স্থাপন
এই নোটবুক তৈরি করা হয়েছে Colaboratory , পাইথন 3 গুগল কম্পিউট ইঞ্জিন ব্যাকএন্ড সাথে সংযুক্ত। আপনি যদি এই নোটবুকটিকে একটি ভিন্ন পরিবেশে হোস্ট করতে চান, তাহলে নিচের কক্ষে প্রয়োজনীয় সমস্ত প্যাকেজ অন্তর্ভুক্ত করলে আপনার কোনো বড় সমস্যা হবে না।
মনে রাখবেন যে আপনি যখন প্রথমবার পিপ ইন্সটল চালান, আপনাকে রানটাইম পুনরায় চালু করতে বলা হতে পারে কারণ আগে থেকে ইনস্টল করা পুরানো প্যাকেজগুলি। একবার আপনি এটি করলে, সঠিক প্যাকেজগুলি ব্যবহার করা হবে।
পিপ ইনস্টল করে
!pip install -q -U pip==20.2
!pip install git+https://github.com/google-research/tensorflow_constrained_optimization
!pip install -q tensorflow-datasets tensorflow
!pip install fairness-indicators \
"absl-py==0.12.0" \
"apache-beam<3,>=2.34" \
"avro-python3==1.9.1" \
"pyzmq==17.0.0"
মনে রাখবেন যে আপনি কখন নীচের সেলটি চালাবেন তার উপর নির্ভর করে, আপনি শীঘ্রই TensorFlow 2.X-এ পরিবর্তন করার জন্য Colab-এ TensorFlow-এর ডিফল্ট সংস্করণ সম্পর্কে একটি সতর্কতা পেতে পারেন। আপনি নিরাপদে সেই সতর্কতা উপেক্ষা করতে পারেন কারণ এই নোটবুকটি TensorFlow 1.X এবং 2.X-এর সাথে সামঞ্জস্যপূর্ণ করার জন্য ডিজাইন করা হয়েছে৷
মডিউল আমদানি করুন
import os
import sys
import tempfile
import urllib
import tensorflow as tf
from tensorflow import keras
import tensorflow_datasets as tfds
tfds.disable_progress_bar()
import numpy as np
import tensorflow_constrained_optimization as tfco
from tensorflow_metadata.proto.v0 import schema_pb2
from tfx_bsl.tfxio import tensor_adapter
from tfx_bsl.tfxio import tf_example_record
উপরন্তু, আমরা কিছু আমদানি যোগ করি যা ন্যায্যতা সূচকগুলির জন্য নির্দিষ্ট যা আমরা মডেলের কর্মক্ষমতা মূল্যায়ন এবং কল্পনা করতে ব্যবহার করব।
ন্যায্যতা সূচক আমদানি সম্পর্কিত
import tensorflow_model_analysis as tfma
import fairness_indicators as fi
from google.protobuf import text_format
import apache_beam as beam
যদিও TFCO আগ্রহী এবং গ্রাফ এক্সিকিউশনের সাথে সামঞ্জস্যপূর্ণ, এই নোটবুকটি অনুমান করে যে টেনসরফ্লো 2.x-এর মতোই ডিফল্টভাবে আগ্রহী এক্সিকিউশন সক্ষম করা হয়েছে। নিশ্চিত করতে যে কোন কিছুই ভেঙে না পড়ে, নিচের ঘরে উদগ্রীব সম্পাদন সক্ষম করা হবে।
আগ্রহী এক্সিকিউশন এবং প্রিন্ট সংস্করণ সক্ষম করুন
if tf.__version__ < "2.0.0":
tf.compat.v1.enable_eager_execution()
print("Eager execution enabled.")
else:
print("Eager execution enabled by default.")
print("TensorFlow " + tf.__version__)
print("TFMA " + tfma.VERSION_STRING)
print("TFDS " + tfds.version.__version__)
print("FI " + fi.version.__version__)
Eager execution enabled by default. TensorFlow 2.8.0-rc0 TFMA 0.36.0 TFDS 4.4.0 FI 0.36.0
CelebA ডেটাসেট
CelebA একটি বড় মাপের মুখ অধিক 200,000 কীর্তি চিত্র, 40 অ্যাট্রিবিউট টিকা রচনা এবং 5 ল্যান্ডমার্ক অবস্থানগুলি (চোখ, মুখ ও নাক অবস্থানের) (যেমন চুলের ধরন, ফ্যাশন আনুষাঙ্গিক, মুখের বৈশিষ্ট্য, ইত্যাদি) সঙ্গে প্রতিটি সঙ্গে ডেটা সেটটি বৈশিষ্ট্যাবলী নয়। আরো বিস্তারিত জানার জন্য কটাক্ষপাত করা কাগজ । মালিকদের অনুমতি নিয়ে, আমরা Google ক্লাউড স্টোরেজ এই ডেটা সেটটি সংরক্ষণ এবং বেশিরভাগ মাধ্যমে এটি অ্যাক্সেস TensorFlow ডেটাসেটস ( tfds
) ।
এই নোটবুকে:
- হিসাবে "স্মিত" অ্যাট্রিবিউট * দ্বারা প্রতিনিধিত্ব আমাদের মডেল, শ্রেণীভুক্ত ছবিতে বিষয় স্মিত হয় কিনা চেষ্টা করবে।
- প্রশিক্ষণের সময় সম্পাদনের সময় এবং স্মৃতি কমাতে চিত্রগুলিকে 218x178 থেকে 28x28 করা হবে।
- বাইনারি "ইয়াং" অ্যাট্রিবিউট ব্যবহার করে আমাদের মডেলের পারফরম্যান্সের মূল্যায়ন করা হবে বয়সের গ্রুপে। আমরা এই নোটবুকে এটিকে "বয়স গ্রুপ" বলব।
* সামান্য তথ্য এই ডেটা সেটটি জন্য লেবেল পদ্ধতি সম্পর্কে উপলভ্য নেই যদিও, আমরা অনুমান করা হবে যে, "স্মিত" অ্যাট্রিবিউট বিষয় মুখের উপর একটি সন্তুষ্ট, সদয় বা আমোদিত অভিব্যক্তি দ্বারা নির্ধারিত হয়। এই কেস স্টাডির উদ্দেশ্যে, আমরা এই লেবেলগুলোকে গ্রাউন্ড ট্রুথ হিসেবে নেব।
gcs_base_dir = "gs://celeb_a_dataset/"
celeb_a_builder = tfds.builder("celeb_a", data_dir=gcs_base_dir, version='2.0.0')
celeb_a_builder.download_and_prepare()
num_test_shards_dict = {'0.3.0': 4, '2.0.0': 2} # Used because we download the test dataset separately
version = str(celeb_a_builder.info.version)
print('Celeb_A dataset version: %s' % version)
Celeb_A dataset version: 2.0.0
ডেটাসেট সহায়ক ফাংশন পরীক্ষা করুন
local_root = tempfile.mkdtemp(prefix='test-data')
def local_test_filename_base():
return local_root
def local_test_file_full_prefix():
return os.path.join(local_test_filename_base(), "celeb_a-test.tfrecord")
def copy_test_files_to_local():
filename_base = local_test_file_full_prefix()
num_test_shards = num_test_shards_dict[version]
for shard in range(num_test_shards):
url = "https://storage.googleapis.com/celeb_a_dataset/celeb_a/%s/celeb_a-test.tfrecord-0000%s-of-0000%s" % (version, shard, num_test_shards)
filename = "%s-0000%s-of-0000%s" % (filename_base, shard, num_test_shards)
res = urllib.request.urlretrieve(url, filename)
সতর্কতা
এগিয়ে যাওয়ার আগে, CelebA ব্যবহার করার ক্ষেত্রে বেশ কিছু বিবেচনার কথা মাথায় রাখতে হবে:
- যদিও নীতিগতভাবে এই নোটবুকটি মুখের ছবির যেকোন ডেটাসেট ব্যবহার করতে পারে, CelebA বেছে নেওয়া হয়েছিল কারণ এতে পাবলিক ব্যক্তিত্বের পাবলিক ডোমেন ছবি রয়েছে।
- CelebA-এর সমস্ত অ্যাট্রিবিউট অ্যানোটেশন বাইনারি বিভাগ হিসেবে কাজ করে। উদাহরণস্বরূপ, "তরুণ" বৈশিষ্ট্য (ডেটাসেট লেবেলার দ্বারা নির্ধারিত) চিত্রটিতে উপস্থিত বা অনুপস্থিত হিসাবে চিহ্নিত করা হয়।
- CelebA-এর শ্রেণীকরণগুলি গুণাবলীর প্রকৃত মানব বৈচিত্র্যকে প্রতিফলিত করে না।
- এই নোটবুকের উদ্দেশ্যে, "তরুণ" বৈশিষ্ট্য সম্বলিত বৈশিষ্ট্যটিকে "বয়স গোষ্ঠী" হিসাবে উল্লেখ করা হয়, যেখানে একটি ছবিতে "তরুণ" বৈশিষ্ট্যের উপস্থিতিটিকে "তরুণ" বয়সের সদস্য হিসাবে লেবেল করা হয় এবং "তরুণ" অ্যাট্রিবিউটের অনুপস্থিতিকে "নট ইয়াং" বয়সের সদস্য হিসাবে চিহ্নিত করা হয়েছে। এই তৈরি হিসাবে এই তথ্য উল্লেখ নেই অনুমানের হয় মূল কাগজ ।
- যেমন, এই নোটবুকে প্রশিক্ষিত মডেলগুলির কার্যকারিতা CelebA-এর লেখকদের দ্বারা অ্যাট্রিবিউটগুলি যেভাবে কার্যকরী করা হয়েছে এবং টীকা করা হয়েছে তার সাথে যুক্ত।
- এই মডেল যে লঙ্ঘন করবে যেমন বাণিজ্যিক উদ্দেশ্যে ব্যবহার করা উচিত নয় CelebA এর অ বাণিজ্যিক গবেষণা চুক্তি ।
ইনপুট ফাংশন সেট আপ করা হচ্ছে
পরবর্তী কোষগুলি ইনপুট পাইপলাইনকে স্ট্রিমলাইন করার পাশাপাশি কর্মক্ষমতা কল্পনা করতে সাহায্য করবে।
প্রথমে আমরা কিছু ডেটা-সম্পর্কিত ভেরিয়েবল সংজ্ঞায়িত করি এবং একটি প্রয়োজনীয় প্রিপ্রসেসিং ফাংশন সংজ্ঞায়িত করি।
ভেরিয়েবলের সংজ্ঞা দাও
ATTR_KEY = "attributes"
IMAGE_KEY = "image"
LABEL_KEY = "Smiling"
GROUP_KEY = "Young"
IMAGE_SIZE = 28
প্রিপ্রসেসিং ফাংশন সংজ্ঞায়িত করুন
def preprocess_input_dict(feat_dict):
# Separate out the image and target variable from the feature dictionary.
image = feat_dict[IMAGE_KEY]
label = feat_dict[ATTR_KEY][LABEL_KEY]
group = feat_dict[ATTR_KEY][GROUP_KEY]
# Resize and normalize image.
image = tf.cast(image, tf.float32)
image = tf.image.resize(image, [IMAGE_SIZE, IMAGE_SIZE])
image /= 255.0
# Cast label and group to float32.
label = tf.cast(label, tf.float32)
group = tf.cast(group, tf.float32)
feat_dict[IMAGE_KEY] = image
feat_dict[ATTR_KEY][LABEL_KEY] = label
feat_dict[ATTR_KEY][GROUP_KEY] = group
return feat_dict
get_image_and_label = lambda feat_dict: (feat_dict[IMAGE_KEY], feat_dict[ATTR_KEY][LABEL_KEY])
get_image_label_and_group = lambda feat_dict: (feat_dict[IMAGE_KEY], feat_dict[ATTR_KEY][LABEL_KEY], feat_dict[ATTR_KEY][GROUP_KEY])
তারপর, আমরা বাকি কোল্যাবে প্রয়োজনীয় ডেটা ফাংশন তৈরি করি।
# Train data returning either 2 or 3 elements (the third element being the group)
def celeb_a_train_data_wo_group(batch_size):
celeb_a_train_data = celeb_a_builder.as_dataset(split='train').shuffle(1024).repeat().batch(batch_size).map(preprocess_input_dict)
return celeb_a_train_data.map(get_image_and_label)
def celeb_a_train_data_w_group(batch_size):
celeb_a_train_data = celeb_a_builder.as_dataset(split='train').shuffle(1024).repeat().batch(batch_size).map(preprocess_input_dict)
return celeb_a_train_data.map(get_image_label_and_group)
# Test data for the overall evaluation
celeb_a_test_data = celeb_a_builder.as_dataset(split='test').batch(1).map(preprocess_input_dict).map(get_image_label_and_group)
# Copy test data locally to be able to read it into tfma
copy_test_files_to_local()
একটি সাধারণ DNN মডেল তৈরি করুন
কারণ এই নোটবুক TFCO উপর দৃষ্টি নিবদ্ধ করে, আমরা একটি সহজ, সংকোচহীন একত্রিত করবেন tf.keras.Sequential
মডেল।
আমরা কিছু জটিলতা (যেমন, আরও ঘন-সংযুক্ত স্তর, বিভিন্ন অ্যাক্টিভেশন ফাংশন অন্বেষণ, চিত্রের আকার বৃদ্ধি) যোগ করে মডেলের কার্যকারিতা ব্যাপকভাবে উন্নত করতে সক্ষম হতে পারি, তবে এটি TFCO লাইব্রেরি প্রয়োগ করা কতটা সহজ তা প্রদর্শনের লক্ষ্য থেকে বিভ্রান্ত হতে পারে। কেরাসের সাথে কাজ করার সময়। সেই কারণে, মডেলটিকে সহজ রাখা হবে — তবে এই স্থানটি অন্বেষণ করতে উত্সাহিত বোধ করুন৷
def create_model():
# For this notebook, accuracy will be used to evaluate performance.
METRICS = [
tf.keras.metrics.BinaryAccuracy(name='accuracy')
]
# The model consists of:
# 1. An input layer that represents the 28x28x3 image flatten.
# 2. A fully connected layer with 64 units activated by a ReLU function.
# 3. A single-unit readout layer to output real-scores instead of probabilities.
model = keras.Sequential([
keras.layers.Flatten(input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3), name='image'),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dense(1, activation=None)
])
# TFCO by default uses hinge loss — and that will also be used in the model.
model.compile(
optimizer=tf.keras.optimizers.Adam(0.001),
loss='hinge',
metrics=METRICS)
return model
আমরা পুনরুৎপাদনযোগ্য ফলাফল নিশ্চিত করার জন্য বীজ সেট করার জন্য একটি ফাংশন সংজ্ঞায়িত করি। মনে রাখবেন যে এই কোল্যাবটি একটি শিক্ষামূলক সরঞ্জাম হিসাবে বোঝানো হয়েছে এবং এতে একটি সূক্ষ্ম সুর করা উত্পাদন পাইপলাইনের স্থায়িত্ব নেই। একটি বীজ সেট না করে দৌড়ানো বিভিন্ন ফলাফল হতে পারে।
def set_seeds():
np.random.seed(121212)
tf.compat.v1.set_random_seed(212121)
ন্যায্যতা সূচক সাহায্যকারী ফাংশন
আমাদের মডেলকে প্রশিক্ষণ দেওয়ার আগে, আমরা বেশ কয়েকটি সহায়ক ফাংশন সংজ্ঞায়িত করি যা আমাদের ন্যায্যতা নির্দেশকের মাধ্যমে মডেলের কার্যকারিতা মূল্যায়ন করতে দেয়।
প্রথমত, আমরা আমাদের মডেলকে প্রশিক্ষণ দেওয়ার পরে সংরক্ষণ করার জন্য একটি সহায়ক ফাংশন তৈরি করি।
def save_model(model, subdir):
base_dir = tempfile.mkdtemp(prefix='saved_models')
model_location = os.path.join(base_dir, subdir)
model.save(model_location, save_format='tf')
return model_location
এর পরে, আমরা সঠিকভাবে TFMA এর মাধ্যমে ডেটা পাস করার জন্য প্রিপ্রসেস করার জন্য ব্যবহৃত ফাংশনগুলি সংজ্ঞায়িত করি।
এর জন্য ডেটা প্রিপ্রসেসিং ফাংশন
def tfds_filepattern_for_split(dataset_name, split):
return f"{local_test_file_full_prefix()}*"
class PreprocessCelebA(object):
"""Class that deserializes, decodes and applies additional preprocessing for CelebA input."""
def __init__(self, dataset_name):
builder = tfds.builder(dataset_name)
self.features = builder.info.features
example_specs = self.features.get_serialized_info()
self.parser = tfds.core.example_parser.ExampleParser(example_specs)
def __call__(self, serialized_example):
# Deserialize
deserialized_example = self.parser.parse_example(serialized_example)
# Decode
decoded_example = self.features.decode_example(deserialized_example)
# Additional preprocessing
image = decoded_example[IMAGE_KEY]
label = decoded_example[ATTR_KEY][LABEL_KEY]
# Resize and scale image.
image = tf.cast(image, tf.float32)
image = tf.image.resize(image, [IMAGE_SIZE, IMAGE_SIZE])
image /= 255.0
image = tf.reshape(image, [-1])
# Cast label and group to float32.
label = tf.cast(label, tf.float32)
group = decoded_example[ATTR_KEY][GROUP_KEY]
output = tf.train.Example()
output.features.feature[IMAGE_KEY].float_list.value.extend(image.numpy().tolist())
output.features.feature[LABEL_KEY].float_list.value.append(label.numpy())
output.features.feature[GROUP_KEY].bytes_list.value.append(b"Young" if group.numpy() else b'Not Young')
return output.SerializeToString()
def tfds_as_pcollection(beam_pipeline, dataset_name, split):
return (
beam_pipeline
| 'Read records' >> beam.io.ReadFromTFRecord(tfds_filepattern_for_split(dataset_name, split))
| 'Preprocess' >> beam.Map(PreprocessCelebA(dataset_name))
)
অবশেষে, আমরা একটি ফাংশন সংজ্ঞায়িত করি যা TFMA-তে ফলাফলগুলি মূল্যায়ন করে।
def get_eval_results(model_location, eval_subdir):
base_dir = tempfile.mkdtemp(prefix='saved_eval_results')
tfma_eval_result_path = os.path.join(base_dir, eval_subdir)
eval_config_pbtxt = """
model_specs {
label_key: "%s"
}
metrics_specs {
metrics {
class_name: "FairnessIndicators"
config: '{ "thresholds": [0.22, 0.5, 0.75] }'
}
metrics {
class_name: "ExampleCount"
}
}
slicing_specs {}
slicing_specs { feature_keys: "%s" }
options {
compute_confidence_intervals { value: False }
disabled_outputs{values: "analysis"}
}
""" % (LABEL_KEY, GROUP_KEY)
eval_config = text_format.Parse(eval_config_pbtxt, tfma.EvalConfig())
eval_shared_model = tfma.default_eval_shared_model(
eval_saved_model_path=model_location, tags=[tf.saved_model.SERVING])
schema_pbtxt = """
tensor_representation_group {
key: ""
value {
tensor_representation {
key: "%s"
value {
dense_tensor {
column_name: "%s"
shape {
dim { size: 28 }
dim { size: 28 }
dim { size: 3 }
}
}
}
}
}
}
feature {
name: "%s"
type: FLOAT
}
feature {
name: "%s"
type: FLOAT
}
feature {
name: "%s"
type: BYTES
}
""" % (IMAGE_KEY, IMAGE_KEY, IMAGE_KEY, LABEL_KEY, GROUP_KEY)
schema = text_format.Parse(schema_pbtxt, schema_pb2.Schema())
coder = tf_example_record.TFExampleBeamRecord(
physical_format='inmem', schema=schema,
raw_record_column_name=tfma.ARROW_INPUT_COLUMN)
tensor_adapter_config = tensor_adapter.TensorAdapterConfig(
arrow_schema=coder.ArrowSchema(),
tensor_representations=coder.TensorRepresentations())
# Run the fairness evaluation.
with beam.Pipeline() as pipeline:
_ = (
tfds_as_pcollection(pipeline, 'celeb_a', 'test')
| 'ExamplesToRecordBatch' >> coder.BeamSource()
| 'ExtractEvaluateAndWriteResults' >>
tfma.ExtractEvaluateAndWriteResults(
eval_config=eval_config,
eval_shared_model=eval_shared_model,
output_path=tfma_eval_result_path,
tensor_adapter_config=tensor_adapter_config)
)
return tfma.load_eval_result(output_path=tfma_eval_result_path)
ট্রেন এবং সীমাহীন মডেল মূল্যায়ন
মডেলটি এখন সংজ্ঞায়িত করা হয়েছে এবং ইনপুট পাইপলাইন রয়েছে, আমরা এখন আমাদের মডেল প্রশিক্ষণের জন্য প্রস্তুত। এক্সিকিউশনের সময় এবং মেমরির পরিমাণ কমাতে, আমরা শুধুমাত্র কয়েকটি পুনরাবৃত্তির মাধ্যমে ডেটাকে ছোট ব্যাচে কেটে মডেলটিকে প্রশিক্ষণ দেব।
লক্ষ্য করুন TensorFlow এই নোটবুক <2.0.0 চালানোর জন্য একটি থামিয়ে দেওয়া সাবধানবাণী হতে পারে np.where
। নিরাপদে এই সতর্কবার্তা উপেক্ষা করা যেমন TensorFlow ব্যবহার করে 2.x এ এই ঠিকানাগুলি tf.where
স্থানে np.where
।
BATCH_SIZE = 32
# Set seeds to get reproducible results
set_seeds()
model_unconstrained = create_model()
model_unconstrained.fit(celeb_a_train_data_wo_group(BATCH_SIZE), epochs=5, steps_per_epoch=1000)
Epoch 1/5 1000/1000 [==============================] - 12s 6ms/step - loss: 0.5038 - accuracy: 0.7733 Epoch 2/5 1000/1000 [==============================] - 7s 7ms/step - loss: 0.3800 - accuracy: 0.8301 Epoch 3/5 1000/1000 [==============================] - 6s 6ms/step - loss: 0.3598 - accuracy: 0.8427 Epoch 4/5 1000/1000 [==============================] - 25s 25ms/step - loss: 0.3435 - accuracy: 0.8474 Epoch 5/5 1000/1000 [==============================] - 5s 5ms/step - loss: 0.3402 - accuracy: 0.8479 <keras.callbacks.History at 0x7f0f5c476350>
পরীক্ষার ডেটাতে মডেলটিকে মূল্যায়ন করার ফলে চূড়ান্ত নির্ভুলতার স্কোর মাত্র 85% এর বেশি হওয়া উচিত। সূক্ষ্ম টিউনিং সহ একটি সাধারণ মডেলের জন্য খারাপ নয়।
print('Overall Results, Unconstrained')
celeb_a_test_data = celeb_a_builder.as_dataset(split='test').batch(1).map(preprocess_input_dict).map(get_image_label_and_group)
results = model_unconstrained.evaluate(celeb_a_test_data)
Overall Results, Unconstrained 19962/19962 [==============================] - 50s 2ms/step - loss: 0.2125 - accuracy: 0.8636
যাইহোক, বয়স শ্রেণীতে মূল্যায়ন করা কর্মক্ষমতা কিছু ত্রুটি প্রকাশ করতে পারে।
এটি আরও অন্বেষণ করতে, আমরা ন্যায্যতা সূচক (TFMA এর মাধ্যমে) দিয়ে মডেলটিকে মূল্যায়ন করি। বিশেষ করে, মিথ্যা ইতিবাচক হারে মূল্যায়ন করার সময় আমরা "তরুণ" এবং "নট ইয়াং" বিভাগের মধ্যে পারফরম্যান্সে উল্লেখযোগ্য ব্যবধান রয়েছে কিনা তা দেখতে আগ্রহী।
একটি মিথ্যা ইতিবাচক ত্রুটি ঘটে যখন মডেলটি ভুলভাবে ইতিবাচক শ্রেণীর ভবিষ্যদ্বাণী করে। এই প্রসঙ্গে, একটি মিথ্যা ইতিবাচক ফলাফল ঘটে যখন গ্রাউন্ড ট্রুথ একটি সেলিব্রিটি 'নট স্মাইলিং' এর একটি চিত্র এবং মডেল 'স্মাইলিং' ভবিষ্যদ্বাণী করে। এক্সটেনশনের মাধ্যমে, মিথ্যা ইতিবাচক হার, যা উপরের ভিজ্যুয়ালাইজেশনে ব্যবহৃত হয়, এটি একটি পরীক্ষার জন্য নির্ভুলতার পরিমাপ। যদিও এটি এই প্রেক্ষাপটে করা একটি অপেক্ষাকৃত জাগতিক ত্রুটি, মিথ্যা ইতিবাচক ত্রুটি কখনও কখনও আরও সমস্যাযুক্ত আচরণের কারণ হতে পারে। উদাহরণস্বরূপ, একটি স্প্যাম শ্রেণিবদ্ধকারীতে একটি মিথ্যা ইতিবাচক ত্রুটি একজন ব্যবহারকারীকে একটি গুরুত্বপূর্ণ ইমেল মিস করতে পারে৷
model_location = save_model(model_unconstrained, 'model_export_unconstrained')
eval_results_unconstrained = get_eval_results(model_location, 'eval_results_unconstrained')
2022-01-07 18:46:05.881112: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. INFO:tensorflow:Assets written to: /tmp/saved_modelswhxcqdry/model_export_unconstrained/assets INFO:tensorflow:Assets written to: /tmp/saved_modelswhxcqdry/model_export_unconstrained/assets WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features. WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. WARNING:apache_beam.io.tfrecordio:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:107: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version. Instructions for updating: Use eager execution and: `tf.data.TFRecordDataset(path)` WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:107: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version. Instructions for updating: Use eager execution and: `tf.data.TFRecordDataset(path)`
উপরে উল্লিখিত হিসাবে, আমরা মিথ্যা ইতিবাচক হারে মনোনিবেশ করছি। ন্যায্যতা সূচকের বর্তমান সংস্করণ (0.1.2) ডিফল্টরূপে মিথ্যা নেতিবাচক হার নির্বাচন করে। নীচের লাইনটি চালানোর পরে, আমরা যে মেট্রিকটিতে আগ্রহী তা দেখতে false_negative_rate নির্বাচন করুন এবং false_positive_rate নির্বাচন করুন।
tfma.addons.fairness.view.widget_view.render_fairness_indicator(eval_results_unconstrained)
FairnessIndicatorViewer(slicingMetrics=[{'sliceValue': 'Young', 'slice': 'Young:Young', 'metrics': {'example_c…
ফলাফলের উপরে দেন হিসেবে আমরা "ইয়াং" এবং "না ইয়াং" বিভাগগুলিতে মধ্যে একটি অনুপাতহীন ফাঁক দেখতে না।
এখানেই TFCO মিথ্যা ইতিবাচক হারকে আরও গ্রহণযোগ্য মাপকাঠির মধ্যে সীমাবদ্ধ করে সাহায্য করতে পারে।
সীমাবদ্ধ মডেল সেট আপ
হিসাবে নথিভুক্ত TFCO এর লাইব্রেরি , বহু সাহায্যকারী যে সহজে সমস্যা সীমাবদ্ধ করতে হবে আছেন:
-
tfco.rate_context()
- এই প্রতিটি বয়সের বিভাগ একটি বাধ্যতা নির্মাণের ব্যবহার করা হবে। -
tfco.RateMinimizationProblem()
- হার অভিব্যক্তি এখানে কমিয়ে আনা বয়স গ্রুপে মিথ্যা ইতিবাচক হার সাপেক্ষে হতে হবে। অন্য কথায়, বয়স গোষ্ঠীর মিথ্যা ইতিবাচক হার এবং সামগ্রিক ডেটাসেটের মধ্যে পার্থক্যের ভিত্তিতে কর্মক্ষমতা এখন মূল্যায়ন করা হবে। এই প্রদর্শনের জন্য, 5% এর কম বা সমান একটি মিথ্যা ইতিবাচক হার সীমাবদ্ধতা হিসাবে সেট করা হবে। -
tfco.ProxyLagrangianOptimizerV2()
- এই সাহায্যকারী যে আসলে হার বাধ্যতা সমস্যা সমাধানের হবে।
নীচের সেলটি এই সাহায্যকারীদের ন্যায্যতার সীমাবদ্ধতার সাথে মডেল প্রশিক্ষণ সেট আপ করার জন্য আহ্বান করবে।
# The batch size is needed to create the input, labels and group tensors.
# These tensors are initialized with all 0's. They will eventually be assigned
# the batch content to them. A large batch size is chosen so that there are
# enough number of "Young" and "Not Young" examples in each batch.
set_seeds()
model_constrained = create_model()
BATCH_SIZE = 32
# Create input tensor.
input_tensor = tf.Variable(
np.zeros((BATCH_SIZE, IMAGE_SIZE, IMAGE_SIZE, 3), dtype="float32"),
name="input")
# Create labels and group tensors (assuming both labels and groups are binary).
labels_tensor = tf.Variable(
np.zeros(BATCH_SIZE, dtype="float32"), name="labels")
groups_tensor = tf.Variable(
np.zeros(BATCH_SIZE, dtype="float32"), name="groups")
# Create a function that returns the applied 'model' to the input tensor
# and generates constrained predictions.
def predictions():
return model_constrained(input_tensor)
# Create overall context and subsetted context.
# The subsetted context contains subset of examples where group attribute < 1
# (i.e. the subset of "Not Young" celebrity images).
# "groups_tensor < 1" is used instead of "groups_tensor == 0" as the former
# would be a comparison on the tensor value, while the latter would be a
# comparison on the Tensor object.
context = tfco.rate_context(predictions, labels=lambda:labels_tensor)
context_subset = context.subset(lambda:groups_tensor < 1)
# Setup list of constraints.
# In this notebook, the constraint will just be: FPR to less or equal to 5%.
constraints = [tfco.false_positive_rate(context_subset) <= 0.05]
# Setup rate minimization problem: minimize overall error rate s.t. constraints.
problem = tfco.RateMinimizationProblem(tfco.error_rate(context), constraints)
# Create constrained optimizer and obtain train_op.
# Separate optimizers are specified for the objective and constraints
optimizer = tfco.ProxyLagrangianOptimizerV2(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
constraint_optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
num_constraints=problem.num_constraints)
# A list of all trainable variables is also needed to use TFCO.
var_list = (model_constrained.trainable_weights + list(problem.trainable_variables) +
optimizer.trainable_variables())
মডেলটি এখন সেট আপ করা হয়েছে এবং বয়সের গ্রুপ জুড়ে মিথ্যা ইতিবাচক হারের সীমাবদ্ধতার সাথে প্রশিক্ষণের জন্য প্রস্তুত।
এখন, কারণ সবাধ মডেল গত পুনরাবৃত্তির অগত্যা সংজ্ঞায়িত বাধ্যতা পরিপ্রেক্ষিতে সেরা পারফর্মিং মডেল নাও হতে পারে, TFCO গ্রন্থাগার দিয়ে সজ্জিত করা আসে tfco.find_best_candidate_index()
যে করতে পারেন সাহায্যের সেরা বারবার বেশী এক বিশেষ স্থান পছন্দ প্রতিটি পর দেখা যুগ চিন্তা করুন tfco.find_best_candidate_index()
একটি যোগ অনুসন্ধানমূলক আলাদাভাবে প্রশিক্ষণ ডেটা থেকে সম্মান সঙ্গে সঠিকতা এবং সততা বাধ্যতা (এই ক্ষেত্রে, বয়সের জুড়ে মিথ্যা ইতিবাচক রেট) উপর ভিত্তি করে ফলাফল প্রতিটি নিম্ন স্তরে গণ্য হয়। এইভাবে, এটি সামগ্রিক নির্ভুলতা এবং ন্যায্যতার সীমাবদ্ধতার মধ্যে একটি ভাল ট্রেড-অফ অনুসন্ধান করতে পারে।
নিম্নলিখিত কক্ষগুলি প্রতি পুনরাবৃত্তির সেরা পারফরম্যান্স মডেল খুঁজে বের করার সময় সীমাবদ্ধতার সাথে প্রশিক্ষণ শুরু করবে।
# Obtain train set batches.
NUM_ITERATIONS = 100 # Number of training iterations.
SKIP_ITERATIONS = 10 # Print training stats once in this many iterations.
# Create temp directory for saving snapshots of models.
temp_directory = tempfile.mktemp()
os.mkdir(temp_directory)
# List of objective and constraints across iterations.
objective_list = []
violations_list = []
# Training iterations.
iteration_count = 0
for (image, label, group) in celeb_a_train_data_w_group(BATCH_SIZE):
# Assign current batch to input, labels and groups tensors.
input_tensor.assign(image)
labels_tensor.assign(label)
groups_tensor.assign(group)
# Run gradient update.
optimizer.minimize(problem, var_list=var_list)
# Record objective and violations.
objective = problem.objective()
violations = problem.constraints()
sys.stdout.write(
"\r Iteration %d: Hinge Loss = %.3f, Max. Constraint Violation = %.3f"
% (iteration_count + 1, objective, max(violations)))
# Snapshot model once in SKIP_ITERATIONS iterations.
if iteration_count % SKIP_ITERATIONS == 0:
objective_list.append(objective)
violations_list.append(violations)
# Save snapshot of model weights.
model_constrained.save_weights(
temp_directory + "/celeb_a_constrained_" +
str(iteration_count / SKIP_ITERATIONS) + ".h5")
iteration_count += 1
if iteration_count >= NUM_ITERATIONS:
break
# Choose best model from recorded iterates and load that model.
best_index = tfco.find_best_candidate_index(
np.array(objective_list), np.array(violations_list))
model_constrained.load_weights(
temp_directory + "/celeb_a_constrained_" + str(best_index) + ".0.h5")
# Remove temp directory.
os.system("rm -r " + temp_directory)
Iteration 100: Hinge Loss = 0.614, Max. Constraint Violation = 0.268 0
সীমাবদ্ধতা প্রয়োগ করার পর, আমরা ফেয়ারনেস ইন্ডিকেটর ব্যবহার করে আবারও ফলাফল মূল্যায়ন করি।
model_location = save_model(model_constrained, 'model_export_constrained')
eval_result_constrained = get_eval_results(model_location, 'eval_results_constrained')
INFO:tensorflow:Assets written to: /tmp/saved_modelsbztxt9fy/model_export_constrained/assets INFO:tensorflow:Assets written to: /tmp/saved_modelsbztxt9fy/model_export_constrained/assets WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
আগের বারের মতো আমরা ফেয়ারনেস ইন্ডিকেটর ব্যবহার করেছি, আমরা যে মেট্রিকটিতে আগ্রহী তা দেখতে false_negative_rate এবং false_positive_rate নির্বাচন করেছিলাম।
মনে রাখবেন যে আমাদের মডেলের দুটি সংস্করণকে মোটামুটিভাবে তুলনা করার জন্য, থ্রেশহোল্ডগুলি ব্যবহার করা গুরুত্বপূর্ণ যা সামগ্রিক মিথ্যা ইতিবাচক হারকে মোটামুটি সমান হিসাবে সেট করে৷ এটি নিশ্চিত করে যে আমরা কেবলমাত্র থ্রেশহোল্ড সীমানা সরানোর সমতুল্য মডেলের পরিবর্তনের বিপরীতে প্রকৃত পরিবর্তনের দিকে তাকিয়ে আছি। আমাদের ক্ষেত্রে, 0.5-এ সীমাবদ্ধ মডেল এবং 0.22-এ সীমাবদ্ধ মডেলের তুলনা করা মডেলগুলির জন্য একটি ন্যায্য তুলনা প্রদান করে।
eval_results_dict = {
'constrained': eval_result_constrained,
'unconstrained': eval_results_unconstrained,
}
tfma.addons.fairness.view.widget_view.render_fairness_indicator(multi_eval_results=eval_results_dict)
FairnessIndicatorViewer(evalName='constrained', evalNameCompare='unconstrained', slicingMetrics=[{'sliceValue'…
হারের সীমাবদ্ধতা হিসাবে আরও জটিল প্রয়োজনীয়তা প্রকাশ করার TFCO এর ক্ষমতার সাথে, আমরা এই মডেলটিকে সামগ্রিক কর্মক্ষমতার উপর সামান্য প্রভাব সহ আরও পছন্দসই ফলাফল অর্জনে সহায়তা করেছি। অবশ্যই, উন্নতির জন্য এখনও অবকাশ রয়েছে, তবে অন্তত TFCO এমন একটি মডেল খুঁজে পেতে সক্ষম হয়েছিল যা সীমাবদ্ধতাকে সন্তুষ্ট করার কাছাকাছি যায় এবং গ্রুপগুলির মধ্যে যতটা সম্ভব বৈষম্য কমিয়ে দেয়।