symulowanie_cnn/cnn.ipynb
2021-12-06 11:54:14 +01:00

312 lines
32 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 297,
"id": "b026b65f",
"metadata": {},
"outputs": [],
"source": [
"import tensorflow as tf\n",
"from tensorflow.keras import datasets\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D\n",
"import os\n",
"from sklearn.model_selection import train_test_split\n",
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 298,
"id": "f4b3c889",
"metadata": {},
"outputs": [],
"source": [
"def preprocess(img):\n",
" scale_percent = 10\n",
" width = int(img.shape[1] * scale_percent / 100)\n",
" height = int(img.shape[0] * scale_percent / 100)\n",
" dim = (width, height)\n",
" resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)\n",
" return resized\n",
"\n",
"def readData(data_links):\n",
" x, y = [], []\n",
" for link in data_links:\n",
" img = cv2.imread(link, cv2.IMREAD_COLOR)\n",
" img = preprocess(img)\n",
" label = link.split(\"/\")[1].split('_')[1]\n",
" new_label = 4\n",
" \n",
" if label == '3':\n",
" new_label = 0\n",
" elif label == '5':\n",
" new_label = 1\n",
" elif label == '8':\n",
" new_label = 2\n",
" \n",
" x.append(img)\n",
" y.append(new_label)\n",
"\n",
" return x, y\n",
"\n",
"data_links = os.listdir(\"data/\")\n",
"data_links = [\"data/\" + x for x in data_links]"
]
},
{
"cell_type": "code",
"execution_count": 299,
"id": "b9df2aa9",
"metadata": {},
"outputs": [],
"source": [
"x, y = readData(data_links)"
]
},
{
"cell_type": "code",
"execution_count": 300,
"id": "a8977fc6",
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)"
]
},
{
"cell_type": "code",
"execution_count": 301,
"id": "97e8bc4e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(60, 80, 3)"
]
},
"execution_count": 301,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train[0].shape"
]
},
{
"cell_type": "code",
"execution_count": 302,
"id": "2d3f1e5e",
"metadata": {},
"outputs": [],
"source": [
"X_train = np.array([i / 255.0 for i in X_train], dtype=np.float64)\n",
"X_test = np.array([i / 255.0 for i in X_test], dtype=np.float64)\n",
"y_train = np.array(y_train, dtype=np.int64)\n",
"y_test = np.array(y_test, dtype=np.int64)"
]
},
{
"cell_type": "code",
"execution_count": 369,
"id": "2a10ce01",
"metadata": {},
"outputs": [],
"source": [
"model = Sequential()\n",
"model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(60, 80, 3)))\n",
"model.add(MaxPooling2D((2, 2)))\n",
"model.add(Conv2D(64, (3, 3), activation='relu'))\n",
"\n",
"model.add(MaxPooling2D((2, 2)))\n",
"model.add(Conv2D(64, (3, 3), activation='relu'))\n",
"\n",
"model.add(MaxPooling2D((2, 2)))\n",
"model.add(Conv2D(64, (3, 3), activation='relu'))\n",
"model.add(Flatten())\n",
"model.add(Dense(256, activation='relu'))\n",
"model.add(Dense(3, activation='sigmoid'))"
]
},
{
"cell_type": "code",
"execution_count": 370,
"id": "67f6cef9",
"metadata": {},
"outputs": [],
"source": [
"model.compile(optimizer='adam',\n",
" loss=tf.keras.losses.SparseCategoricalCrossentropy(),\n",
" metrics=['accuracy'])\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 371,
"id": "802da4db",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/20\n",
"20/20 [==============================] - 2s 70ms/step - loss: 1.0857 - accuracy: 0.3730 - val_loss: 1.0336 - val_accuracy: 0.4926\n",
"Epoch 2/20\n",
"20/20 [==============================] - 1s 64ms/step - loss: 0.9725 - accuracy: 0.5127 - val_loss: 0.8676 - val_accuracy: 0.6037\n",
"Epoch 3/20\n",
"20/20 [==============================] - 1s 65ms/step - loss: 0.8294 - accuracy: 0.6524 - val_loss: 0.7766 - val_accuracy: 0.6852\n",
"Epoch 4/20\n",
"20/20 [==============================] - 1s 65ms/step - loss: 0.8491 - accuracy: 0.6476 - val_loss: 0.7487 - val_accuracy: 0.6815\n",
"Epoch 5/20\n",
"20/20 [==============================] - 1s 66ms/step - loss: 0.7602 - accuracy: 0.6667 - val_loss: 0.8408 - val_accuracy: 0.5741\n",
"Epoch 6/20\n",
"20/20 [==============================] - 1s 66ms/step - loss: 0.7095 - accuracy: 0.7048 - val_loss: 0.6505 - val_accuracy: 0.7296\n",
"Epoch 7/20\n",
"20/20 [==============================] - 1s 65ms/step - loss: 0.6341 - accuracy: 0.7349 - val_loss: 0.5629 - val_accuracy: 0.7852\n",
"Epoch 8/20\n",
"20/20 [==============================] - 1s 68ms/step - loss: 0.5052 - accuracy: 0.7921 - val_loss: 0.4398 - val_accuracy: 0.8444\n",
"Epoch 9/20\n",
"20/20 [==============================] - 1s 70ms/step - loss: 0.3686 - accuracy: 0.8508 - val_loss: 0.3397 - val_accuracy: 0.8593\n",
"Epoch 10/20\n",
"20/20 [==============================] - 1s 70ms/step - loss: 0.2249 - accuracy: 0.9317 - val_loss: 0.2998 - val_accuracy: 0.8889\n",
"Epoch 11/20\n",
"20/20 [==============================] - 1s 70ms/step - loss: 0.4271 - accuracy: 0.8365 - val_loss: 0.4476 - val_accuracy: 0.8296\n",
"Epoch 12/20\n",
"20/20 [==============================] - 1s 67ms/step - loss: 0.2457 - accuracy: 0.9270 - val_loss: 0.2269 - val_accuracy: 0.9074\n",
"Epoch 13/20\n",
"20/20 [==============================] - 1s 67ms/step - loss: 0.1181 - accuracy: 0.9635 - val_loss: 0.1664 - val_accuracy: 0.9407\n",
"Epoch 14/20\n",
"20/20 [==============================] - 1s 68ms/step - loss: 0.0965 - accuracy: 0.9714 - val_loss: 0.1522 - val_accuracy: 0.9444\n",
"Epoch 15/20\n",
"20/20 [==============================] - 1s 70ms/step - loss: 0.0577 - accuracy: 0.9810 - val_loss: 0.1595 - val_accuracy: 0.9444\n",
"Epoch 16/20\n",
"20/20 [==============================] - 1s 68ms/step - loss: 0.1496 - accuracy: 0.9444 - val_loss: 0.3178 - val_accuracy: 0.8963\n",
"Epoch 17/20\n",
"20/20 [==============================] - 1s 66ms/step - loss: 0.0731 - accuracy: 0.9794 - val_loss: 0.0890 - val_accuracy: 0.9704\n",
"Epoch 18/20\n",
"20/20 [==============================] - 1s 66ms/step - loss: 0.0253 - accuracy: 0.9937 - val_loss: 0.0744 - val_accuracy: 0.9704\n",
"Epoch 19/20\n",
"20/20 [==============================] - 1s 65ms/step - loss: 0.0138 - accuracy: 0.9984 - val_loss: 0.0656 - val_accuracy: 0.9778\n",
"Epoch 20/20\n",
"20/20 [==============================] - 1s 65ms/step - loss: 0.0092 - accuracy: 0.9984 - val_loss: 0.0616 - val_accuracy: 0.9741\n"
]
}
],
"source": [
"history = model.fit(X_train, y_train, epochs=20, \n",
" validation_data=(X_test, y_test))"
]
},
{
"cell_type": "code",
"execution_count": 372,
"id": "a27e69ff",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"9/9 - 0s - loss: 0.0616 - accuracy: 0.9741 - 153ms/epoch - 17ms/step\n",
"0.06160588562488556\n",
"0.9740740656852722\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"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.5, 1])\n",
"plt.legend(loc='lower right')\n",
"\n",
"test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2)\n",
"\n",
"print(test_loss)\n",
"print(test_acc)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "21696ef3",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "ebd5b1c1",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "57828ac4",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "1893f9da",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "a1448617",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}