• কীভাবে টেনসরফ্লো ব্যবহার করতে পারি। চল শুরু করা যাক.

    কীভাবে  টেনসরফ্লো ব্যবহার করতে পারি।
    চল শুরু করা যাক.

    Hello Codacus

    আমরা সফলভাবে টেনসরফ্লো ইনস্টল করেছি তা পরীক্ষা করার জন্য এই কোডটি ঠিকঠাকভাবে কাজ করছে কিনা তা দেখতে এটি চালানো যাক.

    import tensorflow as tf
    hello = tf.constant('Hello, Codacus!')
    sess = tf.Session()
    print(sess.run(hello))
    যদি কোনও ত্রুটি না থাকে তবে আপনার আউটপুটে "হ্যালো, কোডাকাস" পাওয়া উচিত.

    #টেনসরফ্লো বেসিক ধারণা
    টেনসরফ্লোতে মূল ধারণাটি রয়েছে যা আমাদের বুঝতে হবে। 
    • প্লেসহোল্ডার Placeholder
    • ভেরিয়েবল Variables
    • অপারেশন Operation
    • সেশন Session

    টেনসরফ্লো নিয়ে কাজ করার সময় আমরা এই তিনটি বিষয় নিয়ে কাজ করব। এগুলি সম্পর্কে স্বতন্ত্রভাবে একের পর এক আলোচনা করা যাক
    • প্লেসহোল্ডার Placeholder
    স্থানধারকরা টার্মিনাল / ডেটা পয়েন্ট যার মাধ্যমে আমরা যে নেটওয়ার্কটি তৈরি করব তাতে ডেটা ফিড করব। এটি আমাদের ইনপুট এবং আউটপুট ডেটার জন্য গেট পয়েন্টের মতো।

    কিছু স্থানধারক তৈরি করদিন
    inputs=tf.placeholder('float',[None,2],name='Input')
    targets=tf.placeholder('float',name='Target')
    সুতরাং আমরা দুটি স্থানধারক ডেটা টাইপ তৈরি করেছি যা প্লেসোল্ডারকে ফিড করবে float, দ্বিতীয় প্যারামিটারটি ইনপুটটির আকার। টেনসরফ্লোতে ডেটা ম্যাট্রিক্স আকারে নেটওয়ার্কের মাধ্যমে প্রবাহিত হয়।
    সুতরাং আসুন আমাদের 3 ইনপুট নিউরন রয়েছে বলে দিন
    তারপরে আমাদের ইনপুট ডেটা 3 টি মানের একটি তালিকা হওয়া উচিত উদাহরণস্বরূপ [1,2,3]
    এখন ধরা যাক আমাদের উদাহরণস্বরূপ 4 টি ইনপুট রয়েছে
    [1,2,3]
    [2,4,3]
    [2,8,6]
    [5,4,3]
    এবং আমরা একটি ব্যাচে তিনটি ইনপুট ফিড করতে চাই ইনপুটটির আকারটি হবে [4,3]এখন আসুন আমরা আসি যে আমরা একই সাথে কতগুলি ইনপুট সেট খাওয়াচ্ছি তা জানি না। এটি 1 হতে পারে এটি একবারে 100 সেট হতে পারে। সুতরাং আমরা যে কিছুই সঙ্গে নির্দিষ্ট।যদি আমরা স্থানধারকের ইনপুট আকারটি [None,3] হিসাবে সেট করি তবে এটি কোনও একক শটে ডেটার কোনও সেট নিতে সক্ষম হবে। এটি আমরা আগের কোডটি করেছিলাম।দ্বিতীয় ক্ষেত্রে আমি কোনও আকৃতি নির্বাচন করি নি, এক্ষেত্রে এটি কোনও আকার গ্রহণ করবে। তবে নেটওয়ার্কটি যে ডেটাটি আশা করে আমাদের প্লেসোল্ডারের যে ডেটা সরবরাহ করেছে তার চেয়ে আলাদা আকার থাকলে রানটাইমে ত্রুটি হওয়ার সম্ভাবনা রয়েছে।আমি ব্যবহার করা তৃতীয় প্যারামিটারটির Name টি নেটওয়ার্কের পক্ষে কাজ করা এত গুরুত্বপূর্ণ নয়। তবে নেটওয়ার্কের প্রতিটি নোডকে একটি নাম দেওয়া কার্যকর হবে। এটি নেন্সগুলি সনাক্ত করতে সহায়তা করবে যখন আমরা Tensor Board নেটওয়ার্ক ডায়াগ্রামটি পরীক্ষা করব


    • Variables

    টেনসরফ্লোতে ভেরিয়েবলগুলি নিয়মিত ভেরিয়েবলের থেকে পৃথক, স্থানধারকদের বিপরীতে আমরা কখনই এর মধ্যে কোনও নির্দিষ্ট মান সেট করব না, বা কোনও ডেটা সংরক্ষণ করার জন্য ব্যবহার করব না। আমরা এটি স্তরগুলির মধ্যে সংযোগ তৈরি করতে ব্যবহার করব। এবং টেনসরফ্লো নিজেই প্রশিক্ষণের সময় নেটওয়ার্কটি টিউন করতে এই পরিবর্তনগুলি ব্যবহার করবে। সুতরাং এগুলি টেনসরফ্লোতে খেলতে পারা যায়। এগুলিকে প্রায়শই প্রশিক্ষণযোগ্য পরামিতি বলা হয়।
    Lets create some Variables
    weight1=tf.Variable(tf.random_normal(shape=[2,3],stddev=0.02),name="Weight1")
    biases1=tf.Variable(tf.random_normal(shape=[3],stddev=0.02),name="Biases1")
    সুতরাং আমরা এখানে দুটি ভেরিয়েবল আছে। এখানে প্রথম প্যারামিটারটি হল মানগুলি যা আমরা এটি দিয়ে এটি আরম্ভ করতে চাই। এক্ষেত্রে আমরা প্রথমটিকে +/- 0.02 এর প্রকরণের সাথে এলোমেলো মান সহ 2 × 3 ম্যাট্রিক্স হিসাবে সূচনা করি। আকৃতির Shape জন্য প্রথমটি হল স্তরটি যে ইনপুট সংযোগটি দেবে। এবং দ্বিতীয়টি স্তরটি পরবর্তী স্তরের জন্য আউটপুট সংযোগের সংখ্যা।
    here is an example
    Neural Network
    পক্ষপাতিত্বের জন্য আমি কেবল আকার হিসাবে 3 টি নির্বাচন করেছি কারণ প্রথম পক্ষপাতের নিউরনের জন্য কোনও ইনপুট নেই এবং এতে 3 আউটপুট সংযোগ রয়েছে 

    • Operations

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


    আমাদের আগের পোস্টে আমরা পূর্ববর্তী সমস্ত স্তর নিউরনের ওজনযুক্ত আউটপুট যোগ করে প্রতিটি নিউরনের আউটপুট গণনা করেছি। আমরা প্রতিটি স্তরের নিউরনের জন্য এটি লুপের জন্য ব্যবহার করেছিলাম। তবে এটি করার আরও ভাল উপায় আছে। উদাহরণস্বরূপ আমাদের কাছে 2 ইনপুট নিউরন এবং 3 টি লুকানো নিউরন রয়েছে। সুতরাং এর মধ্যে সংযোগের মোট 2 × 3 সংখ্যা থাকবে। আমরা তাদের 2 ডি ম্যাট্রিক্সে উপস্থাপন করছি

    আমরা ম্যাট্রিক্সের গুণটি করলে আমরা নীচের ফলাফলগুলি পেয়ে যাব

    সুতরাং এই একই গণনা আমরা প্রতিটি আউটপুট জন্য যোগফল গণনা করতে একটি লুপ ব্যবহার করে আমাদের আগের পোস্টে করেছি। পক্ষপাত সংযোজন করার জন্য আমরা ফলাফলের সাথে সরাসরি পক্ষপাত সমষ্টি করতে পারি

    এটি পক্ষপাত সহ আউটপুট চূড়ান্ত ফর্ম .. ঠিক আছে টেনসরফ্লো এ এটি করা যাক। এটি করতে আমাদের অপারেশনগুলি করতে হবে যা ম্যাট্রিক্সের গুণক
    hLayer=tf.matmul(inputs,weight1)
    hLayer=hLayer+biases1
    সুতরাং এখানে দুটি ম্যাট্রিক্স অপারেশন রয়েছে প্রথমটি হ'ল ইনপুটগুলির ম্যাট্রিক্স গুণন এবং ওয়েট 1 ম্যাট্রিক্স যা পক্ষপাত ছাড়াই আউটপুট উত্পাদন করবে। এবং পরবর্তী লাইনে আমরা ম্যাট্রিক্স সংযোজন করেছি যা মূলত উপাদান সংযোজন দ্বারা একটি উপাদান সম্পাদন করে।

    এখন এটি আমরা সেন্সরফ্লোতে অপারেশনগুলি বলি। এটি আসলে এক স্তর থেকে ডেটা প্রবাহিত করছে।

    একটি শেষ জিনিস এখনও মুলতুবি রয়েছে যা স্তর আউটপুটগুলিতে অ্যাক্টিভেশন ফাংশন প্রয়োগ করে। সুতরাং এটি প্রয়োগ করা যাক
    hLayer=tf.sigmoid(hLayer, name='hActivation')
    ঠিক আছে তাই আমরা লুকিয়ে থাকা পর্যন্ত সম্পন্ন করি যাতে আউটপুট স্তরটিও তৈরি হয় এবং নেটওয়ার্কটি শেষ হয়
    weight2=tf.Variable(tf.random_normal(shape=[3,1],stddev=0.02),name="Weight2")
    biases2=tf.Variable(tf.random_normal(shape=[1],stddev=0.02),name="Biases2")
    যেহেতু আমরা দেখতে পাচ্ছি আউটপুট স্তরটিতে কেবল 1 টি নিউরন রয়েছে এবং পূর্ববর্তী লুকানো স্তরটিতে 3 টি নিউরন ছিল। সুতরাং ওজন ম্যাট্রিক্সের 3 টি ইনপুট এবং 1 আউটপুট রয়েছে সুতরাং এই আকারটি [3,1]। এবং পক্ষপাতের কেবলমাত্র একটি নিউরন রয়েছে এইভাবে বায়াস আকারের সাথে সংযুক্ত করার জন্য [1]

    আউটপুট স্তর তৈরি করতে দিন
    output=tf.matmul(hLayer,weight2)
    output=output+biases2
    output=tf.sigmoid(output, name='outActivation')
    এটি দিয়ে আমাদের নেটওয়ার্কটি সম্পূর্ণ।

    • Optimization
    নেটওয়ার্কটি প্রশিক্ষণ দেওয়ার জন্য ত্রুটি বা কোনও অপ্টিমাইজেশন পদ্ধতি গণনা করার জন্য আমরা এখনও কিছু করি নি
    #cost=tf.nn.softmax_cross_entropy_with_logits(logits=output,labels=targets)
    # update  tf.nn.softmax_cross_entropy_with_logits is for classification problems only
    # we will be using tf.squared_difference()
    cost=tf.squared_difference(targets, output)
    cost=tf.reduce_mean(cost)
    optimizer=tf.train.AdamOptimizer().minimize(cost)
    softmax_cross_entropy_with_logits  পদ্ধতিটি নিউরন এবং লক্ষ্য স্থানধারকের আউটপুট নেবে যেখানে আমরা প্রত্যাশিত ফলাফলগুলি আউট করব। তারপরে এটি স্তরটির প্রতিটি এবং নিউরনের জন্য ত্রুটি গণনা করবে।

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

    এরপরে আমরা সেই ত্রুটিটি পরিবর্তনশীল cost নিয়েছি এবং এতে অপারেটেড reduce_mean ফাংশন রেখেছি এবং এটি আবার cost ভেরিয়েবলে সঞ্চয় করেছি। reduce_mean ত্রুটিগুলির এই error টি নিচ্ছে এবং সেগুলির গড় গণনা করছে এবং ত্রুটির জন্য একটি মান প্রদান করে returning

    পরিশেষে আমরা ত্রুটি ব্যয় হ্রাস করার জন্য 
    AdamOptimizer অ্যাডামঅ্যাপটিমাইজার নামে অপ্টিমাইজার তৈরি করছি। এটি মূলত ত্রুটি শুরু করার হিসাবে cost টি ব্যবহার করে একই ব্যাক প্রচার করে এবং প্রতিবারের ওজনকে কিছুটা ঠিক করার সময় পিছনে সেই error টি প্রচার করে। প্রায় অনুরূপ যা আমরা আমাদের নিজের পোস্টের নিউরাল নেটওয়ার্কে করেছিলাম।

    • Session

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

    সুতরাং সেশন শুরু করার আগে প্রথমে ডেটা সেট তৈরি করতে দিন। আমি এটিকে অন্য বাইনারি গেট এক্সওআর গেট হিসাবে কাজ করতে যাচ্ছি

    অবশ্যই আমরা অনেক জটিল জিনিস করতে পারি তবে সরলতার জন্য আমরা এটিকে XOR গেটের মতো কাজ করতে যাচ্ছি। সুতরাং এর জন্য ইনপুট আউটপুট উত্পন্ন করতে দিন
    #generating inputs
    import numpy as np
    
    inp=[[0,0],[0,1],[1,0],[1,1]]
    out=[[0],[1],[1],[0]]
    
    inp=np.array(inp)
    out=np.array(out)
    সুতরাং এর আগে আমাদের আমাদের ইনপুটগুলি দরকার। এবং আমাদের এটি নম্পি অ্যারে ফর্ম্যাটে দরকার তাই আমরা এটিকে নিমপী অ্যারেতে রূপান্তর করি।

    এখন আসুন সেশন শুরু করা যাক


    epochs=4000 # number of time we want to repeat
    
    with tf.Session() as sess:
        tf.global_variables_initializer().run()
        for i in range(epochs):
            error,_ =sess.run([cost,optimizer],feed_dict={inputs: inp,targets:out})
            print(i,error)
    সুতরাং এখানে আমরা একটি অধিবেশন শুরু করেছি এবং এর নাম রাখলাম sess। সেশনটি সেটআপ করার পরে প্রথমে আমাদের যা করা দরকার তা হ'ল আমাদের ব্যবহার করে তৈরি করা সমস্ত টেনসরফ্লো ভেরিয়েবল আরম্ভ করা দরকার tf.global_variables_initializer().run()
    এখন আমরা আমাদের প্রশিক্ষণের পুনরাবৃত্তি করতে একটি লুপ শুরু করি। এখন লুপের ভিতরে আমরা sess.run () ব্যবহার করছি। এর মধ্যে প্রথম প্যারামিটারটি অপারেশনগুলির একটি তালিকা যা আমরা করতে চাই। এক্ষেত্রে আমি প্রতিটি প্রশিক্ষণের জন্য ত্রুটিটি জানতে চাই এবং আমি নেটওয়ার্কটিও অপ্টিমাইজ করতে চাই। সুতরাং আমি তালিকায় ব্যয় এবং অপ্টিমাইজার পরিবর্তনশীল রাখি।

     দ্বিতীয় পরামিতিটি  feed_dict ফিড_ডিক্ট। এই যুক্তিতে আমরা টেনসরফ্লোটি বলব যেখান থেকে এটি এর সমস্ত placeholders স্থানধারীদের ডেটা নেবে। সুতরাং আমাদের নেটওয়ার্ক  inputs and targets ইনপুট এবং লক্ষ্যবস্তুতে আমাদের কাছে 2 placeholders  স্থানধারক রয়েছে যাতে আমাদের টেনসরফ্লো বলতে হবে যেখানে এটির ডেটা নেওয়া উচিত। আমরা সেই তথ্যটি feed_dict প্যারামিটারে রেখেছি।

    ইনপুট জন্য আমরা ইনপ সেট। এবং লক্ষ্যগুলি জন্য আমরা সেট আপ। অতএব আমরা 
    feed_dict ={inputs:inp , targets:out} ফিড_ডিক্ট = {ইনপুট: ইনপ, লক্ষ্যগুলি: আউট সেট করেছি

    এবং এখন sess.run () এর আউটপুট হ'ল পৃথক ক্রিয়াকলাপের আউটপুট যা আমরা তালিকার ভিতরে রাখি।cost and the optimizer  এটি ব্যয় এবং অপ্টিমাইজার। cost of  গড় ত্রুটি প্রদান করে এবং অপ্টিমাইজার কোনও মান ফিরিয়ে দেয় না তাই আমরা এটিকে এড়াতে _ হিসাবে সেট করি (as _ to)
    এবং অবশেষে আমরা সেই মানগুলি মুদ্রণ করছি।


    Lets Test the model

    আমরা এখন মডেলটিকে প্রশিক্ষণ দিয়েছি এর কার্যকারিতা পরীক্ষা করে দেখি

    with tf.Session() as sess:
        tf.global_variables_initializer().run()
        for i in range(epochs):
            error,_ =sess.run([cost,optimizer],feed_dict={inputs: inp,targets:out})
            print(i,error)
        while True:
            a = input("type 1st input :")
            b = input("type 2nd input :")
            inp=[[a,b]]
            inp=np.array(inp)
            prediction=sess.run([output],feed_dict={inputs: inp})
            print(prediction)
    সুতরাং এখানে আমরা যেতে। প্রশিক্ষণের পরে আমরা আউটপুট নোড চালিয়ে এবং ইনপুট স্থানধারককে ডেটা সরবরাহ করে এবং শেষ পর্যন্ত এটি মুদ্রণ করে নেটওয়ার্কটি পরীক্ষা করতে পারি



    Saving The Session for later

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

    সেশনটি সংরক্ষণ করার জন্য আমরা একটি সেভার অবজেক্ট তৈরি করতে tf.train.Saver () ব্যবহার করতে পারি

    saver = tf.train.Saver()
    with tf.Session() as sess:
        tf.global_variables_initializer().run()
        for i in range(epochs):
            error,_ =sess.run([cost,optimizer],feed_dict={inputs: inp,targets:out})
            print(i,error)
        saver.save(sess, "model.ckpt") # saving the session with file name "model.ckpt"
    প্রশিক্ষণের পরে ফর লুপের শেষে আমরা “model.ckpt”.   \"মডেল.ক্যাপ্ট\" নামে একটি ফাইল নাম রেখে সেশনটি সংরক্ষণ করছি। সুতরাং এখন আমরা এটি পরবর্তী ব্যবহারের জন্য লোড করতে পারি।


    Restoring/Loading the session

    একবার আমাদের কোনও সেভ সেশন হয়ে গেলে এখন সেভার ক্লাস অবজেক্টের পুনরুদ্ধার পদ্ধতিটি কল করে আমরা এটিকে সহজেই পুনঃস্থাপন করতে পারি
    saver = tf.train.Saver()
    with tf.Session() as sess:
        saver.restore(sess, "model.ckpt")
        while True:
            a = input("type 1st input :")
            b = input("type 2nd input :")
            inp=[[a,b]]
            inp=np.array(inp)
            prediction=sess.run([output],feed_dict={inputs: inp})
            print(prediction)

    সুতরাং এইভাবে আমরা কোনও পূর্ববর্তী প্রশিক্ষিত মডেল বা পরে ব্যবহার পুনরুদ্ধার করতে পারি। পড়ার জন্য ধন্যবাদ আমি আশা করি এই পোস্টটি আমরা আপনাকে টেনসরফ্লোয়ের মূল বিষয়গুলি বুঝতে সাহায্য করব।

  • 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