• টেনসরফ্লো ব্যবহার করে একটি চিত্র শ্রেণিবদ্ধ

    টেনসরফ্লো ব্যবহার করে একটি চিত্র শ্রেণিবদ্ধ তৈরি করতে দেয়


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

    পূর্বশর্ত

    • ক্যাগল বিড়াল বনাম কুকুর ডেটাসেট ডাউনলোড করুন
    • আমরা আমাদের আগের পোস্টে লিখেছিলাম যে ডেটাসেটজেনেটর কোড

    বিল্ডিং ব্লক

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

    কোডিং শুরু করা যাক

    আমরা সহায়ক শ্রেণি তৈরি করে শুরু করব এবং এর নাম রাখি নেটওয়ার্কবিল্ডার
    import tensorflow as tf 
    
    class NetworkBuilder: 
        def __init__(self): 
            pass
    পাইথন

    তাই নেটওয়ার্কবিল্ডার ক্লাস তৈরি করেছে, আমাদের আরম্ভ করার মতো কিছু নেই তাই আমরা এখনই এটি পাস করছি

    কনভলিউশন স্তর পদ্ধতি

    আসুন আমাদের নেটওয়ার্কে একটি কনভলিউশন স্তর সংযুক্ত করার জন্য একটি পদ্ধতি যুক্ত করি। কনভলিউশন স্তর হ'ল একটি বিশেষ ধরণের নিউরাল নেটওয়ার্ক স্তর যা ইনপুট স্তরের বৈশিষ্ট্য বা নিদর্শনগুলি সনাক্ত করে। এটি ইনপুটটিতে বৈশিষ্ট্য এবং নিদর্শনগুলি সনাক্ত করতে শেখে। সুতরাং আমরা আমাদের চিত্র স্বীকৃতি মডেলটিতে প্রাথমিক বৈশিষ্ট্য সনাক্তকারী হিসাবে কনভোলজিনাল স্তরগুলি ব্যবহার করব।
    class NetworkBuilder:
        :
        :
        def attach_conv_layer(self, input_layer, output_size=32, feature_size=(5, 5), strides=[1, 1, 1, 1], padding='SAME',
                              summary=False):
            with tf.name_scope("Convolution") as scope:
                input_size = input_layer.get_shape().as_list()[-1]
                weights = tf.Variable(tf.random_normal([feature_size[0], feature_size[1], input_size, output_size]), name='conv_weights')
                if summary:
                    tf.summary.histogram(weights.name, weights)
                biases = tf.Variable(tf.random_normal([output_size]),name='conv_biases')
                conv = tf.nn.conv2d(input_layer, weights, strides=strides, padding=padding)+biases
                return conv
    
    
    পাইথন
    সুতরাং আমরা সংযুক্তি_কনভ_লেয়ার নামে একটি পদ্ধতি তৈরি  করেছি  , আসুন আমরা এই পদ্ধতিতে আর্গুমেন্টগুলি কী খাওয়াচ্ছি তা দেখি।
    Input_layer,  মডেল আমরা এই নতুন স্তরের জন্য একটি ইনপুট স্তর প্রয়োজন একটি নতুন লেয়ার সংযুক্ত করতে।
    একটি কনভোলজিকাল স্তর তৈরি করতে আমাদের আউটপুট_সাইজটি  জানতে হবে যা আউটপুট বৈশিষ্ট্যের মানচিত্রের সংখ্যা (মূলত আমরা যে বৈশিষ্ট্যগুলি বের করতে চাই তার সংখ্যা) নিউরনের সংখ্যা নয়।
    ফিচার_সাইজ কর্নেলের আকার। মূলত, এটি কিছু নির্দিষ্ট এলোমেলো বৈশিষ্ট্যযুক্ত এই নির্দিষ্ট আকারের পিক্সেলের কয়েকটি ছোট কার্নেল (প্যাচগুলি) তৈরি করবে এবং স্তরটি পুরো চিত্রটিতে কার্নেলটি স্লাইড করে ইনপুট চিত্রের সাথে মিলে যাওয়া অনুরূপ প্যাটার্নগুলি সন্ধান করার চেষ্টা করবে the । এবং আমরা প্রতিটি কার্নেল থেকে বৈশিষ্ট্য মানচিত্র তৈরি করি যেখানে স্থানাঙ্কগুলি নির্দেশ করে যেখানে কার্নেলগুলি ইনপুট চিত্রের সাথে মেলে।

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

    আসুন পদ্ধতির ভিতরে দেখতে দিন

    কিছু করার আগে আমরা নতুন সুযোগ শুরু করি এবং এর নাম দিয়েছিলাম "কনভোলিউশন"। এটি আমাদেরকে টেনসরবোর্ডে ডিবাগ করার সময় একসাথে গোষ্ঠী করতে সহায়তা করবে।
    তিনি নতুন রূপান্তর স্তর তৈরি করতে আমাদের প্রথমে ইনপুট চিত্রের আকার প্রয়োজন। অথবা আরও নির্দিষ্টভাবে ইনপুট চিত্রটির চ্যানেলের সংখ্যা। আরজিবি চিত্রের জন্য, চ্যানেলের সংখ্যা 3, এটি ইনপুট টেনসারের শেষ অক্ষ। সুতরাং আমরা শেষ অক্ষ, চ্যানেলগুলির আকার পেতে ইনপুট_লেয়ার.জেট_শ্যাপ ()। As_list () [- 1] ব্যবহার  করেছি  ।
    এর পরে, আমরা কনওয়ের স্তরটির জন্য ওজন তৈরি করেছি। রূপান্তর স্তরের ওজন এই আকারে হওয়া উচিত [কর্নাল উচ্চতা, কার্নেলের ওজন, ইনপুট চ্যানেলের আকার, আউটপুট চ্যানেল]। আমরা ব্যবহৃত  tf.random_normal  একটি র্যান্ডম ওজন ম্যাট্রিক্স আরম্ভ এবং তারপর ব্যবহার করা  tf.Variable  এটি একটি tensorflow পরিবর্তনশীল রূপান্তর করবে।
    পরবর্তী (alচ্ছিক) আমরা সংক্ষিপ্তসার পতাকাটি পরীক্ষা করেছি এবং সংক্ষিপ্ত লেখককে টেনসর বোর্ডের জন্য সংক্ষিপ্তসার যুক্ত করেছি

    তারপরে আমরা বায়াস নিউরন তৈরি করেছি এবং কনফিউশনাল স্তর তৈরি করতে tf.nn.conv2d ব্যবহার  করেছি  , আমরা কনফ 2 ডি আউটপুট সহ বায়াস নিউরন যুক্ত করেছি এবং আমরা চূড়ান্ত রূপান্তর স্তরটি পাই।

    পুলিং স্তর

    আমরা কনভলিউশন স্তরটির জন্য একটি পদ্ধতি তৈরি করেছি। আসুন আমাদের নেটওয়ার্কে একটি পুলিং স্তর সংযুক্ত করার জন্য একটি পদ্ধতি তৈরি করি। মূলত একটি পুলিং স্তর চিত্রগুলির নমুনাগুলির নিচে নামায় (এটিকে ছোট চিত্রের আকারে পুনরায় আকার দিন) কারণ আমরা আরও এবং আরও বেশি সংশোধন স্তর সংযুক্ত করার সাথে বৈশিষ্ট্যের মানচিত্রের সংখ্যা বাড়তে শুরু করে। আমরা বৈশিষ্ট্য মানচিত্রের নমুনা নীচে নেব যাতে এটি প্রক্রিয়া করা সহজ এবং দ্রুত হয়। আমরা পুলিংয়ের জন্য সর্বাধিক পুলিং পদ্ধতি ব্যবহার করব।
    class NetworkBuilder:
        :
        :
        def attach_pooling_layer(self, input_layer, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME'):
            with tf.name_scope("Pooling") as scope:
                return tf.nn.max_pool(input_layer, ksize=ksize, strides=strides, padding=padding)
    পাইথন

    সুতরাং পুলিংয়ে, আমাদের পূর্ববর্তী পদ্ধতি এবং স্ট্রাইডগুলির পাশাপাশি আর্গুমেন্ট হিসাবে প্যাডিংয়ের মতো ইনপুট_লেয়ার প্রয়োজন। আমাদের আরও একটি প্যারামিটার দরকার যা ক্যাসাইজ নামে পরিচিত।
    পূর্ববর্তী পদ্ধতির মতো, আমরা এর "স্কুলিং" নামে একটি স্কোপ খুললাম।
    Ksize পুলিং আকার, যা কতগুলি পিক্সেল প্রতিটি দিক এক পিক্সেল রূপান্তরিত হবে মানে। এটি এই ফর্ম্যাটে থাকা উচিত [ব্যাচ, উচ্চতা, প্রস্থ, চ্যানেল]। আমরা ব্যাচ এবং চ্যানেল অক্ষ থেকে কোনও পিক্সেল মার্জ করতে চাই না। সুতরাং ডিফল্ট হিসাবে, আমরা সেই অবস্থানগুলিতে 1 এবং উচ্চতা এবং প্রস্থ উভয় অবস্থানে 2 রেখেছি। সুতরাং ডিফল্ট প্যারামিটারগুলির সাথে, পুল করা চিত্রটি উচ্চতা এবং প্রস্থের ইনপুট চিত্রের অর্ধেক হবে।
    আমরা উচ্চতা এবং প্রস্থে 2 টি ধাপও এগিয়ে চলেছি এবং প্যাডিংটি একই রকম যাতে কার্নেল স্লাইডিংয়ের সময় আকার একই থাকে।
    পুলিং স্তরটি তৈরি করতে আমরা tf.nn.max_pool ব্যবহার করেছি এবং যুক্তিগুলি রেখেছি  এবং এটি ফিরিয়ে দিয়েছি 

    অ্যাক্টিভেশন লেয়ার

    আমাদের নেটওয়ার্কে অলাইনারিটি যুক্ত করতে আমাদের কিছু অ্যাক্টিভেশন স্তর প্রয়োজন অন্যথায় নেটওয়ার্ক জটিল ফাংশন শিখতে সক্ষম হবে না। আমরা সংজ্ঞায়িত করতে হবে  relu, সিগমা ও softmax ,   এই তিনটি অ্যাক্টিভেশন ফাংশন। আসুন তাদের সংজ্ঞা দিন
    class NetworkBuilder:
        :
        :
        def attach_relu_layer(self, input_layer):
            with tf.name_scope("Activation") as scope:
                return tf.nn.relu(input_layer)
    
        def attach_sigmoid_layer(self, input_layer):
            with tf.name_scope("Activation") as scope:
                return tf.nn.sigmoid(input_layer)
    
        def attach_softmax_layer(self, input_layer):
            with tf.name_scope("Activation") as scope:
                return tf.nn.softmax(input_layer)
    
    পাইথন

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

    সম্পূর্ণ সংযুক্ত স্তর

    এখন অবধি আমরা চিত্র বা বৈশিষ্ট্যযুক্ত মানচিত্রের সাথে কাজ করছিলাম যা কিছু আকারে একটি চিত্র এবং সমস্ত ব্যাচের অক্ষ বাদে আকারে থ্রিডি তবে সম্পূর্ণ সংযুক্ত স্তরটি কেবল 1 ডি দিয়েই কাজ করে তাই আমাদের সেই 3 ডি ইনপুটটিকে ফ্ল্যাট 1 ডি তে রূপান্তর করতে হবে ইনপুট. যে কারণে, আমাদের অন্য পদ্ধতি প্রয়োজন। আমরা এটিকে সমতল বলব 

    সমতল স্তর

    class NetworkBuilder:
        :
        :
        def flatten(self, input_layer):
            with tf.name_scope("Flatten") as scope:
                input_size = input_layer.get_shape().as_list()
                new_size = input_size[-1]*input_size[-2]*input_size[-3]
                return tf.reshape(input_layer, [-1, new_size])
    পাইথন
    সুতরাং উপরের কোডে, আমরা স্ক্যাপের নামটি ফ্ল্যাটেন দিয়েছি এবং ব্যাচের অক্ষটি বাদ দিয়ে ইনপুট স্তরটিতে নিউরনের মোট সংখ্যা (প্রতিটি পিক্সেলের মান উপস্থাপন করে) গণনা করেছি। সুতরাং, মোট নিউরনের সংখ্যা হবে (উচ্চতার অক্ষ বরাবর নিউরনের সংখ্যা) x (প্রস্থ অক্ষের সাথে নিউরনের সংখ্যা) x (চ্যানেল অক্ষের সাথে থাকা নিউরনের সংখ্যা) । যা মূলত ইনপুট স্তরের সর্বশেষ 3 অক্ষ। এখন যদি আমরা তাদের গুণ করি তবে আমরা একটি সংখ্যা পাই এবং এটি আমাদের সম্পূর্ণ সংযুক্ত স্তরের জন্য 1 ডি ভেক্টরের নতুন আকার হবে। সুতরাং এখন আমরা ইনপুট স্তরটি পুনরায় আকার দিচ্ছি [ব্যাচসাইজ, নিউজাইজ] যেখানে -1 ব্যাচের আকারের যার অর্থ এটি কোনও মূল্য নিতে পারে এবং এটি আমাদের সংযুক্ত বৈশিষ্ট্যগুলির পুরো স্তরের সাথে সম্পূর্ণরূপে সংযুক্ত স্তর দ্বারা শ্রেণিবদ্ধ করার জন্য প্রস্তুত।

    শেষ পর্যন্ত সম্পূর্ণ সংযুক্ত (ঘন) স্তর

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

    class NetworkBuilder:
        :
        :
        def attach_dense_layer(self, input_layer, size, summary=False):
            with tf.name_scope("Dense") as scope:
                input_size = input_layer.get_shape().as_list()[-1]
                weights = tf.Variable(tf.random_normal([input_size, size]), name='dense_weigh')
                if summary:
                    tf.summary.histogram(weights.name, weights)
                biases = tf.Variable(tf.random_normal([size]), name='dense_biases')
                dense = tf.matmul(input_layer, weights) + biases
                return dense
    
    পাইথন

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

    এটি ফাইনাল নেটওয়ার্ক বিল্ডার ক্লাস

    আমরা পুরোপুরি কোডটি পছন্দ করা উচিত নেটওয়ার্ক বিল্ডার ক্লাসটি শেষ করেছি
    class NetworkBuilder:
        def __init__(self):
            pass
    
        def attach_conv_layer(self, input_layer, output_size=32, feature_size=(5, 5), strides=[1, 1, 1, 1], padding='SAME',
                              summary=False):
            with tf.name_scope("Convolution") as scope:
                input_size = input_layer.get_shape().as_list()[-1]
                weights = tf.Variable(tf.random_normal([feature_size[0], feature_size[1], input_size, output_size]), name='conv_weights')
                if summary:
                    tf.summary.histogram(weights.name, weights)
                biases = tf.Variable(tf.random_normal([output_size]),name='conv_biases')
                conv = tf.nn.conv2d(input_layer, weights, strides=strides, padding=padding)+biases
                return conv
    
        def attach_relu_layer(self, input_layer):
            with tf.name_scope("Activation") as scope:
                return tf.nn.relu(input_layer)
    
        def attach_sigmoid_layer(self, input_layer):
            with tf.name_scope("Activation") as scope:
                return tf.nn.sigmoid(input_layer)
    
        def attach_softmax_layer(self, input_layer):
            with tf.name_scope("Activation") as scope:
                return tf.nn.softmax(input_layer)
    
        def attach_pooling_layer(self, input_layer, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1],padding='SAME'):
            with tf.name_scope("Pooling") as scope:
                return tf.nn.max_pool(input_layer, ksize=ksize, strides=strides, padding=padding)
    
        def flatten(self, input_layer):
            with tf.name_scope("Flatten") as scope:
                input_size = input_layer.get_shape().as_list()
                new_size = input_size[-1]*input_size[-2]*input_size[-3]
                return tf.reshape(input_layer, [-1, new_size])
    
        def attach_dense_layer(self, input_layer, size, summary=False):
            with tf.name_scope("Dense") as scope:
                input_size = input_layer.get_shape().as_list()[-1]
                weights = tf.Variable(tf.random_normal([input_size, size]), name='dense_weigh')
                if summary:
                    tf.summary.histogram(weights.name, weights)
                biases = tf.Variable(tf.random_normal([size]), name='dense_biases')
                dense = tf.matmul(input_layer, weights) + biases
                return dense
    
    পাইথন

    সুতরাং পরবর্তী কি?

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

    টেনসরফ্লোতে একটি সিএনএন মডেল তৈরি করি

    আসুন নতুন ফাইলটি MyFirstCNNModel.py খুলুন এবং আমাদের মডেল তৈরি করা শুরু করুন।

    লাইব্রেরি আমদানি করা হচ্ছে

    import tensorflow as tf 
    from NetworkBuilder import NetworkBuilder 
    from DataSetGenerator import DataSetGenerator,seperateData
    import datetime 
    import numpy as np 
    import os
    পাইথন
    এগুলি আমরা যে লাইব্রেরিগুলিতে ব্যবহার করতে যাচ্ছি সেগুলি। NetworkBuilder , DataSetGenerator  এবং   seperateData  লাইব্রেরি যে আমরা নিজেদের লিখেছেন হয়

    এখন স্থান ধারক তৈরি করা যাক

    with tf.name_scope("Input") as scope:
        input_img = tf.placeholder(dtype='float', shape=[None, 128, 128, 3], name="input")
    
    with tf.name_scope("Target") as scope:
        target_labels = tf.placeholder(dtype='float', shape=[None, 2], name="Targets")
    
    পাইথন
    সুতরাং এগুলি ইনপুট এবং লক্ষ্য স্থানধারক। ইনপুট আকারটি এই ফর্ম্যাটে [ব্যাচের আকার, উচ্চতা, প্রস্থ, চ্যানেল]

    এর মডেল ডিজাইন করা যাক

    এখন আমরা নেটওয়ার্কবিল্ডার অবজেক্ট তৈরি করব এবং আমরা স্তরগুলি যুক্ত করা শুরু করব
    nb = NetworkBuilder()
    
    with tf.name_scope("ModelV2") as scope:
        model = input_img
        model = nb.attach_conv_layer(model, 32, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_conv_layer(model, 32, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_pooling_layer(model)
    
        model = nb.attach_conv_layer(model, 64, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_conv_layer(model, 64, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_pooling_layer(model)
    
        model = nb.attach_conv_layer(model, 128, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_conv_layer(model, 128, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_pooling_layer(model)
    
        model = nb.flatten(model)
        model = nb.attach_dense_layer(model, 200, summary=True)
        model = nb.attach_sigmoid_layer(model)
        model = nb.attach_dense_layer(model, 32, summary=True)
        model = nb.attach_sigmoid_layer(model)
        model = nb.attach_dense_layer(model, 2)
        prediction = nb.attach_softmax_layer(model)
    
    পাইথন
    এটা আমাদের মডেল। এটি স্ব-ব্যাখ্যামূলক। আমাদের নেটওয়ার্ক নির্মাতাদের ক্লাসকে ধন্যবাদ, চিত্রের শ্রেণিবদ্ধ মডেলগুলি তৈরি করা এখন খুব সহজ।

    এখন আমরা অপ্টিমাইজেশন এবং নির্ভুলতা ব্লক তৈরি করব

    with tf.name_scope("Optimization") as scope:
        global_step = tf.Variable(0, name='global_step', trainable=False)
        cost = tf.nn.softmax_cross_entropy_with_logits(logits=model, labels=target_labels)
        cost = tf.reduce_mean(cost)
        tf.summary.scalar("cost", cost)
    
        optimizer = tf.train.AdamOptimizer().minimize(cost,global_step=global_step)
    
    with tf.name_scope('accuracy') as scope:
        correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(target_labels, 1))
        accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    
    পাইথন
    এখানে আমরা গ্লোবাল_স্টেপ নামে একটি ভেরিয়েবল তৈরি করেছি যা প্রতিবার আমরা অপটিমাইজারটি চালানোর সময় একের দ্বারা আপডেট ও বর্ধিত হবে। এটি আমাদের সম্পাদিত মোট প্রশিক্ষণের ধাপগুলির উপর নজর রাখতে সহায়তা করবে, এমনকি যদি আমরা একটি সংরক্ষিত মডেল লোড করি তবে গ্লোবাল পদক্ষেপগুলিও পুনরুদ্ধার করা হবে।

    টেনসরবোর্ডে ভিজ্যুয়ালাইজ করুন

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

    আমরা সিএনএন ইমেজ শ্রেণিবদ্ধ মডেলটি সম্পন্ন করেছি, আসুন এটি প্রশিক্ষণ দিন

    এখন আমরা ট্রেন ফোল্ডার থেকে মিনি ব্যাচগুলি তৈরি করতে এবং আমাদের সদ্য নির্মিত চিত্রের শ্রেণিবদ্ধ প্রশিক্ষণ দেওয়ার জন্য ডেটাসেটজেনেটর শ্রেণি ব্যবহার করব will
    # we need to run this only once
    #seperateData("./train")
    dg = DataSetGenerator("./train")
    
    
    epochs = 10
    batchSize = 10
    
    saver = tf.train.Saver()
    model_save_path="./saved model v2/"
    model_name='model'
    
    with tf.Session() as sess:
        summaryMerged = tf.summary.merge_all()
    
        filename = "./summary_log/run" + datetime.datetime.now().strftime("%Y-%m-%d--%H-%M-%s")
        # setting global steps
        tf.global_variables_initializer().run()
    
        if os.path.exists(model_save_path+'checkpoint'):
            # saver = tf.train.import_meta_graph('./saved '+modelName+'/model.ckpt.meta')
            saver.restore(sess, tf.train.latest_checkpoint(model_save_path))
        writer = tf.summary.FileWriter(filename, sess.graph)
    
        for epoch in range(epochs):
            batches = dg.get_mini_batches(batchSize,(128,128), allchannel=False)
            for imgs ,labels in batches:
                imgs=np.divide(imgs, 255)
                error, sumOut, acu, steps,_ = sess.run([cost, summaryMerged, accuracy,global_step,optimizer],
                                                feed_dict={input_img: imgs, target_labels: labels})
                writer.add_summary(sumOut, steps)
                print("epoch=", epoch, "Total Samples Trained=", steps*batchSize, "err=", error, "accuracy=", acu)
                if steps % 100 == 0:
                    print("Saving the model")
                    saver.save(sess, model_save_path+model_name, global_step=steps)
    
    
    পাইথন
    সুতরাং এটি আমাদের প্রশিক্ষণের সেটআপ। কুকুর এবং বিড়ালের চিত্র দুটি পৃথক ফোল্ডারে আলাদা করতে আমরা প্রথমবারের মতো আলাদা ডেটা ফাংশনটি চালাব । এর পরে, আমরা ডেটাসেটজেনেটর অবজেক্টটি তৈরি করেছিলাম এবং ব্যাচের আকার এবং ইপচগুলির জন্য কিছু ভেরিয়েবল তৈরি করেছি।
    কোডের বাকি অংশটি আমাদের পূর্ববর্তী টিউটোরিয়ালের মতো। পার্থক্যটি হ'ল আমরা প্রশিক্ষিত মডেলটি সংরক্ষণ এবং পুনরুদ্ধার করতে একটি সেভার.রেস্টোর পদ্ধতি এবং সেভার.সেজ যুক্ত করেছি। সুতরাং সেভার.সেভ ফাংশনটি প্রতি 100 পুনরাবৃত্তির পরে ডাকা হবে এবং এটি সেই ডিরেক্টরিতে মডেলটিকে সংরক্ষণ করবে যা আমরা Model_save_path ভেরিয়েবলটিতে মডেল_নাম ভেরিয়েবলের সাথে উল্লিখিত নামের সাথে সজ্জিত করব। যদি আমরা প্রশিক্ষণের সময় প্রোগ্রামটি বন্ধ করি এবং প্রোগ্রামটি আবার চালিত করি তবে এটি সেভার.রেস্টোর পদ্ধতিটি ব্যবহার করে সর্বশেষ সংরক্ষিত চেকপয়েন্টটি লোড করবে এবং এটি যেখানেই ছেড়ে গেছে সেখান থেকে এটি তার প্রশিক্ষণ চালিয়ে যাবে। সুতরাং প্রতিবার প্রোগ্রামটি চালানোর সময় আমাদের স্ক্র্যাচ থেকে প্রশিক্ষণ নিতে হবে না।

    সুতরাং এটি সম্পূর্ণ সিএনএন মডেল এবং প্রশিক্ষণের সেটআপ কোড

    এটি সম্পূর্ণ সিএনএন চিত্র শ্রেণিবদ্ধ প্রশিক্ষণ সেটআপ কোড। আমরা এটি যতবার চাই চালাতে পারি এবং প্রতিবার যখন আমরা দৌড়ব, এটি সর্বশেষ সংরক্ষিত চেকপয়েন্ট থেকে এর প্রশিক্ষণ শুরু করবে .. সুতরাং আমরা যত বেশি এই শ্রেণিবদ্ধকে চালনা করব এবং প্রশিক্ষণ করব এটি তত বেশি সঠিক হয়ে উঠবে।
    import tensorflow as tf
    from NetworkBuilder import NetworkBuilder
    from DataSetGenerator import DataSetGenerator, seperateData
    import datetime
    import numpy as np
    import os
    
    
    with tf.name_scope("Input") as scope:
        input_img = tf.placeholder(dtype='float', shape=[None, 128, 128, 1], name="input")
    
    with tf.name_scope("Target") as scope:
        target_labels = tf.placeholder(dtype='float', shape=[None, 2], name="Targets")
    
    with tf.name_scope("Keep_prob_input") as scope:
        keep_prob = tf.placeholder(dtype='float',name='keep_prob')
    
    nb = NetworkBuilder()
    
    with tf.name_scope("ModelV2") as scope:
        model = input_img
        model = nb.attach_conv_layer(model, 32, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_conv_layer(model, 32, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_pooling_layer(model)
    
        model = nb.attach_conv_layer(model, 64, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_conv_layer(model, 64, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_pooling_layer(model)
    
        model = nb.attach_conv_layer(model, 128, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_conv_layer(model, 128, summary=True)
        model = nb.attach_relu_layer(model)
        model = nb.attach_pooling_layer(model)
    
        model = nb.flatten(model)
        model = nb.attach_dense_layer(model, 200, summary=True)
        model = nb.attach_sigmoid_layer(model)
        model = nb.attach_dense_layer(model, 32, summary=True)
        model = nb.attach_sigmoid_layer(model)
        model = nb.attach_dense_layer(model, 2)
        prediction = nb.attach_softmax_layer(model)
    
    
    with tf.name_scope("Optimization") as scope:
        global_step = tf.Variable(0, name='global_step', trainable=False)
        cost = tf.nn.softmax_cross_entropy_with_logits(logits=model, labels=target_labels)
        cost = tf.reduce_mean(cost)
        tf.summary.scalar("cost", cost)
        optimizer = tf.train.AdamOptimizer().minimize(cost, global_step=global_step)
    
    with tf.name_scope('accuracy') as scope:
        correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(target_labels, 1))
        accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    
    dg = DataSetGenerator("./train")
    
    
    epochs = 10
    batchSize = 10
    
    saver = tf.train.Saver()
    model_save_path="./saved model v2/"
    model_name='model'
    
    with tf.Session() as sess:
        summaryMerged = tf.summary.merge_all()
    
        filename = "./summary_log/run" + datetime.datetime.now().strftime("%Y-%m-%d--%H-%M-%s")
        # setting global steps
        tf.global_variables_initializer().run()
    
        if os.path.exists(model_save_path+'checkpoint'):
            # saver = tf.train.import_meta_graph('./saved '+modelName+'/model.ckpt.meta')
            saver.restore(sess, tf.train.latest_checkpoint(model_save_path))
        writer = tf.summary.FileWriter(filename, sess.graph)
    
        for epoch in range(epochs):
            batches = dg.get_mini_batches(batchSize,(128,128), allchannel=False)
            for imgs ,labels in batches:
                imgs=np.divide(imgs, 255)
                error, sumOut, acu, steps,_ = sess.run([cost, summaryMerged, accuracy,global_step,optimizer],
                                                feed_dict={input_img: imgs, target_labels: labels})
                writer.add_summary(sumOut, steps)
                print("epoch=", epoch, "Total Samples Trained=", steps*batchSize, "err=", error, "accuracy=", acu)
                if steps % 100 == 0:
                    print("Saving the model")
                    saver.save(sess, model_save_path+model_name, global_step=steps)
    
    
    পাইথন

    কিছু উন্নত পরিবর্তন

    আমি গুগল দ্বারা ইনসেপশন মডেলটিতে যেমন মডিউল তৈরি করেছি তেমনই নেটওয়ার্ক নির্মাতা শ্রেণিতে একটি অতিরিক্ত পদ্ধতি যুক্ত করেছি।
    এখানে কোড
    class NetworkBuilder:
        :
        :
        def attach_inception_module(self,input_layer, output_size):
            output_size_road1 = int(output_size*0.2)
            road1 = self.attach_conv_layer(input_layer=input_layer, output_size=output_size_road1,
                                           feature_size=(1, 1))
            road1 = self.attach_relu_layer(road1)
    
            output_size_road2 = int(output_size * 0.3)
            road2 = self.attach_conv_layer(input_layer=input_layer, output_size=output_size_road2,
                                           feature_size=(1, 1))
            road2 = self.attach_relu_layer(road2)
            road2 = self.attach_conv_layer(input_layer=road2, output_size=output_size_road2,
                                           feature_size=(3, 3))
    
            output_size_road3 = int(output_size * 0.3)
            road3 = self.attach_conv_layer(input_layer=input_layer, output_size=output_size_road3,
                                           feature_size=(1, 1))
            road3 = self.attach_relu_layer(road3)
            road3 = self.attach_conv_layer(input_layer=road3, output_size=output_size_road2,
                                           feature_size=(5, 5))
    
            output_size_road4 = output_size-(output_size_road1 + output_size_road2 + output_size_road3)
            road4 = self.attach_pooling_layer(input_layer=input_layer, strides=[1, 1, 1, 1])
            road4 = self.attach_conv_layer(input_layer=road4, output_size=output_size_road4,
                                           feature_size=(1, 1))
    
            with tf.name_scope("FilterConcat") as scope:
                concat = tf.concat([road1, road2, road3, road4], axis=3, name="FilterConcat")
                concat = self.attach_relu_layer(concat)
            return concat
    
    
    পাইথন
    টেনসরবোর্ডে এটি দেখতে কেমন লাগে
    প্রয়োগকৃত ইনসেপটিও মডিউল
    প্রয়োগকৃত ইনসেপটিও মডিউল

    আমাদের চিত্র শ্রেণিবদ্ধের সীমাবদ্ধতা

    এই চিত্রের শ্রেণিবদ্ধটিকে স্ক্র্যাচ থেকে প্রশিক্ষণের জন্য একটি ভাল ফলাফল পেতে সিপিইউতে সপ্তাহ লাগবে। এমনকি আপনি যদি জিপিইউ ব্যবহার করেন তবে এটি এখনও খুব সময়সাপেক্ষ হবে। সুতরাং আপনি যদি আমার মতো হন এবং হাই-এন্ড জিপিইউ সহ কোনও কম্পিউটার না থাকে তবে আপনি ধ্বংস হয়ে যাবেন।
    তবে আমাদের জন্য সুসংবাদ, আমরা এখনও জটিল টেনস্রফ্লো মডেলকে প্রশিক্ষণ দিতে পারি যা এতগুলি গণনার শক্তি ব্যবহার না করেই এই জিনিসগুলি করতে পারে।
    পরবর্তী টিউটোরিয়ালে, আমরা ইনসেপশন নামে পরিচিত ইতিমধ্যে প্রশিক্ষিত চিত্র শ্রেণিবদ্ধ মডেলটি লোড করতে ট্রান্সফার শেখার ব্যবহার করব (কয়েক সপ্তাহের জন্য একাধিক জিপিইউ ব্যবহার করে গুগল প্রশিক্ষিত)। এবং আমরা এর প্রাক প্রশিক্ষিত চেকপয়েন্টটি প্রশিক্ষণের জন্য আমাদের বেস পয়েন্ট হিসাবে ব্যবহার করব, আমরা আমাদের নিজস্ব প্রয়োজন অনুসারে নেটওয়ার্ক কাঠামোটিও পরিবর্তন করব। যাতে প্রশিক্ষণের জন্য খুব কম সময় লাগবে এবং আমরা এটি সিপিইউতেও প্রশিক্ষণ দিতে পারি।
  • 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