Skip to content

Instantly share code, notes, and snippets.

@veb-101
Last active November 11, 2022 10:31
Show Gist options
  • Save veb-101/5947cd7109a6d1adba872a089964b724 to your computer and use it in GitHub Desktop.
Save veb-101/5947cd7109a6d1adba872a089964b724 to your computer and use it in GitHub Desktop.
Radial basis function network for XOR
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"toc": true
},
"source": [
"<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
"<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Using-Matrices-to-solve-systems-of-Linear-Equations\" data-toc-modified-id=\"Using-Matrices-to-solve-systems-of-Linear-Equations-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>Using Matrices to solve systems of Linear Equations</a></span></li><li><span><a href=\"#Using-Tensorflow\" data-toc-modified-id=\"Using-Tensorflow-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>Using Tensorflow</a></span></li></ul></div>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:53.867520Z",
"start_time": "2020-05-02T19:13:46.653073Z"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import tensorflow as tf\n",
"from tensorflow.keras.initializers import Initializer\n",
"from tensorflow.keras.layers import Layer\n",
"from tensorflow.keras.initializers import RandomUniform, Initializer, Constant"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Using Matrices to solve systems of Linear Equations"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:53.882217Z",
"start_time": "2020-05-02T19:13:53.867520Z"
}
},
"outputs": [],
"source": [
"def gaussian_rbf(x, landmark, gamma=1):\n",
" return np.exp(-gamma * np.linalg.norm(x - landmark)**2)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:54.018699Z",
"start_time": "2020-05-02T19:13:53.886392Z"
}
},
"outputs": [],
"source": [
"# solving problem using matrices form\n",
"# AW = Y"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:54.151289Z",
"start_time": "2020-05-02T19:13:54.028352Z"
}
},
"outputs": [],
"source": [
"def end_to_end(X1, X2, ys, mu1, mu2):\n",
" from_1 = [gaussian_rbf(i, mu1) for i in zip(X1, X2)]\n",
" from_2 = [gaussian_rbf(i, mu2) for i in zip(X1, X2)]\n",
" # plot\n",
" \n",
" plt.figure(figsize=(13, 5))\n",
" plt.subplot(1, 2, 1)\n",
" plt.scatter((x1[0], x1[3]), (x2[0], x2[3]), label=\"Class_0\")\n",
" plt.scatter((x1[1], x1[2]), (x2[1], x2[2]), label=\"Class_1\")\n",
" plt.xlabel(\"$X1$\", fontsize=15)\n",
" plt.ylabel(\"$X2$\", fontsize=15)\n",
" plt.title(\"Xor: Linearly Inseparable\", fontsize=15)\n",
" plt.legend()\n",
"\n",
" plt.subplot(1, 2, 2)\n",
" plt.scatter(from_1[0], from_2[0], label=\"Class_0\")\n",
" plt.scatter(from_1[1], from_2[1], label=\"Class_1\")\n",
" plt.scatter(from_1[2], from_2[2], label=\"Class_1\")\n",
" plt.scatter(from_1[3], from_2[3], label=\"Class_0\")\n",
" plt.plot([0, 0.95], [0.95, 0], \"k--\")\n",
" plt.annotate(\"Seperating hyperplane\", xy=(0.4, 0.55), xytext=(0.55, 0.66),\n",
" arrowprops=dict(facecolor='black', shrink=0.05))\n",
" plt.xlabel(f\"$mu1$: {(mu1)}\", fontsize=15)\n",
" plt.ylabel(f\"$mu2$: {(mu2)}\", fontsize=15)\n",
" plt.title(\"Transformed Inputs: Linearly Seperable\", fontsize=15)\n",
" plt.legend()\n",
"\n",
" # solving problem using matrices form\n",
" # AW = Y\n",
" A = []\n",
"\n",
" for i, j in zip(from_1, from_2):\n",
" temp = []\n",
" temp.append(i)\n",
" temp.append(j)\n",
" temp.append(1)\n",
" A.append(temp)\n",
" \n",
" A = np.array(A)\n",
" W = np.linalg.inv(A.T.dot(A)).dot(A.T).dot(ys)\n",
" print(np.round(A.dot(W)))\n",
" print(ys)\n",
" print(f\"Weights: {W}\")\n",
" return W"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:54.310490Z",
"start_time": "2020-05-02T19:13:54.157947Z"
}
},
"outputs": [],
"source": [
"def predict_matrix(point, weights):\n",
" gaussian_rbf_0 = gaussian_rbf(np.array(point), mu1)\n",
" gaussian_rbf_1 = gaussian_rbf(np.array(point), mu2)\n",
" A = np.array([gaussian_rbf_0, gaussian_rbf_1, 1])\n",
" return np.round(A.dot(weights))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:55.571342Z",
"start_time": "2020-05-02T19:13:54.317033Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-0. 1. 1. -0.]\n",
"[0 1 1 0]\n",
"Weights: [ 2.5026503 2.5026503 -1.84134719]\n",
"Input:[0 0], Predicted: -0.0\n",
"Input:[0 1], Predicted: 1.0\n",
"Input:[1 0], Predicted: 1.0\n",
"Input:[1 1], Predicted: -0.0\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 936x360 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# points\n",
"x1 = np.array([0, 0, 1, 1])\n",
"x2 = np.array([0, 1, 0, 1])\n",
"ys = np.array([0, 1, 1, 0])\n",
"\n",
"# centers\n",
"mu1 = np.array([0, 1])\n",
"mu2 = np.array([1, 0])\n",
"\n",
"w = end_to_end(x1, x2, ys, mu1, mu2)\n",
"\n",
"# testing\n",
"\n",
"print(f\"Input:{np.array([0, 0])}, Predicted: {predict_matrix(np.array([0, 0]), w)}\")\n",
"print(f\"Input:{np.array([0, 1])}, Predicted: {predict_matrix(np.array([0, 1]), w)}\")\n",
"print(f\"Input:{np.array([1, 0])}, Predicted: {predict_matrix(np.array([1, 0]), w)}\")\n",
"print(f\"Input:{np.array([1, 1])}, Predicted: {predict_matrix(np.array([1, 1]), w)}\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:56.331977Z",
"start_time": "2020-05-02T19:13:55.577869Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0. 1. 1. 0.]\n",
"[0 1 1 0]\n",
"Weights: [-2.5026503 -2.5026503 2.84134719]\n",
"Input:[0 0], Predicted: 0.0\n",
"Input:[0 1], Predicted: 1.0\n",
"Input:[1 0], Predicted: 1.0\n",
"Input:[1 1], Predicted: 0.0\n"
]
},
{
"data": {
"image/png": "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pImPD76PTnEoIqWuPPWur1yo9IIICAhg27ZteeaZPXs2devWZceOHURFRZGWlgZAaGgo69evp379+gwfPpxFixZRq1YtduzYQVhYGHPnzmXMmDG5llu3bl0S7V7HxMREfH19i7wdrspjw6HAXc8ldgepZoPCpSulVCkrjUrsSiMi/wE2Ac1FJF5ERovIOBHJGjD8BbAP+BWYB0xwKFRH1ezbF7/np1OxXj0QoWK9evg9P52affs6HZpSV4zHezWnsneFHGmVvSvweK/mRS6zW7duXLx4kXnz5mWnbd26lYMHD2YvJyUl4efnh5eXF4sXLyYjw+ppPnjwIL6+vowdO5bRo0cTHR3NyZMnyczMZMCAATz//PNER0fnuu5+/foRGRkJQGRkJPfcc0+Rt8OVE8845KfAXc8lpvszOZ9xAPCubKUrpZQDHu/VPMczDlD8SuxKY4wZms/rBphYRuGUazX79tWGglLFkPUcw6urf+HI2RTqXV+Zx3s1L9YzZSLC8uXLmTJlCjNnzsTHxwd/f3/mzPl94oIJEyYwYMAAli1bRteuXalatSoA69at49VXX8Xb25tq1aqxaNEiEhISGDVqFJmZmQC89NJLua576tSp3HfffcyfP5+bbrqJZcuWFXk7cmyTdd4tWyLiD3xmjLlsElsRuRt4GOiN9VD0G8aYdvmVGRISYqKioooe1E9LrWcakuKtnobuz+iD0UopR634MaGkK7FtxpiQEgzxilTs+kIpdUXYvXs3LVq0cDqMcs3TPsqrrijzHge76zkMqCMi8cCzgDeAMeZfWF3PvbG6ni8Ao8oksNvu04aCUqpcubd1fZ1BSSmlVLlR5g0H7XpWSimllFKq+CZOnMj333+fI23y5MmMGlU6993L4zMOSimllFJKqXzMnTu3TNdXHmdVUkoppZRSSpUz2nBQSimllFJK5UsbDkoppVQBJCcn89lnnzkdhlJKOUYbDkoppVQBvPrqq/Tt25enn346ex51pZS6lmjDQSmllCqAadOmMWrUKF544QUGDRpEcnKy0yEppcq5o0ePMmTIEJo2bUrLli3p3bs3e/bsITDwsp8yK1HLli0jICAALy8vSvJ3a7ThoJRSShVApUqVmD9/Pq+99horVqygc+fOHD582OmwlFIl5aelMDsQIq63/v1pabGKM8bQv39/wsLC2Lt3L7GxscyY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4go++ugjWrRoEZX9F2bWrFk0b96clJQUyvC1CJYBrxXQvgRYGt8oIvFz2223sXjxYu655x4qVIh0GKlI+VOk32p3f8fMrgDeBBaHm+cD9+S/OJyISJmxcSa8fCccPRS6v/+T0H2AVv1LvFt3p0+fPtxyyy288MILAGzYsIF///vfpU0cUYsWLZgzZw633XZbzF+rFH4CFHR10e6AxTmLSFx17do19/bMmTP56quvyvr/V5EiizjjYGYZZvY0sIHQG/7c8EN7CV38TUSkbHpt3H+KhhOOHgq1l8LSpUtJS0vj9ttvz23LyMigfv36ufe3b99O586dadOmDW3atOGNN0Jvl7t376ZLly5kZGTQokULVq5cyfHjx7n11ltp0aIFLVu2ZNKkSYW+dtOmTWnSpEmp8seauy939xUFtK9w9+VBZBIJwqxZs7j99tu58847tXRJEsJJZxzMbDnQCdgC3As86+7fmllPQtd4aGlm17j7zthHFREppv2FvDUV1l5E7777Lv/1X/910m1q167N4sWLqVSpElu2bGHgwIFkZ2czY8YMLr30Uh544AGOHz/OwYMH2bBhA7t27eLdd98FYN++faXKV1aZWRpQx93/FXQWkXh44YUX+J//+R8ef/xxPvjgA1588UVOO+20oGOJlFikGYdDQE93P9/d/+ju3wK4+ytAO6Ay4eMeYpxTRKT4qtcrXnsUHT16lKFDh9KyZUv69evHe++9B0Dbtm155plnGDNmDJs2baJatWo0atSIbdu2MXLkSP7+979z6qmnxjxftJnZHWa21cy+MbO3zOymAjZrA/wz3tlEgpKamspjjz3G008/zbJly+jQoQNff/110LFESizSWZUuc/e/F/LYx0B7Qge7LTKzUTHIJyJSct0fhrT077elpYfaS6F58+asW7fupNtMmjSJM888k3feeYfs7Gy+++47ALp06cKKFSuoW7cuN910E8899xynnXYa77zzDl27diUrK4shQ4aUKl+8mdkA4A+EjoMbC3wKTDOz2WaWftIniySBQYMGsWTJEgYOHFguPxgQOSHiMQ4n4+4H3X0AcD8wPjqRRESipFV/uGoyVK8PWOj7VZNLdWA0QLdu3Thy5AhPPfVUbtvatWvZsWNH7v39+/dTp04dUlJSmD59eu5FoXbs2EHt2rUZOnQogwcP5u233+aLL74gJyeH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\n",
"text/plain": [
"<Figure size 936x360 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# centers\n",
"mu1 = np.array([0, 0])\n",
"mu2 = np.array([1, 1])\n",
"\n",
"w = end_to_end(x1, x2, ys, mu1, mu2)\n",
"\n",
"# testing\n",
"\n",
"print(f\"Input:{np.array([0, 0])}, Predicted: {predict_matrix(np.array([0, 0]), w)}\")\n",
"print(f\"Input:{np.array([0, 1])}, Predicted: {predict_matrix(np.array([0, 1]), w)}\")\n",
"print(f\"Input:{np.array([1, 0])}, Predicted: {predict_matrix(np.array([1, 0]), w)}\")\n",
"print(f\"Input:{np.array([1, 1])}, Predicted: {predict_matrix(np.array([1, 1]), w)}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Using Tensorflow"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:56.347353Z",
"start_time": "2020-05-02T19:13:56.336516Z"
}
},
"outputs": [],
"source": [
"class CustomPeaks(Initializer):\n",
" def __init__(self, mu1, mu2):\n",
" self.mu1 = mu1\n",
" self.mu2 = mu2\n",
" super().__init__()\n",
" \n",
" def __call__(self, shape, dtype=None):\n",
" outs = np.c_[self.mu1, self.mu2]\n",
" return tf.convert_to_tensor(outs, dtype=\"float\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:56.484861Z",
"start_time": "2020-05-02T19:13:56.350734Z"
},
"hide_input": false
},
"outputs": [],
"source": [
"'''\n",
" author: https://github.com/PetraVidnerova/rbf_for_tf2\n",
"'''\n",
"\n",
"class InitCentersRandom(Initializer):\n",
" \"\"\" Initializer for initialization of centers of RBF network\n",
" as random samples from the given data set.\n",
"\n",
" # Arguments\n",
" X: matrix, dataset to choose the centers from (random rows\n",
" are taken as centers)\n",
" \"\"\"\n",
"\n",
" def __init__(self, X):\n",
" self.X = X\n",
" super().__init__()\n",
"\n",
" def __call__(self, shape, dtype=None):\n",
" assert shape[1:] == self.X.shape[1:] # check dimension\n",
"\n",
" # np.random.randint returns ints from [low, high) !\n",
" idx = np.random.randint(self.X.shape[0], size=shape[0])\n",
"\n",
" return self.X[idx, :]\n",
"\n",
"\n",
"class RBFLayer(Layer):\n",
" \"\"\" Layer of Gaussian RBF units.\n",
"\n",
" # Example\n",
"\n",
" ```python\n",
" model = Sequential()\n",
" model.add(RBFLayer(10,\n",
" initializer=InitCentersRandom(X),\n",
" betas=1.0,\n",
" input_shape=(1,)))\n",
" model.add(Dense(1))\n",
" ```\n",
"\n",
"\n",
" # Arguments\n",
" output_dim: number of hidden units (i.e. number of outputs of the\n",
" layer)\n",
" initializer: instance of initiliazer to initialize centers\n",
" betas: float, initial value for betas\n",
"\n",
" \"\"\"\n",
"\n",
" def __init__(self, output_dim, initializer=None, betas=1.0, **kwargs):\n",
"\n",
" self.output_dim = output_dim\n",
"\n",
" # betas is either initializer object or float\n",
" if isinstance(betas, Initializer):\n",
" self.betas_initializer = betas\n",
" else:\n",
" self.betas_initializer = Constant(value=betas)\n",
"\n",
" self.initializer = initializer if initializer else RandomUniform(\n",
" 0.0, 1.0)\n",
"\n",
" super().__init__(**kwargs)\n",
"\n",
" def build(self, input_shape):\n",
"\n",
" self.centers = self.add_weight(name='centers',\n",
" shape=(self.output_dim, input_shape[1]),\n",
" initializer=self.initializer,\n",
" trainable=False)\n",
" self.betas = self.add_weight(name='betas',\n",
" shape=(self.output_dim,),\n",
" initializer=self.betas_initializer,\n",
" # initializer='ones',\n",
" trainable=False)\n",
"\n",
" super().build(input_shape)\n",
"\n",
" def call(self, x):\n",
"\n",
" C = tf.expand_dims(self.centers, -1) # inserts a dimension of 1\n",
" H = tf.transpose(C-tf.transpose(x)) # matrix of differences\n",
" return tf.exp(-self.betas * tf.math.reduce_sum(H**2, axis=1))\n",
"\n",
" def compute_output_shape(self, input_shape):\n",
" return (input_shape[0], self.output_dim)\n",
"\n",
" def get_config(self):\n",
" # have to define get_config to be able to use model_from_json\n",
" config = {\n",
" 'output_dim': self.output_dim\n",
" }\n",
" base_config = super().get_config()\n",
" return dict(list(base_config.items()) + list(config.items()))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:56.625683Z",
"start_time": "2020-05-02T19:13:56.491889Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0. 0.]\n",
" [0. 1.]\n",
" [1. 0.]\n",
" [1. 1.]]\n",
"[0. 1. 1. 0.]\n"
]
}
],
"source": [
"# points\n",
"x1 = np.array([0, 0, 1, 1])\n",
"x2 = np.array([0, 1, 0, 1])\n",
"ys = np.array([0, 1, 1, 0])\n",
"\n",
"X = np.c_[x1, x2]\n",
"X = X.astype(\"float\")\n",
"ys = ys.astype(\"float\")\n",
"print(X)\n",
"print(ys)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:56.748767Z",
"start_time": "2020-05-02T19:13:56.631873Z"
}
},
"outputs": [],
"source": [
"mu1 = np.array([0, 1])\n",
"mu2 = np.array([1, 0])\n",
"\n",
"\n",
"rbflayer = RBFLayer(2,\n",
" initializer=CustomPeaks(mu1, mu2),\n",
" betas=1.0, input_shape=(2,), name=\"RFB_layer\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:13:56.885087Z",
"start_time": "2020-05-02T19:13:56.755135Z"
}
},
"outputs": [],
"source": [
"def get_model():\n",
" model = tf.keras.models.Sequential()\n",
" model.add(rbflayer)\n",
" model.add(tf.keras.layers.Dense(units=1, activation=\"sigmoid\", \n",
" kernel_initializer=\"he_normal\", name=\"Final_dense\"))\n",
" \n",
" model.compile(optimizer='sgd', loss='mean_squared_error')\n",
" model.summary()\n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:14:00.086222Z",
"start_time": "2020-05-02T19:13:56.892996Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"sequential\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"RFB_layer (RBFLayer) (None, 2) 6 \n",
"_________________________________________________________________\n",
"Final_dense (Dense) (None, 1) 3 \n",
"=================================================================\n",
"Total params: 9\n",
"Trainable params: 3\n",
"Non-trainable params: 6\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model = get_model()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:16:27.856262Z",
"start_time": "2020-05-02T19:14:00.087270Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<tensorflow.python.keras.callbacks.History at 0x28c70b8b788>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.fit(X, ys, epochs=20000, verbose=0)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:16:27.871481Z",
"start_time": "2020-05-02T19:16:27.862971Z"
}
},
"outputs": [],
"source": [
"# print(rbflayer.betas)\n",
"# print(rbflayer.centers)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:16:28.684169Z",
"start_time": "2020-05-02T19:16:27.877423Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Input: (0, 0), Actual: 0, Predicted:0.0\n",
"Input: (0, 1), Actual: 1, Predicted:1.0\n",
"Input: (1, 0), Actual: 1, Predicted:1.0\n",
"Input: (1, 1), Actual: 0, Predicted:0.0\n"
]
}
],
"source": [
"print(f\"Input: {0, 0}, Actual: 0, Predicted:{np.round(model.predict([[0.0, 0.0]])[0][0])}\")\n",
"print(f\"Input: {0, 1}, Actual: 1, Predicted:{np.round(model.predict([[0.0, 1.0]])[0][0])}\")\n",
"print(f\"Input: {1, 0}, Actual: 1, Predicted:{np.round(model.predict([[1.0, 0.0]])[0][0])}\")\n",
"print(f\"Input: {1, 1}, Actual: 0, Predicted:{np.round(model.predict([[1.0, 1.0]])[0][0])}\")"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:16:28.867588Z",
"start_time": "2020-05-02T19:16:28.688435Z"
}
},
"outputs": [],
"source": [
"model.save(\"rbf.h5\")"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:16:28.891586Z",
"start_time": "2020-05-02T19:16:28.873758Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[<tf.Variable 'Final_dense/kernel:0' shape=(2, 1) dtype=float32, numpy=\n",
" array([[3.2967117],\n",
" [3.2983806]], dtype=float32)>,\n",
" <tf.Variable 'Final_dense/bias:0' shape=(1,) dtype=float32, numpy=array([-3.017896], dtype=float32)>]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.layers[-1].weights"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:16:29.117422Z",
"start_time": "2020-05-02T19:16:28.897712Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=220x592 at 0x28C00A506C8>"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from PIL import Image\n",
"\n",
"Image.open(\"rbfn.png\")"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-02T19:16:29.245617Z",
"start_time": "2020-05-02T19:16:29.125199Z"
}
},
"outputs": [],
"source": [
"# # points\n",
"# x1 = np.array([0, 0, 1, 1])\n",
"# x2 = np.array([0, 1, 0, 1])\n",
"# ys = np.array([0, 1, 1, 0])\n",
"\n",
"# # centers\n",
"# mu1 = np.array([0, 0])\n",
"# mu2 = np.array([1, 1])\n",
"\n",
"# Sim_1 = [gaussian_rbf(i, mu1) for i in zip(x1, x2)]\n",
"# Sim_2 = [gaussian_rbf(i, mu2) for i in zip(x1, x2)]\n",
"\n",
"# X = np.c_[Sim_1, Sim_2]\n",
"# X = X.astype(\"float\")\n",
"# ys = ys.astype(\"float\")\n",
"# print(X)\n",
"# print(ys)\n",
"\n",
"# # 1 output unit\n",
"# model = tf.keras.Sequential()\n",
"# model.add(tf.keras.layers.Dense(units=1, activation=\"sigmoid\", input_shape=[2], \n",
"# name=\"dense_2\", kernel_initializer=\"he_normal\"))\n",
"\n",
"# def predict_model(point):\n",
"# gaussian_rbf_0 = gaussian_rbf(np.array(point), mu1)\n",
"# gaussian_rbf_1 = gaussian_rbf(np.array(point), mu2)\n",
"# return model.predict([[gaussian_rbf_0, gaussian_rbf_1]])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.7.5 64-bit ('tensorflow': conda)",
"language": "python",
"name": "python37564bittensorflowconda2aaaf68dfe074bf88f74f0fd9d18723c"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.7"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": true,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
@veb-101
Copy link
Author

veb-101 commented May 2, 2020

You can change points to use it for different logic gates
# points
x1 = np.array([....])
x2 = np.array([....])
ys = np.array([....])

and centers by changing
# centers
mu1 = np.array([..])
mu2 = np.array([..])

@veb-101
Copy link
Author

veb-101 commented May 2, 2020

In the end_to_end function, first I calculated the similarity between the inputs and the peaks.
Then, to find w used the equation Aw= Y in matrix form.
Each row of A (shape: (4, 2)) consists of

  • index[0]: similarity of point with peak1
  • index[1]: similarity of point with peak2
  • index[2]: Bias input (1)

Y: Output associated with the input (shape: (4, ))

W is calculated using the same equation we use to solve linear regression using a closed solution (normal equation).

This part is the same as using a neural network architecture of 2-2-1,

  • 2 node input (x1, x2) (input layer)
  • 2 node (each for one peak) (hidden layer)
  • 1 node output (output layer)

To find the weights for the edges to the 1-output unit. Weights associated would be:

  • edge joining 1st node (peak1 output) to the output node
  • edge joining 2nd node (peak2 output) to the output node
  • bias edge

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment