এখন অবধি আমরা নিউরাল নেটওয়ার্ক তৈরি করছিলাম তবে যদি আমাদের কোডটি আমাদের মনে যে সঠিক নেটওয়ার্ক তৈরি না করে তবে কী হয়। আমরা আমাদের কোডটিতে কিছু silly mistake কারণে, প্রকৃতপক্ষে তৈরি হওয়া নেটওয়ার্কটি সম্পূর্ণ আলাদা। সুতরাং টেনসরফ্লো ব্যবহার করে তৈরি করা নেটওয়ার্কের কাঠামোটি আসলে দেখার কোনও উপায় আছে কি? ভাল এখানে TensorBoard টিউটোরিয়াল আসে। টেনসরফ্লো কোডটি আমরা তৈরি করেছিলাম সেই নেটওয়ার্কটি আমরা গ্রাফিক্যালি ভিজ্যুয়ালাইজ করতে পারি। বোনাস দিয়ে আমরা প্রশিক্ষণের সময় বা নেটওয়ার্কের প্রয়োগের সময় রিয়েল-টাইম গ্রাফটি করতে সক্ষম হব।
টেনসরবোর্ডের জন্য প্রাথমিক সেটআপ
আমরা শুরু করার আগে আমাদের প্রথমে টেনসরবোর্ড ইনস্টল করতে হবে। এটি করতে কেবল নিম্নলিখিত কমান্ডটি চালান
pip install tensorboard
টেনসর বোর্ড ব্যবহার করার জন্য বেসিক ধারণাগুলি
টেনসরবোর্ড ব্যবহার করার জন্য আমাদের কয়েকটি প্রাথমিক ধারণাটি শিখতে হবে। এগুলি নিম্নরূপ
- সংক্ষিপ্তসার ও সংক্ষিপ্ত লেখক
- ব্যাপ্তি or
- Summary & Summary Writer
- Scope
- Summary & Summary Writer
আসুন বলি যে আমাদের একটি নেটওয়ার্ক রয়েছে এবং এটির কিছু ডেটা সম্পর্কিত প্রশিক্ষণ রয়েছে এবং আমরা দেখতে চাই যে error টি কীভাবে হ্রাস পাচ্ছে তা আদৌ হ্রাস পাচ্ছে ?. অবশ্যই আমরা এগুলি টার্মিনালে print করতে পারি, তবে এটি ব্যাখ্যা করা কঠিন হবে। আমরা আচরণটি দেখতে সক্ষম হবো না। যেখানে এটি গ্রাফিকাল বিন্যাসে উপস্থাপিত হয়।
অথবা বলুন যে আমরা কীভাবে একটি particular layer ওজন distributed করা হয় তা দেখতে চাই। আমরা যদি 200 × 300 ম্যাট্রিক্স বলি প্রিন্ট করি তবে আমরা কিছু বুঝতে সক্ষম হবো না। এটি প্রিন্ট করা থাকলে এটি স্ক্রিনের চারদিকে থাকবে। তবে আমরা খুব সহজেই টেনসরবোর্ডে একটি স্তরের ওজনের হিস্টোগ্রামটি সুন্দরভাবে প্রদর্শিত দেখতে পাই।
সুতরাং আসুন আমরা কীভাবে এই সমস্তগুলি করতে Summary & Summary Writer কে ব্যবহার করতে পারি তা দেখতে
সুতরাং আমরা একই নেটওয়ার্কটি ব্যবহার করতে যাচ্ছি যা আমরা আমাদের পূর্ববর্তী টিউটোরিয়ালে একটি রেফারেন্স হিসাবে তৈরি করেছিinputs=tf.placeholder('float',[None,2],name='Input')
targets=tf.placeholder('float',name='Target')
সুতরাং এটি আমাদের placeholders. আমরা ওজনে স্থানান্তর করতে দেয় এগুলির কোনও পরিবর্তন করতে যাচ্ছি নাHistogram Summary For Weights
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")
tf.summary.histogram("weight_1",weight1)
এখানে আমরা যা করেছি তা হল আমাদের পড়ার জন্য tf.summary.histogram () ব্যবহার করে একটি হিস্টোগ্রাম সংক্ষিপ্তসার তৈরি করা। সুতরাং টেনসর বোর্ডে আমরা ওজনের হিস্টোগ্রামের ডেটা দেখতে সক্ষম হব। প্রথম যুক্তি হ'ল সেই plot টের নাম এবং দ্বিতীয়টি হ'ল plot টের মান (অনুরূপ plot কে আলাদা করার জন্য নামটিতে আন্ডারস্কোর \"_\" ব্যবহার করা ভাল, আমরা কেন এটি কার্যকর তা দেখতে পাবো)।
আমরা যেমন এটি করেছি ঠিক তেমন লুকানো স্তর এবং পরবর্তী আউটপুট স্তরটি সম্পূর্ণ করতে .
hLayer=tf.matmul(inputs,weight1)
hLayer=hLayer+biases1
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")
tf.summary.histogram("weight_2",weight2)
output=tf.matmul(hLayer,weight2)
output=output+biases2
output=tf.sigmoid(output, name='outActivation')
আমরা আউটপুট স্তরটি তৈরি করেছি যাতে error / cost গণনা করা যায় এবং অপটিমাইজার নোড তৈরি করা যায়cost=tf.squared_difference(targets ,output)
cost=tf.reduce_mean(cost)
tf.summary.scalar("cost", cost)
optimizer=tf.train.AdamOptimizer().minimize(cost)
আমরা error / cost গণনা নোড তৈরি করেছি এবং আমরাtf.summary.scalar(“cost”, cost) ব্যবহার করে cost র জন্য added a summary করেছি।তাহলে কেন cost জন্য scalar স্কেলারের সংক্ষিপ্তসার এবং ওজনগুলির জন্য হিস্টোগ্রামের সারাংশ?
স্কেলার সারাংশ একক মানগুলির সাথে কাজ করে এবং এটি 2D (x, y) এর সাথে সময় পদক্ষেপ হিসাবে x এবং স্কেলারের মান হিসাবে y এর স্থানাঙ্কে প্লট করে। যেখানে ডেটা সংগ্রহ করার সময় আমরা হিস্টোগ্রামটি ব্যবহার করি এবং আমরা প্রতিটি মানের জন্য প্লট চাই না, বা সংগ্রহে কয়েক হাজার মান থাকলে তা সম্ভব হয় না। এই ক্ষেত্রে আমরা কীভাবে ডেটা বিতরণ করা হয় তা দেখতে চাই। হিস্টোগ্রামে ডেটা বন্টন দেখানো হয়
কিছু ইনপুট এবং লক্ষ্য তৈরি করতে দেয়
#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)
এখন আসুন সেশন শুরু করা যাক
এখনও আমরা কেবল summary তে কী লিখতে হবে তা সেন্সরফ্লো বর্ণনা করেছি। এখন session ভিতরে আমরা আসলে এটি লিখতে যাচ্ছি।
epochs=10 # number of time we want to repeat
import datetime
with tf.Session() as sess:
summaryMerged = tf.summary.merge_all()
filename="./summary_log/run"+datetime.datetime.now().strftime("%Y-%m-%d--%H-%M-%s")
writer = tf.summary.FileWriter(filename, sess.graph)
tf.global_variables_initializer().run()
for i in range(epochs):
error,_,sumOut =sess.run([cost,optimizer,summaryMerged],feed_dict={inputs: inp,targets:out})
# print(i,error) # we dont need this anymore
writer.add_summary(sumOut,i)
উপরের কোডে আমরা Name sess দিয়ে একটি অধিবেশন শুরু করেছি, আমরা tf.summary.merge_all() পদ্ধতিটি ব্যবহার করে সমস্ত summary কে একটি একক summary নোডে মিশিয়ে দিয়েছি এবং এর name টি summaryMerged. নামকরণ করেছি ।
এরপরে আমাদের একটি summary writer দরকার ছিল যা একটি ফাইলে summary writer লিখবে এবং আমাদের টেনসরবোর্ড সেই ফাইলটি পড়বে এবং স্ক্রিনে summary আপডেট করবে। সুতরাং আমরা summary ফাইলটি সঞ্চয় করার জন্য একটি ফাইল path তৈরি করেছি। আমি ফাইলের নামের শেষে একটি time stamp টাইম স্ট্যাম্প যুক্ত করেছি। এই বারে স্ক্রিপ্টটি চালানোর সময় আমাদের পুরানো summary ফাইলটি মুছতে হবে না। (অন্যথায় পূর্বের রানগুলির সমস্ত ডেটা একই plots যুক্ত হবে এবং এটি গোলযোগে পরিণত হবে)
এখন sess.run () এর জন্য লুপের অভ্যন্তরে আমরা ummaryMerged নোড এবং আউটপুটটি SumOut ভেরিয়েবলের মধ্যে মূল্যায়ন করব।
অবশেষে আমরা লিখছি যে ফাইলটিতে রাইটার অবজেক্ট writer.add_summary(sumOut,i) ব্যবহার করে, প্রথম যুক্তি হল summary output এবং দ্বিতীয় যুক্তি হল এই time step ক্ষেত্রে সময় পদক্ষেপ যা আমরা পুনরাবৃত্তি সংখ্যা ব্যবহার করেছি i ।
আমরা টার্মিনালে নিম্নলিখিত কমান্ডটি ব্যবহার করে টেনসরবোর্ড চালাব।
tensorboard --logdir=./summary_log/
যেখানে flag–logdir এর মান এই ফাইলের নামের আগে summary write ফাইলের সমান হওয়া ./summary_log/ উচিত।
অবশেষে কিছু আউটপুট দেখতে
আপনি যদি সফলভাবে টেনসরবোর্ড শুরু করে থাকেন তবে আপনি স্ক্রিনে এই আউটপুটটি দেখতে পাবেন

এখানে যেমন বলা হচ্ছে আমার টেনসরবোর্ডটি ইউআরএল http://192.168.0.102:6006 এটি আপনার ক্ষেত্রে ভিন্ন হতে পারে। আপনার ব্রাউজারে এটি অনুলিপি করুন এবং এটি খুলুন। আপনি একটি পৃষ্ঠায় কিছু পাবেন

টেনসর বোর্ড স্কেলার স্ক্রিন
টেনসরবোর্ডটি এই স্ক্রিনে স্কেলার ট্যাব স্ক্রিনের সাথে শুরু হয় আমরা screen সমস্ত স্কেলার ভেরিয়েবলগুলি দেখতে পাব, এখানে আমরা cost summary টি এটি হ্রাস পেতে দেখতে পেলাম তবে 0.250 এ থামলাম। অন্যান্য ট্যাবগুলি দেখুন।
Histograms

এটি হিস্টোগ্রাম, যদি আপনি সঠিকভাবে মনে রাখেন তবে আমরা ওজনের জন্য সারাংশের নামগুলি ওজন_1 এবং ওজন 3 হিসাবে সেট করি, এটি কারণ আমরা এটি করেছি। এখন যদি আমরা Split on underscore অপশনটি পরীক্ষা করি তবে এটি একই উপসর্গ “weight” সহ সমস্ত প্লটকে গ্রুপ করবে।
সুতরাং এখানে আমরা সময়ের সাথে সাথে ওজনের মানগুলির হিস্টোগ্রামটি দেখতে পারি। এক্স-অক্ষগুলি মানগুলিকে উপস্থাপন করে, y- অক্ষ হ'ল ঘনত্ব, ওজন ম্যাট্রিক্সের সমস্ত ওজনের মধ্যে কতগুলি ওজনের সেই নির্দিষ্ট মান রয়েছে এবং z-axis জেড-অক্ষটি time steps পদক্ষেপগুলি।
সুতরাং প্রশিক্ষণটি হ'ল ওজন কীভাবে স্থানান্তরিত হচ্ছে তা আমরা দেখতে পাচ্ছি।
Runs
যদি আপনি মনে করতে পারেন তবে আমরা লেখকের ফাইল ফাইলের শেষে একটি সময় পদক্ষেপও যুক্ত করেছি। সুতরাং যতবারই আমরা কোডটি পুনরায় চালু করব এটি একটি নতুন ফাইল তৈরি করবে। সুতরাং কোডটি আবার চালানো যাক এবং ব্রাউজারে টেনসরবোর্ডটি রিফ্রেশ করুন।

Tensor Board With Multiple Runs
সুতরাং আমরা এখন আমাদের রান অপশনে দুটি রান দেখতে পাচ্ছি। এখন আমরা আমাদের বর্তমান রানটিকে আগের রানের সাথে তুলনা করতে পারি এবং কোডটিতে আমাদের পরিবর্তনগুলি আসলে কোনও ভাল করছে বা এটি একই রকম করছে কিনা তা দেখতে পারি।
Graphs
এখন আসুন আমরা যে নেটওয়ার্কটি তৈরি করেছি তা প্রকৃতপক্ষে আমাদের পরিকল্পনা করা নেটওয়ার্ক বা এর অন্য কিছু দেখতে দেয়। আসুন গ্রাফ ট্যাবে যান।
Tensor Board Network Graph
এখন এটি সম্পূর্ণ বিভ্রান্তিকর। অবশ্যই আমরা ডায়াগ্রামে কিছু অর্থপূর্ণ জিনিস খুঁজে পেতে পারি যেমন আমরা suck as কে নামকরণ করেছি ওজন 1 বায়াস 1 হিসাবে suck করি এবং আমরা matmul ম্যাটমুল বুঝতে এবং যুক্ত করতে পারি। তবে এটি শীর্ষে এটি কোডে আমরা কিছু করি নি। সুতরাং কোনও কোডটি কীভাবে ডিবাগ করা যায় যেখানে অর্ধেক জিনিস আমরা আসলে জানি না।
অবশ্যই আমরা ডায়াগ্রামে কিছু অর্থপূর্ণ জিনিস খুঁজে পেতে পারি যেমন আমরা স্তন্যপানকে নামকরণ করেছি ওজন 1 বায়াসেস 1 হিসাবে স্তন্যপান করি এবং আমরা ম্যাটমুল বুঝতে এবং যুক্ত করতে পারি।
তবে এটি জেনে রাখা আমাদের পক্ষে জিনিসগুলি সহজ করে না। আমাদের কেবল আমাদের কোডটি দেখতে হবে যাতে আমরা ডিবাগিংয়ে ফোকাস করতে পারি। এবং এখানে Scopes. এর ভূমিকা আসে। এটি দেখতে দিন
What is Scopes
সুতরাং স্কোপটি মূলত অপারেশনগুলির একটি গোষ্ঠীকরণ এবং তাদের একটি নাম দেওয়া, যাতে গ্রাফটিতে আমরা সেই নির্দিষ্ট স্কোপ ব্লকের ভিতরে সেই অপারেশনটি দেখতে পাই, (কিছুটা সি ++ বা সি # তে নেমস্পেসের মতো)।ঠিক আছে, সুযোগ সহ আমাদের আগের কোডটি সংশোধন করতে দিন,
আমরা নিম্নলিখিত উপায়ে group করতে স্কোপগুলি ব্যবহার করতে পারি
with tf.name_scope("Input") as scope:
inputs=tf.placeholder('float',[None,2],name='Input')
with tf.name_scope("Target") as scope:
targets=tf.placeholder('float',name='Target')
সুতরাং আমরা ইনপুটplaceholder টিকে \"ইনপুট\" নামের স্কোপের ভিতরে এবং লক্ষ্যগুলি placeholder “Target”নামে একটি স্কোপের ভিতরে রাখি।
Lets do the same thing with the rest of the code
এর ফলাফল দেখুন
সুতরাং আমরা নেটওয়ার্কের বিশ্রামের rest of the network জন্য একই জিনিসটি করেছি এবং তাদের যথাযথভাবে grouped ভুক্ত করেছি। সুতরাং এখন যদি আমরা নেটওয়ার্কটি আবার চালিত করি এবং টেনসরবোর্ডে এটি দেখতে পাই যা আমাদের দেখা উচিত।
Tensor Board Network Graph with scope
এখন এটি উপলব্ধি করে তোলে আমাদের একটি ইনপুট স্তর একটি লুকানো স্তর এবং একটি আউটপুট স্তর রয়েছে। এখন অপ্টিমাইজেশন ব্লক লক্ষ্য মানগুলি ব্যবহার করছে এবং এররর টি গণনা করতে আউটপুট মানগুলি গ্রহণ করছে এবং প্রতিটি স্তরের ওজন অনুসারে সংশোধন করবে। সুতরাং এটি নেটওয়ার্কের প্রতিটি স্তরের সাথে যুক্ত।
অপ্টিমাইজেশন ব্লকটি পৃথক করা যাক, আমরা এতে আগ্রহী নই।
আমরা অপ্টিমাইজেশন ব্লকে ডান-ক্লিক করতে এবং এটিকে মূল গ্রাফ থেকে আলাদা করতে পারি। সুতরাং এটি দেখতে হবে।
এখন যেহেতু এর বহির্মুখী আমরা আমাদের ডিজাইনটি আরও স্পষ্ট দেখতে পাচ্ছি। এটিতে 1 ইনপুট স্তর 1 লুকানো স্তর এবং একটি আউটপুট স্তর রয়েছে। এখন যদি আমরা এটি জুম করে থাকি তবে আমরা দেখতে পাবো যে সেখানে কত সংখ্যক নিউরন রয়েছে। ইনপুট থেকে লুকানোতে এটির 2 টি নিউরন এবং লুকানো থেকে আউটপুট পর্যন্ত এর 3 নিউরন। (মূলত তারা এখন ম্যাট্রিক্স / টেনসর / basically they are matrix / tensors now)।
Hidden layer expanded
এখন আমরা যদি লুকানো স্তরটিতে ডাবল ক্লিক করি তবে আমরা গোপন স্তরের ভিতরে যা কিছু করেছি তা দেখতে পাব।
সুতরাং এই অপারেশনগুলি আমরা লুকানো স্তরগুলির অভ্যন্তরে করেছি। এখন এটি অবশ্যই বোধগম্য হয়ে উঠছে। এটি ওজন তৈরি করে এবং একটি ম্যাটমুল ক্রিয়াকলাপ সম্পাদন করে। তারপরে ম্যাথামুলের আউটপুটটিতে যুক্ত করে একটি bias তৈরি করা। এর পরে আমরা এটিতে একটি সক্রিয়করণ অপারেশন করলাম এবং এটি লুকানো স্তরের চূড়ান্ত ফলাফল।
0 comments:
Post a Comment