{"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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data=pd.read_csv(\"../input/plant-pathology-2021-fgvc8/train.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data[\"image\"].head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_paths=\"../input/plant-pathology-2021-fgvc8/train_images/\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img=plt.imread(train_paths+data[\"image\"][4])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(img)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data[\"labels\"].unique()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"zerofilling=np.zeros((18632,6))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels=pd.DataFrame(columns=[\"healthy\",\"scab\",\"frog_eye_leaf_spot\",\"complex\",\"rust\",\"powdery_mildew\"],data=zerofilling)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(data.shape[0]):\n    full_lab=data.loc[i,\"labels\"]\n    for j in range(6):\n        lab=labels.columns[j]\n        if lab in full_lab:\n            labels.loc[i,lab]=1","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels.index=data.index","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.drop(\"labels\",axis=1,inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data=pd.concat([data,labels],axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Label Counts:\\n\")\nprint(labels.sum())\nprint(\"\\n\\nLabel Percentages:\\n\")\nprint(100*labels.sum()/data.shape[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The data is quite imbalanced.\nI'll try a baseline model first, then we'll see.","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale = 1./255.,\n                                   samplewise_center=True, \n                                   samplewise_std_normalization=True,\n                                   validation_split = 0.2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(dataframe = data,\n                                                   directory = train_paths,\n                                                   target_size = (128,128),\n                                                   x_col = 'image',\n                                                   y_col = list(labels.columns),\n                                                   batch_size = 32,\n                                                   color_mode = 'rgb',\n                                                   class_mode = 'raw',\n                                                   subset = 'training')\n\ntest_generator = train_datagen.flow_from_dataframe(dataframe = data,\n                                                 directory = train_paths,\n                                                 target_size = (128,128),\n                                                 x_col = 'image',\n                                                 y_col = list(labels.columns),\n                                                 batch_size = 32,\n                                                 color_mode = 'rgb',\n                                                 class_mode = 'raw',\n                                                 subset = 'validation')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPool2D, Flatten, Dense, Dropout, BatchNormalization","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"convnet=Sequential([\n\n    Conv2D(filters=16,kernel_size=5,strides=3,padding=\"same\",activation=\"relu\",name=\"conv1\",input_shape=(128,128,3)),\n    BatchNormalization(name=\"BN1\"),\n    MaxPool2D(pool_size=(2,2),name=\"Pool1\"),\n\n    Conv2D(filters=32,kernel_size=4,strides=2,padding=\"same\",name=\"conv2\",activation=\"relu\"),\n    BatchNormalization(name=\"BN2\"),\n    MaxPool2D(pool_size=(2,2),name=\"Pool2\"),\n\n    Conv2D(filters=64,kernel_size=3,strides=1,padding=\"same\",name=\"conv3\",activation=\"relu\"),\n    BatchNormalization(name=\"BN3\"),\n    MaxPool2D(pool_size=(2,2),name=\"Pool3\"),\n    \n    Conv2D(filters=32,kernel_size=1,strides=1,padding=\"valid\",name=\"conv4\",activation=\"relu\"),\n    BatchNormalization(name=\"BN4\"),\n\n    Flatten(name=\"Flatten\"),\n    \n    Dense(64,activation=\"relu\",name=\"FullyConnected1\"),\n    Dropout(0.3,name=\"DropOut1\"),\n    BatchNormalization(name=\"BN5\"),\n    \n    Dense(32,activation=\"relu\",name=\"FullyConnected2\"),\n    Dropout(0.3,name=\"DropOut2\"),\n    BatchNormalization(name=\"BN6\"),\n    \n    Dense(6,activation=\"sigmoid\",name=\"OutputDense\")\n])\n\nconvnet.compile(optimizer=\"adam\",loss=\"binary_crossentropy\",metrics=['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"convnet.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = convnet.fit(train_generator, validation_data=test_generator, epochs=5)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history2 = convnet.fit(train_generator, validation_data=test_generator, epochs=2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}