ki-dhbw/Aufgaben/15 - Neural Networks - CNN mit Keras.ipynb
2025-02-13 14:23:29 +01:00

601 lines
100 KiB
Text

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "I2keZzFjqmcc"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2025-02-13 12:26:06.111195: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
"2025-02-13 12:26:06.111860: I external/local_xla/xla/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n",
"2025-02-13 12:26:06.115624: I external/local_xla/xla/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n",
"2025-02-13 12:26:06.129146: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
"WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
"E0000 00:00:1739445966.152086 49700 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
"E0000 00:00:1739445966.158703 49700 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
"2025-02-13 12:26:06.181996: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
"To enable the following instructions: AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
]
}
],
"source": [
"import tensorflow as tf\n",
"\n",
"from tensorflow.keras import datasets, layers, models\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "MRfXcFGdqsPZ",
"outputId": "6e36b70f-6853-412b-e728-bfea5c8c8ffd"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n",
"\u001b[1m11490434/11490434\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 0us/step\n"
]
}
],
"source": [
"(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "SQQ6sLQZrV25",
"outputId": "cc273cbd-fd3c-49ef-ac30-8fdc51dc2d62"
},
"outputs": [
{
"data": {
"text/plain": [
"(28, 28)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_images[1].shape"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 282
},
"id": "Y7MiDICErjtO",
"outputId": "ad14bbdb-50c9-4eda-85bd-208cb5b25a44"
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f47ba2ea9c0>"
]
},
"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.imshow(train_images[1])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "-TWpc3c-tXkx"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/plex/Dokumente/code/py/ki-dhbw/.venv/lib/python3.12/site-packages/keras/src/layers/convolutional/base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
" super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n",
"2025-02-13 12:26:22.622094: E external/local_xla/xla/stream_executor/cuda/cuda_driver.cc:152] failed call to cuInit: INTERNAL: CUDA error: Failed call to cuInit: UNKNOWN ERROR (303)\n"
]
}
],
"source": [
"model = models.Sequential()\n",
"model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))\n",
"model.add(layers.MaxPooling2D((2, 2)))\n",
"model.add(layers.Conv2D(64, (3, 3), activation='relu'))\n",
"model.add(layers.MaxPooling2D((2, 2)))\n",
"model.add(layers.Conv2D(64, (3, 3), activation='relu'))\n",
"model.add(layers.Flatten())\n",
"model.add(layers.Dense(64, activation='relu'))\n",
"model.add(layers.Dense(10))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "HIsZlqvyt1qr",
"outputId": "fe8d632b-0fe7-4e36-e70a-bedfc5908deb"
},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ conv2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">26</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">26</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">320</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">13</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">13</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">11</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">11</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">18,496</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">5</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">5</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">3</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">3</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">36,928</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">576</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">36,928</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">650</span> │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"</pre>\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m320\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m13\u001b[0m, \u001b[38;5;34m13\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m18,496\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m3\u001b[0m, \u001b[38;5;34m3\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m576\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m650\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">93,322</span> (364.54 KB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m93,322\u001b[0m (364.54 KB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">93,322</span> (364.54 KB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m93,322\u001b[0m (364.54 KB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "uslCpPtpt2tD",
"outputId": "0f1211aa-afb1-45e1-c6fb-c4865b93892f"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/9\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 226ms/step - accuracy: 0.9998 - loss: 6.2877e-04 - val_accuracy: 0.9889 - val_loss: 0.0591\n",
"Epoch 2/9\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 217ms/step - accuracy: 0.9994 - loss: 0.0017 - val_accuracy: 0.9910 - val_loss: 0.0513\n",
"Epoch 3/9\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 220ms/step - accuracy: 0.9996 - loss: 0.0014 - val_accuracy: 0.9886 - val_loss: 0.0612\n",
"Epoch 4/9\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 221ms/step - accuracy: 0.9993 - loss: 0.0019 - val_accuracy: 0.9912 - val_loss: 0.0504\n",
"Epoch 5/9\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 215ms/step - accuracy: 0.9998 - loss: 6.4059e-04 - val_accuracy: 0.9893 - val_loss: 0.0592\n",
"Epoch 6/9\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 216ms/step - accuracy: 0.9993 - loss: 0.0023 - val_accuracy: 0.9913 - val_loss: 0.0571\n",
"Epoch 7/9\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 220ms/step - accuracy: 0.9990 - loss: 0.0032 - val_accuracy: 0.9915 - val_loss: 0.0426\n",
"Epoch 8/9\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 219ms/step - accuracy: 0.9995 - loss: 0.0013 - val_accuracy: 0.9909 - val_loss: 0.0450\n",
"Epoch 9/9\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 216ms/step - accuracy: 0.9996 - loss: 0.0013 - val_accuracy: 0.9903 - val_loss: 0.0540\n"
]
}
],
"source": [
"model.compile(optimizer='adam',\n",
" loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n",
" metrics=['accuracy'])\n",
"\n",
"history = model.fit(train_images, train_labels, epochs=9, batch_size=2**11, \n",
" validation_data=(test_images, test_labels))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 300
},
"id": "Y8mAWZshvBGJ",
"outputId": "cc8ec1f2-4dae-479a-ea06-32e09c484f60"
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f4731434d40>"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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qTwxGOnFEFRQhJwyISnPNOpU2ie3oKg4XOmRWxycBAEoMgq4fUeP23f0AO5a72CpXrBVKaoIGSrTCGjF8FG6XlUAKf+mRF12SkaFx0q3s1EqGsSIpKQB6Pfff8fTTz9tWi+ZhxMVFYWVK1ciPT0dqamppsdbtGiBHTt24N1338X8+fPRrFkz/Oc//0FERISpz5AhQ3Dt2jVMnjwZGRkZ6NixIxISEipMjG5oFApF8TtnFaCVpoai4gBWZBRgqyoNPKoG8stCVF0KhQJaWxW0tiq4O1Y8vV5dRqOAO3qDWSgqG5LEUSrz9bwywUmhEE8iKopDu7he3AiYtSkU5t+jwnbm6yU7KX2s4n5Q6fOXrpfWoahyP6jiMaWi9Kv4N6b4e4UCSoX4HOIbFvPvlQpF8QIolYoq1mH6u6VUACpF6fcVnq/c96bnK96vonhflT2HUqEoXjd/DlXxmy61SgwenEdWM+rMfYDqkpycHDg7OyM7O9uqc4CIiIio5ljy+t1wx7GJiIiIqsAARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLJjI3UBRETUgBiNgFEPGAoBg754KSxuK9du6ldU/LUQMBbdY1t9aR+VGrBzAbQuxV+dy3zvAmicACXf41PVGICIiBoKQQBuXQQyjwP6gqpDhUUBpVz7/UKLYJD6p1BMAWidzEOR1rlcaCrb5lqmzQlQ2UpVONUSBiAiEmWnAWd3Axd/BTSOgHdnwKcz4N4aUKqkro4qo8sF0pKBK4eBK7+LX+9cl7qqchTiaI1KDahsSr9XlnxvW7yoAaWt+brKtritfD8boKgAuHsbKMgGCm4X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4g3DXJubf2SHg9vDPWdBjhi+zhaP8pQflXBtXmaUpycDbE0q+XR006mzI+KVZ0UFgGd7Mez4FI/uNAlk+CSq5+rFVWCAeM+ea9euYfLkycjIyEDHjh2RkJAADw/xM6NSU1OhLPNiX1BQgLi4OJw/fx6NGjVC3759sXr1alP4AcSJy7Gxsbhy5QoaN26MgQMHYsaMGdUOPzUq/Q/g+GYx7FxNrjjkrrQV5y34diuesBzG+QUPS6kq/syqTkDP8eLNwq4cFgPK+V/EkYJbF8UleZW4jUdw6eiQf4/7n4YSBHH+SMlprcsHzO/7YqMVg05J6GkSWDPHShUpFEDjFuLSfqDYZjSI/z6cqEwka5LfCbouqrERoCNrgW/fKV23a1x6ZZbvo+KLdB25nbhsFOSIk49LJlRnmc8lg9JGHCEIeEoMRT6hgI1anH9y/qfi+/Ikipfpl9U4sHTycvPHAFu72joiIiLZqjenwOqqGgtAty4Ce/5VejqrSUsOudc1eVnmH9lxu9wkZVsHoElAxcuybezE02dBz4g3JGwcUKtlExERA9BDqzNXgZH0bl4o85Ede4A710sfc3uk+LRWOODXg6N3REQSqzdzgIjqvJL5I11eFe9anPUncP2MeIVQTV49RkRENYoBiKi6lErxLr+ewVJXQkRED4nXUxMREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsSB6AFi1ahObNm0Or1SIsLAyHDh2qsq9er8f06dMRGBgIrVaLkJAQJCQkmPUxGAz46KOP0KJFC9jZ2SEwMBAff/wxBEGo6UMhIiKiekLSALRx40bExMRgypQpSE5ORkhICCIiIpCVlVVp/7i4OCxZsgQLFizAiRMnMHLkSAwYMABHjhwx9Zk1axYWL16MhQsX4uTJk5g1axZmz56NBQsW1NZhERERUR2nECQcGgkLC0PXrl2xcOFCAIDRaISvry/GjBmDiRMnVujv7e2NSZMmYdSoUaa2gQMHws7ODmvWrAEAPP/88/Dw8MDy5cur7HM/OTk5cHZ2RnZ2NpycnB7mEImIiKiWWPL6LdkIUGFhIZKSkhAeHl5ajFKJ8PBw7N+/v9JtdDodtFqtWZudnR327t1rWu/RowcSExPx119/AQCOHj2KvXv3ok+fPlXWotPpkJOTY7YQERFRw2Uj1RNfv34dBoMBHh4eZu0eHh44depUpdtERERg7ty5eOKJJxAYGIjExERs2bIFBoPB1GfixInIyclB69atoVKpYDAYMGPGDERGRlZZS3x8PKZNm2adAyMiIqI6T/JJ0JaYP38+goKC0Lp1a6jVaowePRrR0dFQKksPY9OmTVi7di3WrVuH5ORkrFq1Cv/617+watWqKvcbGxuL7Oxs03L58uXaOBwiIiKSiGQjQG5ublCpVMjMzDRrz8zMhKenZ6XbuLu7Y9u2bSgoKMCNGzfg7e2NiRMnIiAgwNTn/fffx8SJEzF06FAAQHBwMC5duoT4+HhERUVVul+NRgONRmOlIyMiIqK6TrIRILVajS5duiAxMdHUZjQakZiYiO7du99zW61WCx8fHxQVFWHz5s3o37+/6bE7d+6YjQgBgEqlgtFotO4BEBERUb0l2QgQAMTExCAqKgqhoaHo1q0b5s2bh/z8fERHRwMAhg8fDh8fH8THxwMADh48iLS0NHTs2BFpaWmYOnUqjEYjJkyYYNpnv379MGPGDPj5+aFdu3Y4cuQI5s6dixEjRkhyjERERFT3SBqAhgwZgmvXrmHy5MnIyMhAx44dkZCQYJoYnZqaajaaU1BQgLi4OJw/fx6NGjVC3759sXr1ari4uJj6LFiwAB999BHeeecdZGVlwdvbG2+99RYmT55c24dHREREdZSk9wGqq3gfICIiovqnXtwHiIiIiEgqDEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOxYHoObNm2P69OlITU2tiXqIiIiIapzFAWj8+PHYsmULAgIC8Mwzz2DDhg3Q6XQ1URsRERFRjXigAJSSkoJDhw6hTZs2GDNmDLy8vDB69GgkJyfXRI1EREREVqUQBEF4mB3o9Xp8/vnn+OCDD6DX6xEcHIyxY8ciOjoaCoXCWnXWqpycHDg7OyM7OxtOTk5Sl0NERETVYMnrt82DPoler8fWrVuxYsUK7Nq1C48++ihee+01XLlyBR9++CF2796NdevWPejuiYiIiGqMxQEoOTkZK1aswPr166FUKjF8+HB89tlnaN26tanPgAED0LVrV6sWSkRERGQtFgegrl274plnnsHixYvxwgsvwNbWtkKfFi1aYOjQoVYpkIiIiMjaLA5A58+fh7+//z37ODg4YMWKFQ9cFBEREVFNsvgqsKysLBw8eLBC+8GDB/H7779bpSgiIiKimmRxABo1ahQuX75coT0tLQ2jRo2ySlFERERENcniAHTixAl07ty5QnunTp1w4sQJqxRFREREVJMsDkAajQaZmZkV2tPT02Fj88BX1RMRERHVGosD0N/+9jfExsYiOzvb1Hb79m18+OGHeOaZZ6xaHBEREVFNsHjI5l//+heeeOIJ+Pv7o1OnTgCAlJQUeHh4YPXq1VYvkIiIiMjaLA5APj4++OOPP7B27VocPXoUdnZ2iI6OxrBhwyq9JxARERFRXfNAk3YcHBzw5ptvWrsWIiIiolrxwLOWT5w4gdTUVBQWFpq1//3vf3/oooiIiIhq0gPdCXrAgAE4duwYFAoFSj5MvuST3w0Gg3UrJCIiIrIyi68CGzduHFq0aIGsrCzY29vjzz//xJ49exAaGoqff/65BkokIiIisi6LR4D279+PH3/8EW5ublAqlVAqlejZsyfi4+MxduxYHDlypCbqJCIiIrIai0eADAYDHB0dAQBubm64evUqAMDf3x+nT5+2bnVERERENcDiEaD27dvj6NGjaNGiBcLCwjB79myo1WosXboUAQEBNVEjERERkVVZHIDi4uKQn58PAJg+fTqef/55PP7442jSpAk2btxo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Bg8ejEOHDmHp0qVYunSpJMdIREREdY+kAWjIkCG4du0aJk+ejIyMDHTs2BEJCQmmidGpqalm83sKCgoQFxeH8+fPo1GjRujbty9Wr14NFxcXU5+uXbti69atiI2NxfTp09GiRQvMmzcPkZGRtX14REREVEdJeh+guor3ASIiIqp/6sV9gIiIiIikwgBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLJTJwLQokWL0Lx5c2i1WoSFheHQoUNV9tXr9Zg+fToCAwOh1WoREhKChIQEsz5Tp06FQqEwW1q3bl3Th0FERET1hOQBaOPGjYiJicGUKVOQnJyMkJAQREREICsrq9L+cXFxWLJkCRYsWIATJ05g5MiRGDBgAI4cOWLWr127dkhPTzcte/furY3DISIionpA8gA0d+5cvPHGG4iOjkbbtm3xxRdfwN7eHl9++WWl/VevXo0PP/wQffv2RUBAAN5++2307dsXc+bMMetnY2MDT09P0+Lm5lYbh0NERET1gKQBqLCwEElJSQgPDze1KZVKhIeHY//+/ZVuo9PpoNVqzdrs7OwqjPCcOXMG3t7eCAgIQGRkJFJTU6usQ6fTIScnx2whIiKihkvSAHT9+nUYDAZ4eHiYtXt4eCAjI6PSbSIiIjB37lycOXMGRqMRu3btwpYtW5Cenm7qExYWhpUrVyIhIQGLFy/GhQsX8PjjjyM3N7fSfcbHx8PZ2dm0+Pr6Wu8giYiIqM6R/BSYpebPn4+goCC0bt0aarUao0eP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5syBr68vHn/8cbz00kt47733TPN47iUuLg6dO3dGREQEnnrqKVMIK+ujjz7C//3f/2Hy5Mlo06YNhgwZgqysLLM+w4YNg42NDYYNG/ZQn7peVykES296IAM5OTlwdnZGdnY2nJycpC6HiKhBKygowIULF9CiRYsG+UJbX128eBGBgYE4fPgwOnfuLHU5Jvf6/2LJ63f9mGVGREREtUKv1+PGjRuIi4vDo48+WqfCjzXxFBgRERGZ7Nu3D15eXjh8+DC++OILqcupMRwBIiIiIpOnnnrK4o8EqY84AkRERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERCSB5s2bY968eVKXIVsMQERERCQ7DEBERERkEYPBAKPRKHUZD4UBiIiI6hZBAArzpVmqeQfkpUuXwtvbu0II6N+/P0aMGIFz586hf//+8PDwQKNGjdC1a1fs3r37gX8kc+fORXBwMBwcHODr64t33nkHeXl5Zn327duHp556Cvb29nB1dUVERARu3boFADAajZg9ezZatmwJjUYDPz8/zJgxAwDw888/Q6FQ4Pbt26Z9paSkQKFQ4OLFiwCAlStXwsXFBdu3b0fbtm2h0WiQmpqKw4cP45lnnoGbmxucnZ3x5JNPIjk52ayu27dv46233oKHhwe0Wi3at2+P7777Dvn5+XBycsI333xj1n/btm1wcHBAbm7uA/+8qoMfhUFERHWL/g4w01ua5/7wKqB2uG+3QYMGYcyYMfjpp5/Qu3dvAMDNmzeRkJCA77//Hnl5eejbty9mzJgBjUaDr776Cv369cPp06fh5+dncVlKpRL//ve/0aJFC5w/fx7vvPMOJkyYgM8//xyAGFh69+6NESNGYP78+bCxscFPP/0Eg8EAAIiNjcWyZcvw2WefoWfPnkhPT8epU6csquHOnTuYNWsW/vOf/6BJkyZo2rQpzp8/j6ioKCxYsACCIGDOnDno27cvzpw5A0dHRxiNRvTp0we5ublYs2YNAgMDceLECahUKjg4OGDo0KFYsWIF/vGPf5iep2Td0dHR4p+TJRiAiIiILOTq6oo+ffpg3bp1pgD0zTffwM3NDU8//TSUSiVCQkJM/T/++GNs3boV27dvx+jRoy1+vvHjx5u+b968OT755BOMHDnSFIBmz56N0NBQ0zoAtGvXDgCQm5uL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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(history.history['accuracy'], label='accuracy')\n",
"plt.plot(history.history['val_accuracy'], label = 'val_accuracy')\n",
"plt.xlabel('Epoch')\n",
"plt.ylabel('Accuracy')\n",
"plt.ylim([0.94, 1])\n",
"plt.legend(loc='lower right')\n",
"\n",
"#test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "HCN3gqhtvGzj",
"outputId": "fa85df97-a484-419c-8b14-5b5c1a528be3"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/plex/Dokumente/code/py/ki-dhbw/.venv/lib/python3.12/site-packages/keras/src/layers/reshaping/flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
" super().__init__(**kwargs)\n"
]
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_1\"</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential_1\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ flatten_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">784</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">50,240</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">16,640</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">32,896</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_5 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,290</span> │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"</pre>\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ flatten_1 (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m784\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m50,240\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m16,640\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_4 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m32,896\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_5 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m1,290\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">101,066</span> (394.79 KB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m101,066\u001b[0m (394.79 KB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">101,066</span> (394.79 KB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m101,066\u001b[0m (394.79 KB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fc_model = models.Sequential()\n",
"fc_model.add(layers.Flatten(input_shape=(28, 28, 1)))\n",
"fc_model.add(layers.Dense(64, activation='relu'))\n",
"fc_model.add(layers.Dense(256, activation='relu'))\n",
"fc_model.add(layers.Dense(128, activation='relu'))\n",
"fc_model.add(layers.Dense(10))\n",
"fc_model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "o-lxxt6q1O7S",
"outputId": "0f9e418d-faab-4487-8d1e-420ee9f355ed"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 24ms/step - accuracy: 0.8671 - loss: 0.5650 - val_accuracy: 0.9069 - val_loss: 0.3756\n",
"Epoch 2/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 21ms/step - accuracy: 0.9247 - loss: 0.2681 - val_accuracy: 0.9186 - val_loss: 0.3140\n",
"Epoch 3/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 22ms/step - accuracy: 0.9443 - loss: 0.1906 - val_accuracy: 0.9280 - val_loss: 0.2941\n",
"Epoch 4/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 21ms/step - accuracy: 0.9553 - loss: 0.1517 - val_accuracy: 0.9300 - val_loss: 0.2747\n",
"Epoch 5/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 22ms/step - accuracy: 0.9658 - loss: 0.1137 - val_accuracy: 0.9368 - val_loss: 0.2674\n",
"Epoch 6/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - accuracy: 0.9706 - loss: 0.0940 - val_accuracy: 0.9401 - val_loss: 0.2535\n",
"Epoch 7/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 21ms/step - accuracy: 0.9754 - loss: 0.0779 - val_accuracy: 0.9435 - val_loss: 0.2439\n",
"Epoch 8/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 21ms/step - accuracy: 0.9813 - loss: 0.0597 - val_accuracy: 0.9431 - val_loss: 0.2477\n",
"Epoch 9/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 22ms/step - accuracy: 0.9837 - loss: 0.0517 - val_accuracy: 0.9465 - val_loss: 0.2442\n",
"Epoch 10/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 23ms/step - accuracy: 0.9857 - loss: 0.0428 - val_accuracy: 0.9492 - val_loss: 0.2357\n",
"Epoch 11/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 23ms/step - accuracy: 0.9872 - loss: 0.0387 - val_accuracy: 0.9471 - val_loss: 0.2399\n",
"Epoch 12/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 23ms/step - accuracy: 0.9901 - loss: 0.0319 - val_accuracy: 0.9489 - val_loss: 0.2439\n",
"Epoch 13/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - accuracy: 0.9927 - loss: 0.0246 - val_accuracy: 0.9487 - val_loss: 0.2542\n",
"Epoch 14/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - accuracy: 0.9938 - loss: 0.0210 - val_accuracy: 0.9518 - val_loss: 0.2487\n",
"Epoch 15/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - accuracy: 0.9954 - loss: 0.0165 - val_accuracy: 0.9524 - val_loss: 0.2506\n",
"Epoch 16/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - accuracy: 0.9956 - loss: 0.0147 - val_accuracy: 0.9520 - val_loss: 0.2557\n",
"Epoch 17/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 22ms/step - accuracy: 0.9961 - loss: 0.0135 - val_accuracy: 0.9542 - val_loss: 0.2630\n",
"Epoch 18/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 23ms/step - accuracy: 0.9971 - loss: 0.0112 - val_accuracy: 0.9539 - val_loss: 0.2572\n",
"Epoch 19/19\n",
"\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 21ms/step - accuracy: 0.9970 - loss: 0.0114 - val_accuracy: 0.9536 - val_loss: 0.2563\n"
]
}
],
"source": [
"fc_model.compile(optimizer='adam',\n",
" loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n",
" metrics=['accuracy'])\n",
"\n",
"history = fc_model.fit(train_images, train_labels, epochs=19, batch_size=2**11,\n",
" validation_data=(test_images, test_labels))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f46cb202360>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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23LixInyTBMAgGqlsLDQ0SXUCA4LSC4uLurcubOSk5NtbRaLRcnJyerRo0eZ21y6dKnUlelOTk6Siu99cPXPcePGaf369frss8/UvHnzG9aSmpoqSQoICLhmH1dXV3l4eNgtAADHsFqtulRw2SHL1feb8tq8ebN69eolLy8veXt76y9/+YuOHj1qW//TTz9p8ODBatSokerVq6cuXbrYffjoo48+UteuXeXm5iYfHx8NGDDAts5kMmnDhg12+/Py8tLKlSslST/++KNMJpPWrFmj++67T25ublq9erV+/vlnDR48WE2aNFHdunXVvn17vf3223bjWCwWzZkzR3feeadcXV3VtGlTzZo1S5LUp08fjRs3zq7/2bNn5eLiYve+XpM59BRbbGysoqOj1aVLF3Xr1k3z589Xbm6u7VNtw4YNU5MmTZSYmChJioyM1Ny5c9WpUyfbKbZp06YpMjLSFpRiYmKUlJSkDz74QA0aNFBmZqYkydPTU+7u7jp69KiSkpLUv39/eXt7a//+/Zo0aZJ69+6tDh06OOYHAQCokN8Ki3T39E8dsu+DL0Sorkv53z5zc3MVGxurDh066OLFi5o+fboGDBig1NRUXbp0Sffdd5+aNGmiDz/8UP7+/tq3b5/trMjGjRs1YMAATZ06VW+++aYKCgq0adOmCtc8ZcoUvfLKK+rUqZPc3NyUl5enzp07a/LkyfLw8NDGjRv15JNPKiQkxHYvwri4OL3xxhuaN2+eevXqpdOnT9uuER41apTGjRunV155Ra6urpKkVatWqUmTJurTp0+F66uOHBqQBg0apLNnz2r69OnKzMxUx44dtXnzZtuF2xkZGXZHjOLj42UymRQfH6+TJ0/K19dXkZGRtkQrSUuXLpVUfDPIklasWKHhw4fLxcVFW7dutYWxoKAgRUVFKT4+vuonDAD4w4mKirJ7vnz5cvn6+urgwYP66quvdPbsWe3du9f2aes777zT1nfWrFl64okn7K6BDQ0NrXANEydO1MCBA+3ann32Wdvj8ePH69NPP9W7776rbt266cKFC1qwYIEWLVqk6OhoSVJISIh69eolSRo4cKDGjRunDz74QI8//rik4tvqDB8+vNbc5dzhF2mPGzeu1GG6q7Zt22b3vE6dOkpISFBCQsI1x7vRoc+goKBSd9EGANQs7s5OOvhChMP2XRGHDx/W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641wDRIAoOYxmYpPczliMZnKXWZkZKSsVqs2btyoEydO6H//9381dOhQSdKzzz6r9evXa/bs2frf//1fpaamqn379iooKKjwj+PHH3/UX/7yF3Xo0EHvv/++UlJStHjxYkmyjefu7n7N7a+3Tio+fSdJ1hLXXxUWFpY5jsnw84mOjlZqaqoWLFigr776SqmpqfL29i5XXVeNGjVKK1eulFR8em3EiBGl9lPZCEgAAFQRNzc3DRw4UKtXr9bbb7+tVq1a6Z577pFUfMH08OHDNWDAALVv317+/v62C54rKiUlRRaLRa+88oq6d++uu+66S6dO2R9h69Chg5KTk8vcvmXLlnJ3d7/mel9fX0nS6dOnbW2pqanlqu3LL7/UM888o/79+6tt27ZydXXVuXPn7Or66aef9P33319zjL/+9a86fvy4/vu//1sHDx60nQasSgQkAACq0NChQ7Vx40YtX77cdvRIKg4l69atU2pqqr799lsNGTLkpj8Wf+edd6qwsFALFy7UsWPH9NZbb+nVV1+16xMXF6e9e/fqb3/7m/bv36+0tDQtXbpU586dk5ubmyZPnqznnntOb775po4ePapdu3Zp2bJltvGDgoI0Y8YMHT58WBs3btQrr7xSrtpatmypt956S4cOHdLu3bs1dOhQu6NG9913n3r37q2oqCht2bJFP/zwgz755BNt3rzZ1qdhw4YaOHCg/uM//kMPPvig7rjjjpv6OVUEAQkAgCrUp08fNWrUSOnp6RoyZIitfe7cuWrYsKF69uypyMhIRURE2I4uVVRoaKjmzp2rl19+We3atdPq1auVmJho1+euu+7Sv/71L3377bfq1q2bevTooQ8++EB16hRfjjxt2jT9/e9/1/Tp09WmTRsNGjRIZ86ckSQ5Ozvr7bffVlpamjp06KCXX35Z//mf/1mu2pYtW6Zff/1V99xzj5588kk988wzaty4sV2f999/X127dtXgwYN1991367nnnrN9uu6qp556SgUFBRo5cuRN/YwqymS1lvOGDrCTk5MjT09PZWdny8PDw9HlAECtlZeXpx9++EHNmzeXm5ubo8uBg7z11luaNGmSTp06JRcXl+v2vd7vTHnfv/kUGwAAqLYuXbqk06dP66WXXtLTTz99w3BUWTjFBgBANbd69WrVr1+/zOXqvYxqqzlz5qh169by9/dXXFzc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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(history.history['accuracy'], label='accuracy')\n",
"plt.plot(history.history['val_accuracy'], label = 'val_accuracy')\n",
"plt.xlabel('Epoch')\n",
"plt.ylabel('Accuracy')\n",
"plt.ylim([0.8, 1])\n",
"plt.legend(loc='lower right')"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"provenance": []
},
"gpuClass": "standard",
"kernelspec": {
"display_name": ".venv",
"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.12.9"
}
},
"nbformat": 4,
"nbformat_minor": 1
}