339 lines
71 KiB
Plaintext
339 lines
71 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "2dd1fa3f",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from easynn.feedforward import (\n",
|
|
" Layer,\n",
|
|
" ReLU,\n",
|
|
" LeakyReLU,\n",
|
|
" Regularization,\n",
|
|
" Linear,\n",
|
|
" FFNN,\n",
|
|
" MSELoss,\n",
|
|
" Softmax,\n",
|
|
" CrossEntropyLoss,\n",
|
|
")\n",
|
|
"from easynn.schedulers import AdamScheduler\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"from sklearn.datasets import make_regression, make_classification\n",
|
|
"from sklearn.preprocessing import StandardScaler, OneHotEncoder\n",
|
|
"from sklearn.model_selection import train_test_split\n",
|
|
"from sklearn.metrics import mean_squared_error, accuracy_score\n",
|
|
"import logging\n",
|
|
"\n",
|
|
"logging.basicConfig(level=logging.WARNING) # Set default logging level to WARNING"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "73649f28",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Regression Example"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "79c55021",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"X, y = make_regression(n_samples=1000, n_features=5, n_informative=3, noise=0.1)\n",
|
|
"X = StandardScaler().fit_transform(X)\n",
|
|
"y = y.reshape(-1, 1)\n",
|
|
"y = StandardScaler().fit_transform(y)\n",
|
|
"X_train, X_test, y_train, y_test = train_test_split(X, y)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "8a88c060",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"layers = [Layer(5, 5, ReLU()), Layer(5, 25, ReLU()), Layer(25, 1, Linear())]\n",
|
|
"network = FFNN(layers, AdamScheduler(learning_rate=0.001, epochs=1000), MSELoss())\n",
|
|
"network.fit(X_train, y_train)\n",
|
|
"predictions = network.predict(X_test)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "515e1e02",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Text(0.5, 1.0, 'Training Loss Over Time')"
|
|
]
|
|
},
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(network.scheduler.loss_history - min(network.scheduler.loss_history) + 1e-8)\n",
|
|
"plt.yscale(\"log\")\n",
|
|
"plt.xlabel(\"Epoch\")\n",
|
|
"plt.ylabel(\"Loss\")\n",
|
|
"plt.title(\"Training Loss Over Time\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "1dd8fefc",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Text(0.5, 1.0, 'True vs Predicted Values')"
|
|
]
|
|
},
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAHHCAYAAABHp6kXAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAY19JREFUeJzt3Xl4TPf+B/D3mUlmsk9WEhJEgop9F2rf1VJaiqqlaitaW4v21+JqqdLSi9pu7RRVaq211tp3kVKJpFGCLLInk2Tm/P6IHMZMkhGTTGbyfj1Pnmu+Z8knc8O8e76bIIqiCCIiIiILJzN3AURERESmwFBDREREVoGhhoiIiKwCQw0RERFZBYYaIiIisgoMNURERGQVGGqIiIjIKjDUEBERkVVgqCEiIiKrwFBDRBZtzZo1EAQBkZGRUlvr1q3RunVrs9b1PEM1Fodjx45BEAQcO3asWL8vkbkw1BAVkiAIRn1Z+wdKpUqVdH7eMmXKoEWLFtixY4e5S3spaWlpmDFjhtn+/6pduzYqVKiA/Hauad68OcqWLYvs7OxirY3IUtiYuwAiS7V+/Xqd1+vWrcOhQ4f02qtXr17MlRW/unXrYtKkSQCABw8eYPny5ejduzeWLl2KUaNGFXs9Bw8efOlr0tLSMHPmTODpk57i9u6772Lq1Kk4efIkWrZsqXc8MjISZ86cwdixY2Fjw3+6iQzh3wyiQho4cKDO67Nnz+LQoUN67S9KS0uDg4NDEVdXvMqXL6/zcw8aNAiBgYFYsGBBnqEmOzsbWq0WCoXC5PUUxT2L2oABAzBt2jRs2rTJYKj5+eefIYoi3n33XbPUR2QJ2P1EVIRat26NmjVr4tKlS2jZsiUcHBzw2WefAU+7r2bMmKF3TaVKlTBkyBCdtoSEBIwfPx5+fn5QKpUIDAzE3LlzodVq8/3+3bp1Q+XKlQ0eCw4ORsOGDaXXhw4dwuuvvw5XV1c4OTmhWrVqUq0vy9vbG9WrV0dERATw9CmDIAiYP38+Fi5ciICAACiVSoSGhgIAbt26hbfffhvu7u6ws7NDw4YNsWvXLr373rx5E23btoW9vT18fX3x1VdfGXwPDI2pycjIwIwZM1C1alXY2dnBx8cHvXv3Rnh4OCIjI+Hl5QUAmDlzptSV9vz/P6au8UV+fn5o2bIltm3bhqysLL3jmzZtQkBAAJo0aYJ//vkHH374IapVqwZ7e3t4eHigT58+Ro3ZMfT7ldd7plarMX36dAQGBkKpVMLPzw+ffvop1Gq1znmm/N0hehV8UkNUxOLi4tClSxf069cPAwcORNmyZV/q+rS0NLRq1Qr379/HyJEjUaFCBZw+fRrTpk1DdHQ0Fi5cmOe177zzDgYNGoQLFy6gUaNGUvs///yDs2fPYt68ecDTD+Ju3bqhdu3a+M9//gOlUomwsDD8+eefhfqZs7KycO/ePXh4eOi0r169GhkZGRgxYgSUSiXc3d1x8+ZNNG/eHOXLl8fUqVPh6OiIrVu34s0338Svv/6KXr16AQAePnyINm3aIDs7WzpvxYoVsLe3L7AejUaDbt264ciRI+jXrx8+/vhjJCcn49ChQwgJCUH79u2xdOlSjB49Gr169ULv3r2Bp+Ncct+foq4RT7ugRowYgQMHDqBbt25S+40bNxASEoIvv/wSAHDhwgWcPn0a/fr1g6+vLyIjI7F06VK0bt0aoaGhJnkSqNVq0aNHD5w6dQojRoxA9erVcePGDSxYsAB///03fvvtN+m9MeXvDtErEYnIJMaMGSO++FeqVatWIgBx2bJleucDEKdPn67XXrFiRXHw4MHS61mzZomOjo7i33//rXPe1KlTRblcLkZFReVZU2JioqhUKsVJkybptH/77beiIAjiP//8I4qiKC5YsEAEIMbExLzET/ys3o4dO4oxMTFiTEyMeO3aNbFfv34iAHHcuHGiKIpiRESECEB0cXERHz9+rHN9u3btxFq1aokZGRlSm1arFZs1ayZWqVJFahs/frwIQDx37pzU9vjxY1GlUokAxIiICKm9VatWYqtWraTXq1atEgGI33//vV79Wq1WFEVRjImJyfP/k6Ko0ZD4+HhRqVSK/fv312mfOnWqCEC8ffu2KIqimJaWpnftmTNnRADiunXrpLajR4+KAMSjR49KbS/+fuV68T1bv369KJPJxJMnT+qct2zZMhGA+Oeff4riK/7uEJkau5+IiphSqcTQoUMLff0vv/yCFi1awM3NDbGxsdJX+/btodFocOLEiTyvdXFxQZcuXbB161adWTVbtmxB06ZNUaFCBQCAq6srAGDnzp1GdZW86ODBg/Dy8oKXlxfq1KmDX375Be+99x7mzp2rc95bb70ldfMAQHx8PP744w/07dsXycnJ0s8WFxeHTp06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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.scatter(y_test, predictions)\n",
|
|
"plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], \"k--\", lw=2)\n",
|
|
"plt.xlabel(\"True Values\")\n",
|
|
"plt.ylabel(\"Predictions\")\n",
|
|
"plt.title(\"True vs Predicted Values\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "d3052118",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"0.0019756351174760136"
|
|
]
|
|
},
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"mean_squared_error(y_test, predictions)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "ea3bd93f",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Classifier Example"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "fc9641f9",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"X, y = make_classification(n_samples=1000, n_features=5, n_informative=3, n_classes=2)\n",
|
|
"X = StandardScaler().fit_transform(X)\n",
|
|
"y = y.reshape(-1, 1)\n",
|
|
"y = OneHotEncoder(sparse_output=False).fit_transform(y)\n",
|
|
"X_train, X_test, y_train, y_test = train_test_split(X, y)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "00f52ecd",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"layers = [Layer(5, 10, ReLU()), Layer(10, 5, ReLU()), Layer(5, 2, Softmax())]\n",
|
|
"network = FFNN(\n",
|
|
" layers, AdamScheduler(learning_rate=0.001, epochs=1000), CrossEntropyLoss()\n",
|
|
")\n",
|
|
"network.fit(X_train, y_train)\n",
|
|
"predictions = network.predict(X_test)\n",
|
|
"single_class_predictions = OneHotEncoder(sparse_output=False).fit_transform(\n",
|
|
" np.argmax(predictions, axis=1).reshape(-1, 1)\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"id": "a3e32a73",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"0.748"
|
|
]
|
|
},
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"accuracy_score(y_test, single_class_predictions)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "1cec1615",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Runge Function"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "74212e01",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import pyoptim.optimizers as optimizers\n",
|
|
"import pyoptim.datamanip as datamanip\n",
|
|
"import pyoptim.plotting as plotting\n",
|
|
"\n",
|
|
"from sklearn.model_selection import train_test_split"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"id": "9651d1c2",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"x = np.linspace(-1, 1, 100_000)\n",
|
|
"y = datamanip.noise_data(datamanip.runge_function(x), 1.0)\n",
|
|
"x_train, x_test, y_train, y_test = train_test_split(\n",
|
|
" x, y, test_size=0.2, random_state=datamanip.get_RNG().integers(0, 1e6)\n",
|
|
")\n",
|
|
"\n",
|
|
"x_train = x_train.reshape(-1, 1)\n",
|
|
"x_test = x_test.reshape(-1, 1)\n",
|
|
"y_train = y_train.reshape(-1, 1)\n",
|
|
"y_test = y_test.reshape(-1, 1)\n",
|
|
"\n",
|
|
"X_train_scaled, X_test_scaled = datamanip.scale_data(x_train, x_test)\n",
|
|
"y_train_scaled, y_test_scaled = datamanip.scale_data(y_train, y_test)\n",
|
|
"\n",
|
|
"def get_regression_model(\n",
|
|
" n_hidden_layers: int, n_neurons: int, activation: type = LeakyReLU\n",
|
|
") -> list[Layer]:\n",
|
|
" feature_dim = 1\n",
|
|
" target_dim = 1\n",
|
|
" layers = []\n",
|
|
" layers.append(Layer(feature_dim, n_neurons, activation_function=activation()))\n",
|
|
" for _ in range(n_hidden_layers - 1):\n",
|
|
" layers.append(Layer(n_neurons, n_neurons, activation_function=activation()))\n",
|
|
" layers.append(Layer(n_neurons, target_dim, activation_function=Linear()))\n",
|
|
" return layers"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "ec000a54",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Hidden Layers: 1, Neurons: 50, Test MSE: 0.9177768024329133\n",
|
|
"Hidden Layers: 1, Neurons: 100, Test MSE: 0.9167870523476759\n",
|
|
"Hidden Layers: 2, Neurons: 50, Test MSE: 0.9136592028639727\n",
|
|
"Hidden Layers: 2, Neurons: 100, Test MSE: 0.9135554326148551\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"for n_hidden in [1, 2]:\n",
|
|
" for n_neurons in [50, 100]:\n",
|
|
" layers = get_regression_model(n_hidden, n_neurons)\n",
|
|
" network = FFNN(\n",
|
|
" layers,\n",
|
|
" AdamScheduler(learning_rate=0.001, epochs=1000),\n",
|
|
" MSELoss(),\n",
|
|
" )\n",
|
|
" network.fit(X_train_scaled, y_train_scaled)\n",
|
|
" y_pred = network.predict(X_test_scaled)\n",
|
|
" test_mse = mean_squared_error(y_test_scaled, y_pred)\n",
|
|
" print(f\"Hidden Layers: {n_hidden}, Neurons: {n_neurons}, Test MSE: {test_mse}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "23e6f86c",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "project2",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"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.13.9"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|