{"metadata":{"colab":{"provenance":[],"gpuType":"T4"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"accelerator":"GPU","kaggle":{"accelerator":"none","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.layers import Input, Conv2D, Dense, Flatten, Dropout\nfrom tensorflow.keras.layers import GlobalMaxPooling2D, MaxPooling2D\nfrom tensorflow.keras.layers import BatchNormalization\nfrom tensorflow.keras.models import Model","metadata":{"id":"IMr23w_aSxlz"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load in the data\ncifar10 = tf.keras.datasets.cifar10\n\n# Distribute it to train and test set\n(x_train, y_train), (x_test, y_test) = cifar10.load_data()\nprint(x_train.shape, y_train.shape, x_test.shape, y_test.shape)","metadata":{"id":"JyqjMDj7S0pj","outputId":"6dc16448-28f9-4137-f911-c3fd61892569"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Reduce pixel values\nx_train, x_test = x_train / 255.0, x_test / 255.0\n\n# flatten the label values\ny_train, y_test = y_train.flatten(), y_test.flatten()","metadata":{"id":"L633qNnLS3Mw"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# visualize data by plotting images\nfig, ax = plt.subplots(5, 5)\nk = 0\n\nfor i in range(5):\n\tfor j in range(5):\n\t\tax[i][j].imshow(x_train[k], aspect='auto')\n\t\tk += 1\n\nplt.show()","metadata":{"id":"zk0g17qVS6gL","outputId":"5c003de8-228b-4f16-c8dd-8e2fe085646b"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# number of classes\nK = len(set(y_train))\n\n# calculate total number of classes\n# for output layer\nprint(\"number of classes:\", K)\n\n# Build the model using the functional API\n# input layer\ni = Input(shape=x_train[0].shape)\nx = Conv2D(32, (3, 3), activation='relu', padding='same')(i)\nx = BatchNormalization()(x)\nx = Conv2D(32, (3, 3), activation='relu', padding='same')(x)\nx = BatchNormalization()(x)\nx = MaxPooling2D((2, 2))(x)\n\nx = Conv2D(64, (3, 3), activation='relu', padding='same')(x)\nx = BatchNormalization()(x)\nx = Conv2D(64, (3, 3), activation='relu', padding='same')(x)\nx = BatchNormalization()(x)\nx = MaxPooling2D((2, 2))(x)\n\nx = Conv2D(128, (3, 3), activation='relu', padding='same')(x)\nx = BatchNormalization()(x)\nx = Conv2D(128, (3, 3), activation='relu', padding='same')(x)\nx = BatchNormalization()(x)\nx = MaxPooling2D((2, 2))(x)\n\nx = Flatten()(x)\nx = Dropout(0.2)(x)\n\n# Hidden layer\nx = Dense(1024, activation='relu')(x)\nx = Dropout(0.2)(x)\n\n# last hidden layer i.e.. output layer\nx = Dense(K, activation='softmax')(x)\n\nmodel = Model(i, x)\n\n# model description\nmodel.summary()","metadata":{"id":"KDvRPc34S8kV","outputId":"5af6db39-1a7b-4f78-892a-f6c848d78cc2"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Compile\nmodel.compile(optimizer='adam',\n\t\t\tloss='sparse_categorical_crossentropy',\n\t\t\tmetrics=['accuracy'])","metadata":{"id":"pqIqfC9YTB-U"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Fit with data augmentation\n# Note: if you run this AFTER calling\n# the previous model.fit()\n# it will CONTINUE training where it left off\nfrom tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping\n\nbatch_size = 32\ndata_generator = tf.keras.preprocessing.image.ImageDataGenerator(\nwidth_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True)\n\ntrain_generator = data_generator.flow(x_train, y_train, batch_size)\nsteps_per_epoch = x_train.shape[0] // batch_size\n\nr = model.fit(train_generator, validation_data=(x_test, y_test),\n\t\t\tsteps_per_epoch=steps_per_epoch, epochs=50,callbacks=[EarlyStopping(monitor=\"val_accuracy\",patience=7,verbose=1)])","metadata":{"id":"IRUOS8HYTEpj","outputId":"e2c8daed-7b93-4411-893d-6805be007fb3"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Evaluate the model on the test set\ntest_loss, test_accuracy = model.evaluate(x_test,y_test)\nprint(f'Test Accuracy: {test_accuracy * 100:.2f}%')","metadata":{"id":"iHy-wndITyRd","outputId":"e05e579f-1a07-49eb-958c-bffa947324ac"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot training history (accuracy and loss)\nplt.figure(figsize=(12, 4))\n\nplt.subplot(1, 2, 1)\nplt.plot(r.history['accuracy'], label='Training Accuracy')\nplt.plot(r.history['val_accuracy'], label='Validation Accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.legend()\n\nplt.subplot(1, 2, 2)\nplt.plot(r.history['loss'], label='Training Loss')\nplt.plot(r.history['val_loss'], label='Validation Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()","metadata":{"id":"lP6CVze-biQY","outputId":"13e15587-6a7f-46dc-c97f-010758911994"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(x_test[10])","metadata":{"id":"eD0107uhbn78","outputId":"1e7a4261-ff0f-41bf-d23e-f55d54d3b4e4"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.predict(x_test[10].reshape(1,32, 32, 3)).argmax(axis=1)\n# array([0]) == plane","metadata":{"id":"Fb306BAbbvd3","outputId":"7f320eb9-0eb4-4c36-df9d-fe298c83f178"},"execution_count":null,"outputs":[]}]}