{"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":"markdown","source":"# **Pre-processing**","metadata":{"id":"fMBJZrZNajSe"}},{"cell_type":"markdown","source":"---\n---\n### **Import**","metadata":{"id":"Hh89r0J5rBj0"}},{"cell_type":"code","source":"import pickle\nimport random\nimport numpy as np\nimport pandas as pd\nfrom skimage import io\n\n\n# Immagini - Grafica\nimport cv2 as cv\nfrom PIL import Image\nimport plotly.express as px\nimport plotly.graph_objects as go\nfrom IPython.display import display\n","metadata":{"id":"TFDeugiWQGDk","_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-02-16T12:19:47.809362Z","iopub.execute_input":"2023-02-16T12:19:47.809955Z","iopub.status.idle":"2023-02-16T12:19:49.769413Z","shell.execute_reply.started":"2023-02-16T12:19:47.809824Z","shell.execute_reply":"2023-02-16T12:19:49.767961Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n---\n### **Pre-processing**","metadata":{"id":"T4SswefmrbRq"}},{"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/input/painter-by-numbers/all_data_info.csv\")","metadata":{"id":"uXecN86nRfcl","execution":{"iopub.status.busy":"2023-02-16T12:19:49.771596Z","iopub.execute_input":"2023-02-16T12:19:49.772052Z","iopub.status.idle":"2023-02-16T12:19:50.426209Z","shell.execute_reply.started":"2023-02-16T12:19:49.772016Z","shell.execute_reply":"2023-02-16T12:19:50.425157Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Delete overly specific classes","metadata":{"id":"5-TSpp4i8ueS"}},{"cell_type":"code","source":"stili = df[\"style\"].unique()\nrinascimenti = []\nrealismi = []\ncubismi = []\nastrattismi = []\nfor i in list(stili):\n  if \"Renaissance\" in str(i):\n    rinascimenti.append(i)\n  if \"Realism\" in str(i):\n    realismi.append(i)\n  if \"Cubism\" in str(i):\n    cubismi.append(i)\n  if \"Abstract\" in str(i):\n    astrattismi.append(i)\n  \n\ndf[\"style\"][df[\"style\"].isin(rinascimenti)] = \"Renaissance\"\ndf[\"style\"][df[\"style\"].isin(realismi)] = \"Realism\"\ndf[\"style\"][df[\"style\"].isin(cubismi)] = \"Cubism\"\ndf[\"style\"][df[\"style\"].isin(astrattismi)] = \"Abstract Art\"","metadata":{"id":"f6hLz6AV8sA6","outputId":"11aafa3c-2dbb-4e25-d38d-44e2c5659600","_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-02-16T12:19:50.427639Z","iopub.execute_input":"2023-02-16T12:19:50.427961Z","iopub.status.idle":"2023-02-16T12:19:50.493046Z","shell.execute_reply.started":"2023-02-16T12:19:50.427931Z","shell.execute_reply":"2023-02-16T12:19:50.490618Z"},"jupyter":{"source_hidden":true,"outputs_hidden":true},"collapsed":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Filtriamo i dati selezionando gli stili e generi più rappresentati","metadata":{"id":"BjRvoCar83dJ"}},{"cell_type":"code","source":"\n\n# Ottieni gli n stili più rappresentati\nn = 10\nTopstyles = df[\"style\"].value_counts().head(n)   # stile + counts\nTopStylesNames = list(Topstyles.keys())\n\n# Ottieni gli m generi più rappresentati\nm = 10\nTopgenres = df[\"genre\"].value_counts().head(m)   # stile + counts\nTopGenresNames = list(Topgenres.keys())\n\n\n\n\n","metadata":{"id":"gRovFIMFSKqV","execution":{"iopub.status.busy":"2023-02-16T12:19:50.497731Z","iopub.execute_input":"2023-02-16T12:19:50.498084Z","iopub.status.idle":"2023-02-16T12:19:50.518589Z","shell.execute_reply.started":"2023-02-16T12:19:50.498054Z","shell.execute_reply":"2023-02-16T12:19:50.516997Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Convertiamo le date (stringhe) a interi\ndf[\"date\"] = pd.to_numeric(df[\"date\"], errors = \"coerce\")","metadata":{"id":"j5tNstpdhCW_","execution":{"iopub.status.busy":"2023-02-16T12:19:50.520222Z","iopub.execute_input":"2023-02-16T12:19:50.52219Z","iopub.status.idle":"2023-02-16T12:19:50.579266Z","shell.execute_reply.started":"2023-02-16T12:19:50.522148Z","shell.execute_reply":"2023-02-16T12:19:50.577807Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n**Functions**","metadata":{}},{"cell_type":"code","source":"def reject_outliers(data):\n    m = 2\n    u = np.mean(data)\n    s = np.std(data)\n    filtered = [e for e in data if (u - 2 * s < e < u + 2 * s)]\n    return filtered\n\n","metadata":{"id":"vxXg2sYfqPWm","execution":{"iopub.status.busy":"2023-02-16T12:19:50.58202Z","iopub.execute_input":"2023-02-16T12:19:50.5824Z","iopub.status.idle":"2023-02-16T12:19:50.589824Z","shell.execute_reply.started":"2023-02-16T12:19:50.582366Z","shell.execute_reply":"2023-02-16T12:19:50.588482Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def StackBarChartPrep():\n    x = np.zeros((len(TopStylesNames),len(TopGenresNames)))\n    for i in range(0, len(TopStylesNames)):\n      for j in range(0, len(TopGenresNames)):\n        a = df[\"genre\"][df[\"genre\"]== TopGenresNames[j]][df[\"style\"]== TopStylesNames[i]].value_counts()\n        if len(list(a))>0:\n          a = list(a)[0]\n          x[i,j] = a\n        else:\n          x[i,j] = 0\n\n    # Prepariamo i dati per il bar chart\n    data = []\n    for i in range (0, len(TopGenresNames)):\n      data.append(go.Bar(\n          name = TopGenresNames[i],\n          x = TopStylesNames,\n          y = x[:,i]\n      ))\n    return(data)","metadata":{"id":"kIjxB7ksZSAC","execution":{"iopub.status.busy":"2023-02-16T12:19:50.594131Z","iopub.execute_input":"2023-02-16T12:19:50.594493Z","iopub.status.idle":"2023-02-16T12:19:50.605762Z","shell.execute_reply.started":"2023-02-16T12:19:50.594461Z","shell.execute_reply":"2023-02-16T12:19:50.60466Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def LetsPie(df = df, TopStylesNames= TopStylesNames, TopGenresNames = TopGenresNames):\n    x = np.zeros((len(TopStylesNames)*len(TopGenresNames),1))\n    k = 0\n    genres_column = []\n    styles_column = []\n    for i in range(0, len(TopStylesNames)):\n      for j in range(0, len(TopGenresNames)):\n        genres_column.append(TopGenresNames[j])\n        styles_column.append(TopStylesNames[i])\n        a = df[\"genre\"][df[\"genre\"]== TopGenresNames[j]][df[\"style\"]== TopStylesNames[i]].value_counts()\n        if len(list(a))>0:\n          a = list(a)[0]\n          x[k,0] = a\n        else:\n          x[k,0] = 0\n        k = k + 1\n    pie_df = pd.DataFrame({\"style\": styles_column,\"genre\":genres_column, \"values\": x[:,0]})\n\n    return(pie_df)\n","metadata":{"id":"wt1GzPHnncb-","execution":{"iopub.status.busy":"2023-02-16T12:19:50.606854Z","iopub.execute_input":"2023-02-16T12:19:50.607194Z","iopub.status.idle":"2023-02-16T12:19:50.625855Z","shell.execute_reply.started":"2023-02-16T12:19:50.607164Z","shell.execute_reply":"2023-02-16T12:19:50.624672Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def PieBarPrep():\n  pie_df = np.zeros((len(TopStylesNames)*len(TopGenresNames),1))\n  i = 0\n  for j in len(TopStylesNames):\n    for k in len(TopGenresNames):\n         pie_df[i] = x[j,k]\n         i = i + 1\n  pie_df = pd.DataFrame(pie)","metadata":{"id":"xu9nc3Q_jpw5","execution":{"iopub.status.busy":"2023-02-16T12:19:50.627997Z","iopub.execute_input":"2023-02-16T12:19:50.628455Z","iopub.status.idle":"2023-02-16T12:19:50.637675Z","shell.execute_reply.started":"2023-02-16T12:19:50.628411Z","shell.execute_reply":"2023-02-16T12:19:50.636577Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n---\n# **EDA**","metadata":{"id":"LETtxRdirIKa"}},{"cell_type":"markdown","source":"---\n##### Violin Plot: Styles time distribution ","metadata":{"id":"MRfUvzIIrhZB"}},{"cell_type":"code","source":"#@title\nfig = go.Figure()\ndf = df.sort_values(by = \"date\")\n\nfor style in TopStylesNames:\n        x=df['style'][df['style'] == style]\n        y=df['date'][df['style'] == style]    \n        fig.add_trace(go.Violin(\n                            x=x,\n                            y=reject_outliers(y),\n                            name=style,\n                            box_visible=True,\n                            meanline_visible=True,\n                            points=False))\n\nfig.update_layout(template='plotly_dark', title = \"Styles Time Spans\",\n                   legend=dict(\n    yanchor=\"top\",\n    y=1,\n    xanchor=\"left\",\n    x=1\n))      \n\nfig.show()\n","metadata":{"id":"j-XKKgX3SLSP","outputId":"f16694eb-9c4b-4903-b77b-54b01f88b650","cellView":"form","execution":{"iopub.status.busy":"2023-02-16T12:19:50.642599Z","iopub.execute_input":"2023-02-16T12:19:50.643028Z","iopub.status.idle":"2023-02-16T12:19:52.663725Z","shell.execute_reply.started":"2023-02-16T12:19:50.642993Z","shell.execute_reply":"2023-02-16T12:19:52.662864Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n##### Violin Plot: Genres time distribution","metadata":{"id":"_lxPeRyo_Qei"}},{"cell_type":"code","source":"#@title\nfig = go.Figure()\n\ndf = df.sort_values(by = \"date\")\n\nfor genre in TopGenresNames:\n        x=df['genre'][df['genre'] == genre]\n        y=df['date'][df['genre'] == genre]    \n        fig.add_trace(go.Violin(\n                            x=x,\n                            y=reject_outliers(y),\n                            name=genre,\n                            box_visible=True,\n                            meanline_visible=True,\n                            points=False))\n\nfig.update_layout(template='plotly_dark',title = \"Genres Time Spans\",\n                   legend=dict(\n    yanchor=\"top\",\n    y=1,\n    xanchor=\"left\",\n    x=1\n))      \n\nfig.show()\n\n\n","metadata":{"id":"MdPNfveEtIRB","outputId":"0ec2ff51-c8d3-49cf-d45e-d7ba217e0d4a","cellView":"form","_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-02-16T12:19:52.665104Z","iopub.execute_input":"2023-02-16T12:19:52.665464Z","iopub.status.idle":"2023-02-16T12:19:53.728295Z","shell.execute_reply.started":"2023-02-16T12:19:52.665431Z","shell.execute_reply":"2023-02-16T12:19:53.727394Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n##### Stacked Bar Chart ","metadata":{"id":"aBTEoEoYm7Od"}},{"cell_type":"code","source":"#@title\ndef BarPlotter(styles = TopStylesNames, genres = TopGenresNames):\n  plot = px.bar(LetsPie(TopStylesNames = styles, TopGenresNames = genres), x = 'style', y = 'values', color = 'genre')\n  plot.update_layout(         template='plotly_dark',)\n                                #plot_bgcolor='rgba(0, 0, 0, 0)',)\n                                #paper_bgcolor='rgba(0, 0, 0, 0)')\n  plot.show()\nBarPlotter()","metadata":{"cellView":"form","id":"RghwYbyDwn9a","outputId":"eb49573c-76f9-4660-9ee4-aefcfa593fb3","execution":{"iopub.status.busy":"2023-02-16T12:19:53.729534Z","iopub.execute_input":"2023-02-16T12:19:53.730157Z","iopub.status.idle":"2023-02-16T12:19:55.676422Z","shell.execute_reply.started":"2023-02-16T12:19:53.730118Z","shell.execute_reply":"2023-02-16T12:19:55.67531Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n##### PieChart ","metadata":{"id":"4zqDoDDXULWm"}},{"cell_type":"code","source":"#@title\ndef PiePlotter(styles = TopStylesNames, genres = TopGenresNames):\n  fig = px.bar_polar(LetsPie(TopStylesNames = styles, TopGenresNames = genres), r=\"values\", theta=\"style\", color=\"genre\",\n                    #color_discrete_sequence= px.colors.sequential.Plasma_r,\n                    #title=\"Part of a continuous color scale used as a discrete sequence\"\n                    #log_r = True\n                    )\n  \n  fig.update_layout(         template='plotly_dark',\n                                plot_bgcolor='rgba(0, 0, 0, 0)',)\n                                #paper_bgcolor='rgba(0, 0, 0, 0)')\n  fig.show()\nPiePlotter()","metadata":{"cellView":"form","id":"dLdWL7QFUR-g","outputId":"5469695e-f575-45e7-d208-9a4b0d1bb538","execution":{"iopub.status.busy":"2023-02-16T12:19:55.677775Z","iopub.execute_input":"2023-02-16T12:19:55.678141Z","iopub.status.idle":"2023-02-16T12:19:57.432012Z","shell.execute_reply.started":"2023-02-16T12:19:55.678108Z","shell.execute_reply":"2023-02-16T12:19:57.431111Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n##### Paintings-Metadata\n","metadata":{"id":"BmkUDr9b3xKj"}},{"cell_type":"code","source":"from zipfile import ZipFile\narchive = ZipFile('/kaggle/input/painter-by-numbers/train.zip', 'r')\n\n\ndef random_extraction(df, archive, path = 'train/'):\n    rndm_index = random.choice(list(df.index))\n    image = archive.open(path + str(df[\"new_filename\"][df[\"in_train\"]==True][rndm_index]))\n    img = io.imread(image)\n    fig = px.imshow(img)\n\n    \n    description =    (  str(df[\"artist\"][rndm_index])+\n          \", \"        + str(df[\"title\"][rndm_index]) + \n          \"\\nDate: \"  + str(df[\"date\"][rndm_index])  + \n          \"\\nStyle: \" + str(df[\"style\"][rndm_index]) +\n          \"\\nGenre: \" + str(df[\"genre\"][rndm_index]))\n    \n    Title =    (  str(df[\"artist\"][rndm_index])+\n          \", \"        + str(df[\"title\"][rndm_index]) + \n          \";\"  + str(df[\"date\"][rndm_index]))\n\n\n    fig.update_xaxes(showticklabels=False).update_yaxes(showticklabels=False)\n    fig.update_layout(title = Title, paper_bgcolor = 'rgba(0,0,0,0)', title_font_color = 'gray')\n    fig.show()\n    #print(description)\n    display(df[[\"artist\",\"title\",\"date\", \"style\", \"genre\"]].loc[[rndm_index]])\nrandom_extraction(df, archive)","metadata":{"execution":{"iopub.status.busy":"2023-02-16T12:20:12.69739Z","iopub.execute_input":"2023-02-16T12:20:12.697831Z","iopub.status.idle":"2023-02-16T12:20:14.521061Z","shell.execute_reply.started":"2023-02-16T12:20:12.697791Z","shell.execute_reply":"2023-02-16T12:20:14.519938Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n##### Word Cloud","metadata":{"id":"MkaOc31X_ULG"}},{"cell_type":"code","source":"#@title\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nfrom wordcloud import WordCloud, STOPWORDS, ImageColorGenerator\n\ndef WORDSTYLE(stile):\n    words = ''\n    for i in list(df[\"title\"][df[\"style\"] == stile]):\n      words = words + ' ' + str(i)\n    return(words)\n\nstyles_words_dict = dict({})\nfor stile in TopStylesNames:\n  styles_words_dict[stile] = WORDSTYLE(stile)\n\ndef WCPlotter(stile = \"Renaissance\"):\n  plt.figure(figsize=(5, 5), dpi=80)\n  # create coloring from image\n  rndm_index = random.choice(list(df.index))\n  image = archive.open('train/' + str(random.choice(list(df[\"new_filename\"][df[\"style\"]== stile][df[\"in_train\"]==True]))))\n  #mask = io.imread(\"/content/drive/MyDrive/Machine Learning/train_4/\" + str(random.choice(list(df_train[\"new_filename\"][df_train[\"style\"]== stile]))))\n  mask = io.imread(image)\n  wordcloud = WordCloud(background_color=\"black\", mode=\"RGBA\", max_words=1000,\n                        mask=mask,\n                        max_font_size = 69,#stopwords=stopwords\n                        ).generate(styles_words_dict[stile])\n\n  image_colors = ImageColorGenerator(mask)\n\n  plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation=\"bilinear\")\n  plt.axis(\"off\")\n  plt.title(stile)\n  plt.show()\n\nfor stile in TopStylesNames[:6]:\n   WCPlotter(stile)","metadata":{"id":"Vv6F5k2e_XuU","scrolled":true,"execution":{"iopub.status.busy":"2023-02-16T12:19:58.819167Z","iopub.status.idle":"2023-02-16T12:19:58.81974Z","shell.execute_reply.started":"2023-02-16T12:19:58.819548Z","shell.execute_reply":"2023-02-16T12:19:58.819568Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Train**","metadata":{"id":"1U9iUIujaYic"}},{"cell_type":"markdown","source":"### Resizing e salvataggio dei vettori-immagini\n---\n*Per evitare di convertire ogni volta le immagini in vettori, e \navere i dati già pronti per la CNN*\n\n","metadata":{"id":"f3GM6f50waLT"}},{"cell_type":"code","source":"#print(pd.DataFrame(df[\"artist\"].value_counts()[:20]).head(20))\n\ndf_top30_artist = df[df[\"artist\"].isin(list(df[\"artist\"].value_counts()[:30].index))]\ndf_top30_artist = df_top30_artist[df[\"in_train\"]==True]","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-02-16T12:20:54.985031Z","iopub.execute_input":"2023-02-16T12:20:54.985494Z","iopub.status.idle":"2023-02-16T12:20:55.020372Z","shell.execute_reply.started":"2023-02-16T12:20:54.985458Z","shell.execute_reply":"2023-02-16T12:20:55.018601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\nfrom PIL import Image\nimport cv2 as cv\nImage.MAX_IMAGE_PIXELS = 10**9\n\ntrain_data = []\nfilenames  = []\nout = []\n#for file_name in list(df['new_filename'][df['in_train']==True]):\nfor file_name in list(df_top30_artist['new_filename']):\n        #print(file_name)\n        try:\n            image = io.imread(archive.open(\"train/\" + file_name))\n            image = np.array(image)\n        \n            resized = cv.resize(image, (224,224),interpolation=cv.INTER_AREA)\n            train_data.append(resized)\n            filenames.append(file_name)\n            #train_labels.append(class_directory[class_folder])\n        except:\n            out.append(file_name)\n\n# Escludiamo le immagini di dimensione != (224,224,3)\ntrain_data_right = []\nfilenames_right = []\nfor i in range(0, len(train_data)):\n   if train_data[i].shape == (224,224,3):\n     train_data_right.append(train_data[i])\n     filenames_right.append(filenames[i])\n   else:\n     print(train_data[i].shape)\n\n# Salviamo\nnp.save(\"/kaggle/working/Images-resized-array\", train_data_right)\nimport pickle\nwith open(\"/kaggle/working/filenames_right\", \"wb\") as fp:   #Pickling\n       pickle.dump(filenames_right, fp)\n\"\"\"","metadata":{"id":"onxglH26ibOv","outputId":"78a8140c-72bb-4c79-b9ed-0262f62c1e2e","cellView":"form","scrolled":true,"execution":{"iopub.status.busy":"2023-02-16T15:21:22.459526Z","iopub.execute_input":"2023-02-16T15:21:22.460024Z","iopub.status.idle":"2023-02-16T15:21:22.468716Z","shell.execute_reply.started":"2023-02-16T15:21:22.459988Z","shell.execute_reply":"2023-02-16T15:21:22.467501Z"},"jupyter":{"outputs_hidden":true},"collapsed":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pickle\n# Vettori\ntrain_data_right = np.load(\"/kaggle/working/Images-resized-array.npy\")\n\n# Nomi file, per prenderli nel dataframe\nwith open(\"/kaggle/working/filenames_right\", \"rb\") as fp:   # Unpickling\n      filenames_right = pickle.load(fp)\ntrain_data_right.shape","metadata":{"id":"NTL5FrVDxwLb","execution":{"iopub.status.busy":"2023-02-16T12:26:06.776492Z","iopub.execute_input":"2023-02-16T12:26:06.77705Z","iopub.status.idle":"2023-02-16T12:26:08.186495Z","shell.execute_reply.started":"2023-02-16T12:26:06.777005Z","shell.execute_reply":"2023-02-16T12:26:08.184834Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#print(len(train_data_right), len(train_data), len(out))\n#len(df_top30_artist)\n\n# 11442 images, 11271 convertite in array","metadata":{"execution":{"iopub.status.busy":"2023-02-16T12:26:09.315098Z","iopub.execute_input":"2023-02-16T12:26:09.316072Z","iopub.status.idle":"2023-02-16T12:26:09.321126Z","shell.execute_reply.started":"2023-02-16T12:26:09.316023Z","shell.execute_reply":"2023-02-16T12:26:09.320016Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Caricamento dati","metadata":{"id":"nLxFC9UXDlZK"}},{"cell_type":"code","source":"#@title\n# Check\nfig = px.imshow(train_data_right[1999])\ndisplay(df_top30_artist[df_top30_artist[\"new_filename\"] == filenames_right[1999] ])\nfig.update_xaxes(showticklabels=False).update_yaxes(showticklabels=False)\nfig.update_layout(paper_bgcolor = 'rgba(0,0,0,0)')\n\nfig.show()","metadata":{"id":"WOVPE3HXsPsQ","outputId":"3767ff3f-4c08-44d7-f2c6-273bae45ed60","execution":{"iopub.status.busy":"2023-02-16T12:26:10.46155Z","iopub.execute_input":"2023-02-16T12:26:10.462478Z","iopub.status.idle":"2023-02-16T12:26:10.555606Z","shell.execute_reply.started":"2023-02-16T12:26:10.462429Z","shell.execute_reply":"2023-02-16T12:26:10.554424Z"},"jupyter":{"source_hidden":true,"outputs_hidden":true},"collapsed":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Definizione X e y\n---\nCreiamo una funzione che prende in input una lista di stili e restituisce X e y, in maniera tale che le classi siano ugualmente rappresentate (facendo undersampling), e un dataframe coi metadati corrispondenti a ciascuna immagine.","metadata":{"id":"YeJVlnewDrbA"}},{"cell_type":"code","source":"from sklearn import preprocessing\nfrom sklearn.model_selection import train_test_split\nfrom imblearn.under_sampling import RandomUnderSampler","metadata":{"id":"I7GEdw7HI2O-","execution":{"iopub.status.busy":"2023-02-16T12:26:11.352221Z","iopub.execute_input":"2023-02-16T12:26:11.353096Z","iopub.status.idle":"2023-02-16T12:26:12.160773Z","shell.execute_reply.started":"2023-02-16T12:26:11.353045Z","shell.execute_reply":"2023-02-16T12:26:12.159609Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def XyCreator(df_train, class_type ,classes):\n    X_metadata = df_train[df_train[class_type].isin(classes)] \n    X, y  = [], []\n    names = []\n\n    for  i in range(0, len(filenames_right)):\n      if  filenames_right[i] in list(X_metadata[\"new_filename\"]):\n        y.append(list(X_metadata[class_type][X_metadata[\"new_filename\"] == filenames_right[i]])[0])\n        X.append(train_data_right[i])\n        names.append(filenames_right[i])\n\n    # Label encoding\n    le = preprocessing.LabelEncoder()\n    y = le.fit_transform(y)\n    X, y = np.array(X), np.array(y)\n\n    # Names encoding\n    le_name = preprocessing.LabelEncoder()\n    names = le_name.fit_transform(names)\n    names = np.array(names)\n\n\n    X_n = np.reshape(X, (-1,224*224*3))\n\n    Xnames = np.concatenate((X_n, np.reshape(names,(-1,1))), axis = 1)\n\n    # Undersampling\n    rus = RandomUnderSampler(random_state=42)\n    X_res, y_res = rus.fit_resample(Xnames,y)\n    X = X_res[:,0:-1]\n    names = X_res[:,-1]\n\n    X = np.reshape(X, (-1,224,224,3))\n    names = list(le_name.inverse_transform(names))\n\n    res_metadata = X_metadata[X_metadata[\"new_filename\"].isin(names)] \n\n    classes_labels = dict({})\n    for i in np.unique(y):\n      classes_labels[i] = list(le.inverse_transform([i]))[0]\n    print(classes_labels)\n\n    return(X, y_res, classes_labels, res_metadata, names)          ","metadata":{"id":"TCWbVllFHh-9","execution":{"iopub.status.busy":"2023-02-16T12:26:12.162503Z","iopub.execute_input":"2023-02-16T12:26:12.162848Z","iopub.status.idle":"2023-02-16T12:26:12.177288Z","shell.execute_reply.started":"2023-02-16T12:26:12.162811Z","shell.execute_reply":"2023-02-16T12:26:12.175995Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Prove CNN ","metadata":{"id":"NHVLlX7wwA0a"}},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.optimizers import Adam, SGD\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.models import Model, Sequential\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import Dense, Input, Conv2D, BatchNormalization, MaxPooling2D, Flatten, GlobalAvgPool2D, Add, Dropout","metadata":{"id":"oii6NbIBWPon","execution":{"iopub.status.busy":"2023-02-16T12:26:15.212196Z","iopub.execute_input":"2023-02-16T12:26:15.212679Z","iopub.status.idle":"2023-02-16T12:26:23.079822Z","shell.execute_reply.started":"2023-02-16T12:26:15.212642Z","shell.execute_reply":"2023-02-16T12:26:23.078631Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X, y, classes_labels, metadata, names = XyCreator(df_top30_artist, \"artist\", list(df_top30_artist[\"artist\"].value_counts()[:10].index)) \nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)\n\nX_train, X_test = X_train/255., X_test/255.        # Normalization  ","metadata":{"id":"AoJmqgEdwDEm","outputId":"867e6e26-eaca-4341-84e5-7ec832ea52cf","execution":{"iopub.status.busy":"2023-02-16T12:26:23.081809Z","iopub.execute_input":"2023-02-16T12:26:23.082589Z","iopub.status.idle":"2023-02-16T12:26:39.102025Z","shell.execute_reply.started":"2023-02-16T12:26:23.082549Z","shell.execute_reply":"2023-02-16T12:26:39.100422Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n---\n---\n---\n---\n##### 15 febbraio - 1 modello (15feb_1.h5)\n* Modello per classificazione meteo\n* 10 classi da 243 immagini ciascuna\n* Accuracy 0.52","metadata":{"id":"GWdIg_TRsPV2"}},{"cell_type":"code","source":"\nn=224\nf_size=3    # filter\\kernel dimension: f_size x f_size\n\n\nmodel = tf.keras.models.Sequential()    # Model Inizialization\n\n\n# The dimensions of the image resulting from a convolution operation is (n – f + 1) x (n – f + 1).\nmodel.add(Conv2D(filters=64,kernel_size=(f_size,f_size),input_shape=(n, n, 3)))\nmodel.add(Conv2D(filters=32,kernel_size=(f_size,f_size)))\n\n# Max Pooling: Downsamples the input along its spatial dimensions (height and width)\n# by taking the maximum value over an input window (of size defined by pool_size) \n# for each channel of the input. The window is shifted by strides along each dimension.\n\nmodel.add(MaxPooling2D(pool_size=(16,16),strides=None))\n\n# Flatten layer unstacks rows of pixels in the image and lines them up.\n# This layer has no parameters to learn; it only reformats the data\nmodel.add(Flatten())\n# Dropping a fraction of neurons randomly\nmodel.add(Dropout(0.2))\n\n# Second layer, search for parts of image\nmodel.add(Dense(200, activation=tf.nn.relu))\n# Repeat and repeat\nmodel.add(Dense(200, activation=tf.nn.relu))\nmodel.add(Dropout(0.1))\n# Output layer, should match values for fitting\nmodel.add(Dense(len(classes_labels), activation=tf.nn.softmax))\n\nprint(model.summary())\n\n'''\nmodel.compile(optimizer='adam',\n              loss=tf.keras.losses.SparseCategoricalCrossentropy(),\n              metrics=['accuracy'])\n\nhistory = model.fit(X_train, y_train, epochs=10, \n                    validation_data=(X_test, y_test))\n\n\n##############################\n### Save Model and History ###\n##############################\n\nmodel.save(\"/kaggle/working/15feb_1.h5\")\nwith open('/kaggle/working/15feb_1-hist', 'wb') as file_pi:\n    pickle.dump(history.history, file_pi)\n'''","metadata":{"id":"qzo3oQm-sRBX","outputId":"19a84f1c-34e8-4017-a9df-c46a24aca9dc","execution":{"iopub.status.busy":"2023-02-16T15:18:12.88004Z","iopub.execute_input":"2023-02-16T15:18:12.880518Z","iopub.status.idle":"2023-02-16T15:18:12.969424Z","shell.execute_reply.started":"2023-02-16T15:18:12.880479Z","shell.execute_reply":"2023-02-16T15:18:12.968184Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##############################\n### Load Model and History ###\n##############################\nmodel = tf.keras.models.load_model(\"/kaggle/working/15feb_1.h5\")\nwith open('/kaggle/working/15feb_1-hist', \"rb\") as file_pi:\n    history = pickle.load(file_pi)","metadata":{"id":"tILXZ99j9PVL","execution":{"iopub.status.busy":"2023-02-16T15:18:36.738766Z","iopub.execute_input":"2023-02-16T15:18:36.739259Z","iopub.status.idle":"2023-02-16T15:18:36.878652Z","shell.execute_reply.started":"2023-02-16T15:18:36.739221Z","shell.execute_reply":"2023-02-16T15:18:36.877462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = px.line(pd.DataFrame({\"Epoch\": np.arange(1,11,1),\n                            \"Accuracy\": history[\"accuracy\"],\n                            \"Val. Accuracy\": history[\"val_accuracy\"]}),\n              x = \"Epoch\",\n              y = [\"Accuracy\", \"Val. Accuracy\"],\n              markers = \"*\",\n              range_y=[0,1])\nfig.update_layout(template = \"plotly_dark\",paper_bgcolor = \"rgba(0,0,0,0)\") \nfig.show()\nfig = px.line(pd.DataFrame({\"Epoch\": np.arange(1,11,1),\n                            \"Loss\": history[\"loss\"],\n                            \"Val. Loss\": history[\"val_loss\"]}),\n              x = \"Epoch\",\n              y = [\"Loss\", \"Val. Loss\"],\n              markers = \"*\")\nfig.update_layout(template = \"plotly_dark\",paper_bgcolor = \"rgba(0,0,0,0)\") \nfig.show()","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-02-16T15:18:39.038146Z","iopub.execute_input":"2023-02-16T15:18:39.038992Z","iopub.status.idle":"2023-02-16T15:18:39.226308Z","shell.execute_reply.started":"2023-02-16T15:18:39.038946Z","shell.execute_reply":"2023-02-16T15:18:39.225023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import classification_report, f1_score, accuracy_score, confusion_matrix, ConfusionMatrixDisplay\n\npredictions = model.predict(X_test)\ny_pred = np.argmax(predictions, axis = 1)\npx.imshow(np.around(confusion_matrix(y_test,y_pred, normalize = \"true\"),2),\n          text_auto = True,\n          x = list(classes_labels.values()), y = list(classes_labels.values()),\n          color_continuous_scale= 'algae').show()\nprint(classification_report(y_test,y_pred))","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-02-16T15:18:17.519817Z","iopub.execute_input":"2023-02-16T15:18:17.520273Z","iopub.status.idle":"2023-02-16T15:18:36.73661Z","shell.execute_reply.started":"2023-02-16T15:18:17.520238Z","shell.execute_reply":"2023-02-16T15:18:36.735261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\nind = random.randint(0,len(X_test))\n\n\nfor key in classes_labels.keys():\n   print(classes_labels[key] + \"   \" + str(round(predictions[ind][key]*100,2)) + \"%\")\n#print(\"\\nTrue Label = \" + classes_labels[y_test[ind]])\nfig = px.imshow(X_test[ind])\nfig.update_xaxes(showticklabels=False).update_yaxes(showticklabels=False)\nfig.update_layout(title = \"True Label = \" + classes_labels[y_test[ind]],\n                  template = \"plotly_dark\", paper_bgcolor = \"rgba(0,0,0,0)\")\nfig.show()","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-02-16T15:18:49.504069Z","iopub.execute_input":"2023-02-16T15:18:49.504466Z","iopub.status.idle":"2023-02-16T15:18:49.598461Z","shell.execute_reply.started":"2023-02-16T15:18:49.504434Z","shell.execute_reply":"2023-02-16T15:18:49.597326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n---\n---\n---\n---\n##### Numero 2\n* Modello basic a caso. Da provare","metadata":{"id":"yD_tD2rtsHt_"}},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\n\nmodel.add(Flatten())\nmodel.add(Dense(64, activation='relu'))\nmodel.add(Dense(len(classes_labels)))\n\nmodel.compile(optimizer='adam',\n              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n              metrics=['accuracy'])\n\nhistory = model.fit(X_train, y_train, epochs=10, \n                    validation_data=(X_test, y_test))","metadata":{"id":"VnHkMbqCr1h-","execution":{"iopub.status.busy":"2023-02-16T15:09:06.334653Z","iopub.execute_input":"2023-02-16T15:09:06.335269Z","iopub.status.idle":"2023-02-16T15:17:03.384731Z","shell.execute_reply.started":"2023-02-16T15:09:06.335224Z","shell.execute_reply":"2023-02-16T15:17:03.383006Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##############################\n### Save Model and History ###\n##############################\n\nmodel.save(\"/kaggle/working/16feb_2.h5\")\nwith open('/kaggle/working/16feb_2-hist', 'wb') as file_pi:\n    pickle.dump(history.history, file_pi)\n    \n\n##############################\n### Load Model and History ###\n##############################\nmodel = tf.keras.models.load_model(\"/kaggle/working/15feb_1.h5\")\nwith open('/kaggle/working/15feb_1-hist', \"rb\") as file_pi:\n    history = pickle.load(file_pi)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history[\"accuracy\"])\nplt.plot(history.history[\"val_accuracy\"])\nplt.show()\nplt.plot(history.history[\"loss\"])\nplt.plot(history.history[\"val_loss\"])\nplt.show()","metadata":{"id":"mKZaBBoisp0_","outputId":"809ce8be-86fb-469a-e63f-d3ce71c90336","execution":{"iopub.status.busy":"2023-02-16T12:19:58.846313Z","iopub.status.idle":"2023-02-16T12:19:58.846732Z","shell.execute_reply.started":"2023-02-16T12:19:58.84653Z","shell.execute_reply":"2023-02-16T12:19:58.84655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Torch NN","metadata":{}},{"cell_type":"markdown","source":"# Sankey","metadata":{}},{"cell_type":"code","source":"import plotly.graph_objects as go\n\ndef SankeyCreator(artistii = list(df_top30_artist[\"artist\"].unique())[:30], TopStylesNames = TopStylesNames):\n\n    source = []\n    target = []\n    flows = []\n\n    for artist in artistii:\n         x = df_top30_artist[\"style\"][df_top30_artist[\"style\"].isin(TopStylesNames)][df_top30_artist[\"artist\"]==artist]\n         if len(list(x.value_counts())) > 0:\n                 flows = flows + list(x.value_counts())\n                 target= target + list(x.value_counts().index)\n                 source = source + [artist]*len(list(x.value_counts()))\n\n\n    encoding = source + target\n    le = preprocessing.LabelEncoder()\n    encoding = le.fit_transform(encoding)\n    encoded_source = le.transform(source)\n    encoded_target = le.transform(target)\n\n\n    fig = go.Figure(data=[go.Sankey(\n        node = dict(\n          pad = 15,\n          thickness = 20,\n          line = dict(color = \"black\", width = 0.5),\n          label = list(np.unique(le.inverse_transform(encoding))),\n          #color = \"blue\"\n        ),\n        link = dict(\n          source = encoded_source, # indices correspond to labels, eg A1, A2, A1, B1, ...\n          target = encoded_target,\n          value =  flows\n      ))])\n\n    fig.update_layout(template = 'plotly_dark')\n    fig.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-16T14:20:38.954594Z","iopub.execute_input":"2023-02-16T14:20:38.955066Z","iopub.status.idle":"2023-02-16T14:20:38.970111Z","shell.execute_reply.started":"2023-02-16T14:20:38.955028Z","shell.execute_reply":"2023-02-16T14:20:38.969157Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"SankeyCreator(list(classes_labels.values()),\n              list(df_top30_artist[\"style\"].value_counts().head(15).index))","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-02-16T15:32:19.80775Z","iopub.execute_input":"2023-02-16T15:32:19.808279Z","iopub.status.idle":"2023-02-16T15:32:19.888716Z","shell.execute_reply.started":"2023-02-16T15:32:19.808243Z","shell.execute_reply":"2023-02-16T15:32:19.887824Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}