• বিভিন্ন লাইব্রেরীর ব্যবহার

    বিভিন্ন লাইব্রেরীর ব্যবহার

    আর্টিফিশিয়াল নিউরাল নেটওয়ার্কের গভীরের কর্মকাণ্ড গুলোর উপর যথেষ্ট পরিমাণ স্বচ্ছ ধারনা থাকার পরেই কেবল এরকম কিছু লাইব্রেরীর ব্যবহার করা উচিৎ হবে। TensorFlowবা সিমিলার লাইব্রেরী গুলো আসলে কি করে?আপনি ম্যানুয়ালি হয়ত Matrix Multiplication, Activation Function, Cost Functionবা Gradient Descentকরার জন্য এবং নিউরাল নেটওয়ার্কের লেয়ার বা নিউরন গুলো ডিফাইন করার জন্য এক গাদা কোড লিখবেন। যেভাবে এখন পর্যন্ত আমরা করেছি। আবার হয়ত,ইমেজ বা সাইন্ড নিয়ে কাজ করার সময় প্রাথমিক স্টেজে ইমেজ/সাউন্ড ডাটা ম্যানিপুলেট করার জন্যও কিছু কোড লিখবেন,যেমন -ইমেজকে গ্রেস্কেলে কনভার্ট করা,চ্যানেল আলাদা করা,ডাইমেনশন ঠিক ঠাক করা ইত্যাদি। মেশিন লার্নিং এবং ডিপ লার্নিং লাইব্রেরী গুলো বস্তুত এই ম্যানুয়াল কাজ গুলোর জন্যই কিছু রেডিমেড ফাংশন বা মেথড বানিয়ে রেখেছে। অর্থাৎ যে কাজ গুলো সবসময়ই করতে হয় যেকোনো মডেল নিয়ে কাজ করার সময়,সেগুলোর জন্য বিভিন্ন হেল্পার ফাংশন এবং আরও কিছু উপকারী ও গুরুত্বপূর্ণ ফিচার নিয়েই এরকম লাইব্রেরী গুলো তৈরি।
    এগুলোকে হাই লেভেল বলতে হবে কারন আপনি অনেক ফাংশনের শুধু নাম ব্যবহার করেই সেটার ইমপ্লিমেন্টেশন করে ফেলতে পারেন। সেগুলোর গভীরে আসলেই কি ম্যাথ বা লজিক কাজ করছে তা জানা লাগবে না। এমনকি TensorFlow, Theano টাইপের হাই লেভেল লাইব্রেরীর উপর ভিত্তি করেও আরও হাই লেভেল লাইব্রেরী তৈরি হচ্ছে, যেমন - Keras. যত হাই লেভেল, তত বেশি অ্যাবসট্র্যাক্ট লেয়ার অর্থাৎ আপনার কাছ থেকে তত বেশি কর্মকাণ্ড হাইড করে রাখা। তাই, সবসময় হাই লেভেল লাইব্রেরী ব্যবহারে অভ্যস্ত হওয়া উচিৎ নয়। এটা সব রকম কন্টেক্সট এর জন্যই মেনে চলা উচিৎ। সেটা মেশিন লার্নিং হোক বা সাধারণ প্রোগ্রামিং বা ডেভেলপমেন্ট হোক।

    TensorFlow পরিচিতি

    যাই হোক TensorFlow কিন্তু Google এর ডেভেলপ করা লাইব্রেরী আর তাই আমি অন্তত এটাকে সুদূরপ্রসারী মনে করি। C/C++ আছে এই লাইব্রেরীর ব্যাকএন্ডে আর ফ্রন্টএন্ড ইন্টারফেইস আছে পাইথন এবং অন্য ল্যাঙ্গুয়েজের জন্য। জটিল নিউমেরিক্যাল ক্যালকুলেশন সম্পন্ন টাস্কগুলোকে সহজ এবং টাইম ইফিসিয়েন্ট করার জন্যই এই লাইব্রেরীর আবির্ভাব। ন্যাটিভ পাইথনে যার একটু ল্যাগ ছিল। আর এই লাইব্রেরী কাজ করে Data Flow Graph স্টাইলে অর্থাৎ ম্যাথেম্যাটিক্যাল অপারেশন নিয়ে নোড (Node) এবং মাল্টিডাইমেনশনাল অ্যারে নিয়ে এইজ (Edge) -এর সমন্বয়ে একটি ডাটা ফ্লো গ্রাফ তৈরি হয়।
    আপনি কি আগে জানতেন - বিশেষ ধরনের মাল্টিডাইমেনশনাল অ্যারে টাইপের ডাটা স্ট্রাকচারকেই Tensor বলে? :)
    0 ডাইমেনশন মানে কোন ভ্যলুর একটাই অবস্থা/অস্তিত্ব যেমন একটা বিন্দু। 1 ডাইমেনশন মানে শুধু একদিকে গমন করে এরকম কিছু ডাটা পয়েন্ট। যেমন আমাদের অতি পরিচিত সাধারণ একটি 1D অ্যারে - [5, 10, 15, 20] এরকম. 2D ডাইমেনশনের উদাহরণ হতে পারে একটি ম্যাট্রিক্স, যেমন - একটা গ্রে-স্কেল ইমেজের পিক্সেল রিপ্রেজেন্টেশন। সেটা আমরা যেকোনো প্রোগ্রামিং ল্যাঙ্গুয়েজেই মাঝে মধ্যে ইমপ্লিমেন্ট করে থাকি এভাবে - [[210 100 255], [200 150 160], [210 0 100]]. 3D এর উদাহরণ হতে পারে একটি কালার ফটোর ম্যাট্রিক্স রিপ্রেজেন্টশন যেখানে Red, Green, Blue প্রত্যেকটি কালারের জন্য তিনটি আলাদা আলাদা 2D ম্যাট্রিক্স থাকে এবং সেগুলো একটার উপর আরেকটা বসিয়ে একটি অবস্থানের তিনটি আলাদা ম্যাট্রিক্সের সেল ভ্যালু হিসাব করে কালার তৈরি করে (নিচের মত),
    4D এর উদাহরণ হতে পারে যখন একটি 3D ডাটা অবজেক্ট সময়ের সাথে পরিবর্তন হয়। সেই ডাইমেনশনটাকে TimeSpace ডাইমেনশনও বলা হয়ে থাকে।
    আমরা TensorFlow দিয়ে উপরে আলোচিত কয়েকটি ডাইমেনশনের ডাটা অবজেক্টকে তৈরি করতে পারি (কোড এখন না বুঝলেও একটু পরেই বুঝতে পারবেন),
    import tensorflow as tf
    scalar = tf.constant([2])
    vector = tf.constant([3, 4, 5])
    matrix = tf.constant([[6, 7, 8], [9, 10, 11], [12, 13, 14]])
    tensor = tf.constant([ [[6, 7, 8], [9, 10, 11], [12, 13, 14]], [[15, 16, 17], [18, 19, 20], [21, 22, 23]] , [[15, 16, 17], [18, 19, 20], [21, 22, 23]] ])
    with tf.Session() as session:
    result = session.run(scalar)
    print("Scalar Data Example:\n", result)
    result = session.run(vector)
    print("\nVector Data:\n", result)
    result = session.run(matrix)
    print("\nMatrix:\n", result)
    result = session.run(tensor)
    print("\nTensor:\n", result)
    আউটপুট,
    Scalar Data Example:
    [2]
    Vector Data:
    [3 4 5]
    Matrix:
    [[ 6 7 8]
    [ 9 10 11]
    [12 13 14]]
    Tensor:
    [[[ 6 7 8]
    [ 9 10 11]
    [12 13 14]]
    [[15 16 17]
    [18 19 20]
    [21 22 23]]
    [[15 16 17]
    [18 19 20]
    [21 22 23]]]
    যা হোক, TensorFlow নিয়ে কাজ করার ধাপ দুইটা - উপরে উল্লেখিত স্টাইলে গ্রাফ তৈরি এবং তারপর সেই গ্রাফকে রান বা এক্সিকিউট করা। আবার বলি, গ্রাফের মধ্যে থাকে কিছু ডিফাইন করা অপারেশন।

    TensorFlow ব্যাসিক

    যেহেতু এটা পাইথন লাইব্রেরী ব্যতীত আর কিছুই না। তাই এর ইন্সটলেশন আর দশটা স্বাভাবিক পাইথন লাইব্রেরীর মতই। অর্থাৎ, আপনার পছন্দের মেশিনে বা পাইথন রিয়েল/ভার্চুয়াল এনভায়রনমেন্টে pip ইন্সটলার দিয়ে সহজেই ইন্সটল করে নিতে পারেন নিচের কমান্ড ইস্যু। করে।
    pip3 install --upgrade tensorflow #I only know what modern Python is. No idea what 2 vs 3 means.
    এর ইন্সটলেশন নিয়ে অযথাই প্যাঁচানোর মানে হয় না। যেখানে ইচ্ছা এই লাইব্রেরী ইন্সটল দিবেন। Anaconda, Miniconda হাবিযাবি আপাতত ভুলে জান। আপনার কম্পিউটার আছে, সেই কম্পিউটারে পাইথন ইন্সটলড অবস্থায় আছে। সাথে ধরে নিচ্ছি pip ইন্সটল্ড আছে। ব্যস pip দিয়ে TensorFlow ইন্সটল করে নিবেন আর নিচের মত প্রোগ্রাম লিখে রান করতে থাকবেন স্ক্রিপ্ট (বা মডিউল) মুডে।
    নিচের প্রোগ্রামে আমরা TensorFlow দিয়ে একটি খুব সহজ কম্পিউটেশন করেছি যাতে আমরা ব্যাসিক অপারেশন এর ধাপটা সম্বন্ধে পরিষ্কার ধারনা পাই।
    import tensorflow as tf
    a = tf.constant([2])
    b = tf.constant([3])
    c = tf.add(a,b)
    session = tf.Session()
    result = session.run(c)
    print(result)
    session.close()
    প্রথমেই লাইব্রেরীকে ইম্পরট করা হয়েছে। তারপর দুটো Source Operation (যে অপারেশনের বাইরে থেকে ইনপুট দরকার নাই বা Source Ops) ডিফাইন করা হয়েছে। এই ধরনের সোর্স অপ্স, অন্য অপারেশনের কাছে তাদের তথ্য পাঠায় যেখানে মুল কম্পিউটেশনটা ঘটে। এখানে a, b তে দুটো সোর্স অপ্স tf.constant([2]) এবং tf.constant([3]) এর আউটপুট জমা হচ্ছে। এরপরে লাইনে আমরা আরেকটি কম্পিউটেশনাল অপারেশন tf.add(a,b) ডিফাইন করেছি (এটা কিন্তু ইনপুট পায়)।
    এরপর আছে Session. এটা জেনে রাখা গুরুত্বপূর্ণ। যখন বিভিন্ন অপারশন মিলিয়ে একটি গ্রাফ ডিজাইন করা হয় তখন সেটার রান করানোর আগে পুরো গ্রাফকে একটি সেশনে স্টোর করতে হয়। সেশনটি সব অপেরাশন গুলোকে ট্রান্সলেট করে এবং যে ডিভাইসে এই কম্পিউটেশনটা ঘটবে তার কাছে পাঠিয়ে দেয়। একারণেই আমরা আমাদের গ্রাফকে সেশনে স্টোর করার জন্য একটি Session অবজেক্ট তৈরি করছি। এরপর ওই সেশনকে রান করিয়ে আমরা একটু আগে ডিফাইন করা c অপারশনের আউটপুট দেখতে চাচ্ছি। শেষ লাইনের মাধ্যমে সেশনটি ক্লোজ করা হয়। (ফাইল অপারেশনের কথা মনে পরছে?)
    বার বার সেশন তৈরি করা এবং কাজ শেষে সেশন ক্লোজ করার ঝামেলা থেকে মুক্তি পেতে আমরা পাইথনের with ব্লকের সাহায্য নিতে পারি নিচের মত,
    import tensorflow as tf
    a = tf.constant([2])
    b = tf.constant([3])
    c = tf.add(a,b)
    with tf.Session() as session:
    result = session.run(c)
    print(result)
    দুটো প্রোগ্রামের আউটপুট একই আসবে [5]. এ অবস্থায় হয়ত মনে হচ্ছে নর্মাল একটা যোগ করতে এতো কাহিনী? আসলে এটার মাধ্যমে আপনি বুঝতে পারলেন TensorFlow কিভাবে কাজ করে। কিন্তু এই লেভেলের সস্থা কাজ নিশ্চয়ই আপনি TensorFlow দিয়ে করাবেন না, তাই না? অতি জটিল কম্পিউটেশন সহজ করার সাথে সাথে এই লাইব্রেরীর আরও কিছু সুবিধার মধ্যে আছে - আপনি একই গ্রাফ যেকোনো রকম হার্ডওয়্যার প্ল্যাটফর্মে রান করাতে পারবেন। CPU, GPU, Cluster বা Android, iOS. যাই হোক। বলে নেয়া ভালো Google I/O 17 এ Google কিন্তু নতুন এক ধরনের হার্ডওয়্যার TPU (Tensor Processing Unit) রিলিজ দিয়েছে যা স্পেশালি Tensor ভিত্তিক কম্পিউটেশনের জন্য ইফেক্টিভলি ডিজাইন করা।
    আরেকবার আমরা TensoFlow এর একটা এক লাইনের সংজ্ঞা লিখে ফেলি - “একটি কম্পিউটেশন গ্রাফে বিভিন্ন অপারেশনের মধ্যে টেনসর ফর্মে ডাটা আদান প্রদান করে একবারে পুরো কম্পিউটেশন যেকোনো হার্ডওয়্যারে সম্পন্ন করার জন্য একটি মডেল বা লাইব্রেরী হচ্ছে TensorFlow.” আর এতো লম্বা মনে না থাকলে শুধু এটুকু মনে রাখুন এটা একটা “কম্পিউটেশনাল লাইব্রেরী” :D

    ভ্যারিয়েবল ও প্লেসহোল্ডার

    এখন যেহেতু আমরা ডাটা স্ট্রাকচার গুলো নিয়ে মোটামুটি একটা ধারনা পেলাম, চলুন দেখি TensorFlow কিভাবে ভ্যারিয়েবল হ্যান্ডেল করে। ভ্যারিয়েবল ডিফাইন করতে হয় tf.Variable() স্টেটমেন্টের মাধ্যমে। তবে মনে রাখা জরুরি - কম্পিউটেশন গ্রাফে ভ্যারিয়েবল গুলো ব্যবহারের জন্য সেগুলোকে ইনিসিয়ালাইজ করতে হবে (গ্রাফকে সেশনে রান করানোর আগেই)। এটা করা হয় tf. global_variables_initializer() এর মাধ্যমে। কোন ভ্যারিয়েবলের ভ্যালু আপডেট করার জন্য আমাদেরকে assign অপারেশনকে রান করতে হয়।
    নিচের প্রোগ্রামটি খেয়াল করি,
    import tensorflow as tf
    state = tf.Variable(0)
    one = tf.constant(1)
    new_value = tf.add(state, one)
    update = tf.assign(state, new_value)
    init_op = tf.global_variables_initializer()
    with tf.Session() as session:
    session.run(init_op)
    print(session.run(state))
    for _ in range(3):
    session.run(update)
    print(session.run(state))
    উপরের প্রোগ্রামে, প্রথমেই tensorflow ইম্পোরট করে নেয়া হয়েছে। এরপর একটি ভ্যারিয়েবল state, ডিফাইন এবং ইনিসিয়ালাইজ করা হয়েছে 0 ভ্যালু নিয়ে। এরপর একটি source ops ডিফাইন করা হয়েছে। এরপর একটি কম্পিউটেশনাল অপারেশন, add এর ব্যবহার করা হয়েছে যা মূলত state ভ্যারিয়েবলের সাথে 1 যোগ করে। কিন্তু যেহেতু state ভ্যারিয়েবলের মান এখনো পরিবর্তন (update) হয় নি, তাই সেটা করার জন্য একটি assign অপারশন ডিফাইন করতে হচ্ছে। এরপরের লাইনে, উপরোক্ত ভ্যারিয়েবলকে ইনিসিয়ালাইজ করা হয়েছে কম্পিউটেশন গ্রাফে সেগুলো ব্যবহার করার জন্য। অতঃপর একটি with ব্লকের মধ্যে, সেশন অবজেক্টের মাধ্যমে, প্রথমে ভ্যারিয়েবল ইনিসিয়ালাইজার অপারেশনকে রান করা হয়েছে। এবং state ভ্যারিয়েবলের শুরুর মান প্রিন্ট করা হয়েছে। এটার জন্য স্ক্রিনে প্রথম প্রিন্ট ভ্যালু 0 আসছে। এরপর একটি ফর লুপ চালিয়ে update অপারেশনকে রান করানো হচ্ছে এবং প্রত্যেকবার আপডেট অপারেশনের পর state ভ্যারিয়েবলের মান প্রিন্ট করা হচ্ছে।
    আউটপুট,
    0
    1
    2
    3
    এবার আসি প্লেস হোল্ডারের প্রসঙ্গে। যদি আপনি TensorFlow মডেলের বাইরে থেকে এটাকে ডাটা ইনপুট/ফিড করাতে চান তাহলে দরকার পরে এই প্লেসহোল্ডার। প্লেস হোল্ডার একরকম ভ্যারিয়েবল যেটাতে আসলে নির্দিষ্ট একটি সময় পর্যন্ত এর আসল কোন ভ্যালু থাকে না শুধু স্ট্রাকচার থাকে। একটু অন্যভাবে বলতে গেলে, প্লেসহোল্ডার মানে আপনার মডেলের কিছু গর্ত, যে গর্ত গুলোতে আপনি কিছু পরে ডাটা ঢুকাবেন। প্লেসহোল্ডার তৈরি করতে placeholder মেথড ব্যবহার করতে হয়। তৈরির সময় ডাটা টাইপ এবং এর প্রেসিশন ভ্যালুও ডিফাইন করতে হবে। নিচের টেবিলে প্রত্যেকটি ডাটাটাইপ এবং সে অনুযায়ী সিনট্যাক্স দেয়া আছে,
    এবার নিচের প্রোগ্রামটি দেখি,
    import tensorflow as tf
    a = tf.placeholder(tf.float32)
    b = a * 2
    with tf.Session() as session:
    result = session.run(b)
    print(result)
    এখানে প্রথমে একটি প্লেসহোল্ডার ডিফাইন করা হয়েছে float টাইপের। অতঃপর সেই প্লেসহোল্ডার ভ্যারিয়েবলের সাথে 2 গুন করার অপারশন ডিফাইন করা হয়েছে b তে (স্বাভাবিক যোগ বিয়োগের ক্ষেত্রে tf এর মেথড ব্যবহার না করে, স্বাভাবিক অপারেটর ব্যবহার করলেও চলে)। এবং স্বাভাবিক ভাবে session এর রান মেথডের মধ্যে b কে চালিয়ে দিয়ে এই অপারশণকে রান করার কথা বলা হচ্ছে। সাথে result প্রিন্ট এর কথা বলা হচ্ছে। কিন্তু এই প্রোগ্রাম এরর থ্রো করবে (যেমন- You must feed a value for placeholder tensor), কারন প্লেসহোল্ডার ডিফাইন করলেও গ্রাফ রান করানোর সময় আমরা সেই প্লেসহোল্ডারের জন্য আসল কোন ভ্যালু গ্রাফ/মডেলের মধ্যে পাঠাই নি। পাঠানোর কাজটা খুবি সহজ, run মেথডের আরেকটি আর্গুমেন্ট হিসেবে আমরা প্লেসহোল্ডারের আসল ভ্যালু পাস করে দিতে পারি নিচের মত। পাস করার সময় প্লেসহোল্ডারের নাম এবং করেস্পন্ডীং ভ্যালুকে পাইথন ডিকশনারি ফরম্যাটে পাঠাতে হবে।
    import tensorflow as tf
    a = tf.placeholder(tf.float32)
    b = a * 2
    with tf.Session() as session:
    result = session.run(b, feed_dict={a:3.5})
    print(result)
    আউটপুট আসবে 7.0
    যেহেতু TensorFlow তে আমরা মাল্টি ডাইমেনশনাল ডাটা পাস করতে পারি। তাই চাইলে আমরা a এর ভ্যালু হিসেবে একটি Tensor -ও পাঠিয়ে দেখতে পারি। সেই টেনসরের উপর আমাদের ডিফাইন করা গুন a*2 -ই অ্যাপ্লাই হবে। নিচের প্রোগ্রাম দেখুন,
    import tensorflow as tf
    a = tf.placeholder(tf.float32)
    b = a * 2
    with tf.Session() as session:
    result = session.run(b, feed_dict={a:[ [[6, 7, 8], [9, 10, 11], [12, 13, 14]], [[15, 16, 17], [18, 19, 20], [21, 22, 23]] , [[15, 16, 17], [18, 19, 20], [21, 22, 23]] ]})
    print(result)
    আউটপুট,
    [[[ 12. 14. 16.]
    [ 18. 20. 22.]
    [ 24. 26. 28.]]
    [[ 30. 32. 34.]
    [ 36. 38. 40.]
    [ 42. 44. 46.]]
    [[ 30. 32. 34.]
    [ 36. 38. 40.]
    [ 42. 44. 46.]]]





  • 0 comments:

    Post a Comment

    New Research

    Attention Mechanism Based Multi Feature Fusion Forest for Hyperspectral Image Classification.

    CBS-GAN: A Band Selection Based Generative Adversarial Net for Hyperspectral Sample Generation.

    Multi-feature Fusion based Deep Forest for Hyperspectral Image Classification.

    ADDRESS

    388 Lumo Rd, Hongshan, Wuhan, Hubei, China

    EMAIL

    contact-m.zamanb@yahoo.com
    mostofa.zaman@cug.edu.cn

    TELEPHONE

    #
    #

    MOBILE

    +8615527370302,
    +8807171546477