برنامه نویسی

نمایش عبارات ریاضی به عنوان نمودارها در میکروگراد

سلام من Shrijith Venkatrama ، بنیانگذار Hexmos هستم. در حال حاضر ، من در حال ساختن LiveApi هستم ، ابزاری که تولید اسناد API را از کد شما به طرز مسخره ای آسان می کند.

آنچه می خواهیم نمایندگی کنیم

در آخرین پست ، ما به صورت دستی برخی از محاسبه های شیب را انجام دادیم:

h = 0.001

#inputs 
a = 2.0
b = -3.0
c = 10.0

d1 = a*b + c
c += h
d2 = a*b + c


print(f"d1 = {d1}")
print(f"d2 = {d2}")
print(f"w.r.t a (d2 - d1) / h = {(d2 - d1) / h}")
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

هدف نشان دادن عبارت فوق است L = a*b + c به روشی آسان ، و سپس عملیات مهم را در مورد آن انجام دهید ، مانند Find dL/daبا dL/dbبا dL/dc، و غیره این مهم است زیرا آموزش شبکه عصبی در مورد تنظیم مقادیر هر گره در نمودار بیان است ، تا زمانی که ورودی ها به صورت مطلوب نقشه برداری شوند.

ساختمان Value کلاس (بنیاد دریافت شبکه های عصبی)

اولین قدم برای تحقق موارد فوق نشان دادن یک مقدار واحد است.

تکرار 1: یک مقدار واحد را نشان می دهد

class Value:
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return f"Value(data={self.data})"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تنظیم یک مقدار مثال

تکرار 2: مقادیر و عملیات متعدد را بر روی آنها نشان می دهد

ما علاوه بر این و تکثیر را در Value کلاس به طوری که بتوانیم انجام دهیم a + b یا a * b + c

class Value:
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return f"Value(data={self.data})"

  def __add__(self, other):
    return Value(self.data + other.data)

  def __mul__(self, other):
    return Value(self.data * other.data)

a = Value(2.0)
b = Value(-3.0)
print(a*b)
c = Value(10)
print(a * b + c)
print((a.__mul__(b)).__add__(c)) # same as above
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اپراتورها و عبارات ارزش

تکرار 3: کامل عبارات را ذخیره کنید

مرحله بعدی ذخیره “زنجیره کل” ارزش ها و عملیات در یک نمودار خوب است.

نحوه انجام این کار از طریق معرفی دو ویژگی شیء جدید است: _prev وت _opبشر برای هر گره – ما ضبط می کنیم گره های زیر/قبل از آن چیست. و همچنین – ما مشخص می کنیم که چه عملیاتی بین گره هایی انجام شده است که قبل از آن برای بدست آوردن گره فعلی انجام شده است.

class Value:
  def __init__(self, data, _children=(), _op=''):
    self.data = data
    self._prev = set(_children)
    self._op = _op

  def __repr__(self):
    return f"Value(data={self.data})"

  def __add__(self, other):
    return Value(self.data + other.data, (self, other), '+')

  def __mul__(self, other):
    return Value(self.data * other.data, (self, other), '-')

a = Value(2.0)
b = Value(-3.0)
c = Value(10)
e = a * b
d = e + c
print(d._prev)
print(d._op)
print("---")
print(e._prev)
print(e._op)`
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کل بیان

تجسم نمودار بیان

Karpathy کمی از کد خوب ساخته شده در بالای Graphviz را برای نمایش عبارات به عنوان نمودار به اشتراک می گذارد. مقادیر در اسکارا ها و عملیات در بیضی ها نشان داده شده است:

from graphviz import Digraph

def trace(root):
    # Builds a set of all nodes and edges in a graph
    nodes, edges = set(), set()

    def build(v):
        if v not in nodes:
            nodes.add(v)
            for child in v._prev:
                edges.add((child, v))
                build(child)

    build(root)
    return nodes, edges

def draw_dot(root):
    dot = Digraph(format='svg', graph_attr={'rankdir': 'LR'})  # LR = left to right

    nodes, edges = trace(root)
    for n in nodes:
        uid = str(id(n))
        # For any value in the graph, create a rectangular ('record') node for it
        dot.node(name=uid, label="{ data %.4f }" % (n.data,), shape='record')

        if n._op:
            # If this value is a result of some operation, create an op node for it
            dot.node(name=uid + n._op, label=n._op)
            # And connect this node to it
            dot.edge(uid + n._op, uid)

    for n1, n2 in edges:
        # Connect n1 to the op node of n2
        dot.edge(str(id(n1)), str(id(n2)) + n2._op)

    return dot
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من می توانم موارد زیر را برای دریافت تصویری از نمودار انجام دهم:

draw_dot(d) # where d is the expression defined above
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تصویر نمودار

مرجع

مقدمه املایی به شبکه های عصبی و backpropagation: ساختمان میکروگراد)

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا