{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nimport requests\nfrom io import BytesIO\nfrom PIL import Image\nimport seaborn as sns\nimport cv2\nfrom tensorflow.keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.applications.vgg19 import VGG19\nfrom tensorflow.keras.layers import Dense, Flatten, Dropout, Lambda\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.optimizers import Adam, Adagrad\nfrom tensorflow.keras.datasets import fashion_mnist","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-01T06:34:56.932321Z","iopub.execute_input":"2023-04-01T06:34:56.933159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Import Dataset","metadata":{}},{"cell_type":"code","source":"data = pd.read_csv(\"/kaggle/input/data-amazon-product-image-250-new/data_amazon_small.csv\").drop('Unnamed: 0', axis=1)\ndata = data[:1250]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# DATA PREPROCESSING","metadata":{}},{"cell_type":"code","source":"def filter_valid_urls(df, url_column):\n    valid_urls = []\n    for url in df[url_column]:\n        try:\n            response = requests.get(url)\n            if response.status_code == 200:\n                valid_urls.append(url)\n            else:\n                valid_urls.append(None)\n        except:\n            valid_urls.append(None)\n    df_valid = df.copy()\n    df_valid[url_column] = valid_urls\n    df_valid = df_valid.dropna(subset=[url_column])\n    return df_valid","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_cleaned = filter_valid_urls(data, 'imUrl')\ndata_cleaned.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_categories = data_cleaned.groupby('categories')['imUrl'].count().reset_index().rename(columns={'imUrl': 'Count'})\nprint(data_categories)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_image_from_url(df, url_column, label_column):\n    images = []\n    labels = []\n    for index, row in df.iterrows():\n        img = Image.open(requests.get(row[url_column], stream=True).raw)\n        \n        img = img.resize((224, 224))\n\n        img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)\n        \n        images.append(img)\n        labels.append(row[label_column])\n    \n    images = np.array(images)\n    labels = df[label_column].values\n    \n    return images, labels","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images, labels = load_image_from_url(data_cleaned, 'imUrl', 'categories')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels_dict = {'Automotive' : 0,\n               'Baby' : 1,\n               'Home Improvement' : 2,\n               'Kitchen & Dining' : 3,\n               'Pet Supplies' : 4}\n\nlabels_int = [labels_dict[label] for label in labels]\nlabels_onehot = to_categorical(labels_int, num_classes=5)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train_full, X_test, y_train_full, y_test = train_test_split(images, labels_onehot, test_size=0.2,\n                                                    random_state=42)\n\nX_train, X_val, y_train, y_val = train_test_split(X_train_full, y_train_full, test_size=0.2,\n                                                    random_state=42)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(X_train_full.shape)\nprint(X_val.shape)\nprint(X_test.shape)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# LOAD MODEL PRETRAINED VGG19","metadata":{}},{"cell_type":"code","source":"def model_pretrained(X_train, y_train, X_val, y_val, num_classes, epochs, batch_size, optimizer):\n    base_model = VGG19(weights='imagenet', include_top=False, input_shape=(224, 224, 3))\n    for layer in base_model.layers:\n        layer.trainable = False\n\n    x = Flatten()(base_model.output)\n    x = Dense(256, activation='relu')(x)\n    x = Dropout(0.5)(x)\n    predictions = Dense(num_classes, activation='softmax')(x)\n    \n    model = Model(inputs=base_model.input, outputs=predictions)\n    model.compile(optimizer= optimizer, loss='categorical_crossentropy', metrics=['accuracy'])\n    history = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(X_val, y_val), verbose=2)\n    \n    return model, history","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# VGG19 with Adam","metadata":{}},{"cell_type":"code","source":"num_classes = 5\nepochs = 20\nbatch_size = 8\nadam_opt = Adam(learning_rate=0.0001) \nVGG_19_Adam, history = model_pretrained(X_train, y_train, X_val, y_val, num_classes, epochs, batch_size, adam_opt)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# VGG19 with Adagrad","metadata":{}},{"cell_type":"code","source":"num_classes = 5\nepochs = 20\nbatch_size = 8\nadam_opt = Adagrad(learning_rate=0.0001) \nVGG_19_Adagrad, history = model_pretrained(X_train, y_train, X_val, y_val, num_classes, epochs, batch_size, adam_opt)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evaluate","metadata":{}},{"cell_type":"code","source":"# Đánh giá mô hình với tập dữ liệu kiểm tra\ntest_loss_adam, test_acc_adam = VGG_19_Adam.evaluate(X_test, y_test, verbose=2)\n\nprint('Test accuracy:', test_acc_adam)\nprint('Test loss:', test_loss_adam)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Đánh giá mô hình với tập dữ liệu kiểm tra\ntest_loss, test_acc = VGG_19_Adagrad.evaluate(X_test, y_test, verbose=2)\n\nprint('Test accuracy:', test_acc)\nprint('Test loss:', test_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}