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

এখন যেহেতু আমরা ডাটা স্ট্রাকচার গুলো নিয়ে মোটামুটি একটা ধারনা পেলাম, চলুন দেখি TensorFlow কিভাবে ভ্যারিয়েবল হ্যান্ডেল করে। ভ্যারিয়েবল ডিফাইন করতে হয় tf.Variable() স্টেটমেন্টের মাধ্যমে। তবে মনে রাখা জরুরি - কম্পিউটেশন গ্রাফে ভ্যারিয়েবল গুলো ব্যবহারের জন্য সেগুলোকে ইনিসিয়ালাইজ করতে হবে (গ্রাফকে সেশনে রান করানোর আগেই)। এটা করা হয় tf. global\_variables\_initializer() এর মাধ্যমে। কোন ভ্যারিয়েবলের ভ্যালু আপডেট করার জন্য আমাদেরকে assign অপারেশনকে রান করতে হয়।

নিচের প্রোগ্রামটি খেয়াল করি,

```python
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 ভ্যারিয়েবলের মান প্রিন্ট করা হচ্ছে।

আউটপুট,

```python
0
1
2
3
```

এবার আসি প্লেস হোল্ডারের প্রসঙ্গে। যদি আপনি TensorFlow মডেলের বাইরে থেকে এটাকে ডাটা ইনপুট/ফিড করাতে চান তাহলে দরকার পরে এই প্লেসহোল্ডার। প্লেস হোল্ডার একরকম ভ্যারিয়েবল যেটাতে আসলে নির্দিষ্ট একটি সময় পর্যন্ত এর আসল কোন ভ্যালু থাকে না শুধু স্ট্রাকচার থাকে। একটু অন্যভাবে বলতে গেলে, প্লেসহোল্ডার মানে আপনার মডেলের কিছু গর্ত, যে গর্ত গুলোতে আপনি কিছু পরে ডাটা ঢুকাবেন। প্লেসহোল্ডার তৈরি করতে placeholder মেথড ব্যবহার করতে হয়। তৈরির সময় ডাটা টাইপ এবং এর প্রেসিশন ভ্যালুও ডিফাইন করতে হবে। নিচের টেবিলে প্রত্যেকটি ডাটাটাইপ এবং সে অনুযায়ী সিনট্যাক্স দেয়া আছে,

![](https://nuhil.files.wordpress.com/2017/05/screen-shot-2017-05-21-at-10-51-35-pm.png?w=687)

এবার নিচের প্রোগ্রামটি দেখি,

```python
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 মেথডের আরেকটি আর্গুমেন্ট হিসেবে আমরা প্লেসহোল্ডারের আসল ভ্যালু পাস করে দিতে পারি নিচের মত। পাস করার সময় প্লেসহোল্ডারের নাম এবং করেস্পন্ডীং ভ্যালুকে পাইথন ডিকশনারি ফরম্যাটে পাঠাতে হবে।

```python
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 -ই অ্যাপ্লাই হবে। নিচের প্রোগ্রাম দেখুন,

```python
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)
```

আউটপুট,

```python
[[[ 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.]]]
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dl.howtocode.dev/tf-intro/tf-var-placeholder.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
