{
  "id": 47898,
  "title": "ResNet18 is not getting trained to expected level",
  "url": "/competitions/sp-society-camera-model-identification/discussion/47898",
  "author_name": "",
  "post_date": "2018-01-20T09:35:59.168440700Z",
  "votes": null,
  "comment_count": 3,
  "views": 0,
  "content": "<p>I am training RESNET 18 from scratch. I have dumped 3000  patches of 224x224 from 275 images for each class. SO i have 30000 images for training and 5000 images for testing. While dumping these images I have applied Data Augumentation- gamma Correction/Jpeg compression as these are not available with keras inbuilt DataAugumnetation.</p>\n\n<p>To get rid of overfitting I have added one dropout layer-</p>\n\n<pre><code>   # Classifier block\n            block_shape = K.int_shape(block)\n            pool2 = AveragePooling2D(pool_size=(block_shape[ROW_AXIS], block_shape[COL_AXIS]),\n                                 strides=(1, 1))(block)\n            flatten1 = Flatten()(pool2) #num_nodes=512\n            flatten2 = Dropout(0.30)(flatten1)\n            dense = Dense(units=10, kernel_initializer=\"he_normal\",\n                      activation=\"softmax\")(flatten2)\n\n            model = Model(inputs=input, outputs=dense)\n\n\nTraining codes-\n\n\n\n    &gt; For training-\n    &gt;     train_datagen = ImageDataGenerator(\n    &gt;         rotation_range=90,\n    &gt;         samplewise_center = True,\n    &gt;         rescale=1./255,\n    &gt;         vertical_flip = True,\n    &gt;         horizontal_flip=True,\n    &gt;         fill_mode='nearest')\n    &gt; \n    &gt; test_datagen = ImageDataGenerator(rescale=1./255)  \n    &gt; train_dir_generator = train_datagen.flow_from_directory(\n    &gt;         trainDataFolderPath_patch,# this is the target directory\n    &gt;         target_size=(img_height, img_width),  # all images will be resized to 150x150\n    &gt;         batch_size=batch_size,\n    &gt;         class_mode='categorical') \n    &gt; \n    &gt; valid_dir_generator = test_datagen.flow_from_directory(\n    &gt;         validDataFolderPath_patch,\n    &gt;         target_size=(img_height, img_width),\n    &gt;         batch_size=batch_size_valid,\n    &gt;         class_mode='categorical')\n\n&gt;  ''' Compile Model'''\n&gt;         sgd = optimizers.SGD(lr=0.01, decay=1e-4, momentum=0.9, nesterov=True);#10-3 to 10-4\n&gt;         final_model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy']);\n&gt;         ''' Training '''\n&gt;         cnn = final_model.fit_generator(train_dir_generator,\n&gt;                            steps_per_epoch= NUMBER_BATCH_PER_EPOC,\n&gt;                            epochs=NUMBER_EPOC,\n&gt;                            validation_data = valid_dir_generator,\n&gt;                            validation_steps = num_patch_to_validate,\n&gt;                            callbacks=[checkpoint,learningRatecb,tensorBoardcb],\n&gt;                             verbose=1)\n</code></pre>\n\n<p>While training  Accuracy is improving over epochs- but stagnant to 40% (highest).  Also, validation accuracy is not improving beyond 15%. Looks like model is not learning nay thing. \nAlso, I do follwing this as a part of data normalization-</p>\n\n<blockquote>\n  <p>patch = np.float32(patch) * scale; #&gt;0-1\n              patch -= np.mean(patch, keepdims=True)  # sample center use in training\n              filtered_img_rgb = patch[..., ::-1]; #bgr-&gt;rgb</p>\n</blockquote>\n\n<p>Plz suggest any possible reason for this behavior of model.</p>",
  "messages": [
    {
      "id": "271366",
      "postDate": "01/20/2018 09:35:59",
      "content": "<p>I am training RESNET 18 from scratch. I have dumped 3000  patches of 224x224 from 275 images for each class. SO i have 30000 images for training and 5000 images for testing. While dumping these images I have applied Data Augumentation- gamma Correction/Jpeg compression as these are not available with keras inbuilt DataAugumnetation.</p>\n\n<p>To get rid of overfitting I have added one dropout layer-</p>\n\n<pre><code>   # Classifier block\n            block_shape = K.int_shape(block)\n            pool2 = AveragePooling2D(pool_size=(block_shape[ROW_AXIS], block_shape[COL_AXIS]),\n                                 strides=(1, 1))(block)\n            flatten1 = Flatten()(pool2) #num_nodes=512\n            flatten2 = Dropout(0.30)(flatten1)\n            dense = Dense(units=10, kernel_initializer=\"he_normal\",\n                      activation=\"softmax\")(flatten2)\n\n            model = Model(inputs=input, outputs=dense)\n\n\nTraining codes-\n\n\n\n    &gt; For training-\n    &gt;     train_datagen = ImageDataGenerator(\n    &gt;         rotation_range=90,\n    &gt;         samplewise_center = True,\n    &gt;         rescale=1./255,\n    &gt;         vertical_flip = True,\n    &gt;         horizontal_flip=True,\n    &gt;         fill_mode='nearest')\n    &gt; \n    &gt; test_datagen = ImageDataGenerator(rescale=1./255)  \n    &gt; train_dir_generator = train_datagen.flow_from_directory(\n    &gt;         trainDataFolderPath_patch,# this is the target directory\n    &gt;         target_size=(img_height, img_width),  # all images will be resized to 150x150\n    &gt;         batch_size=batch_size,\n    &gt;         class_mode='categorical') \n    &gt; \n    &gt; valid_dir_generator = test_datagen.flow_from_directory(\n    &gt;         validDataFolderPath_patch,\n    &gt;         target_size=(img_height, img_width),\n    &gt;         batch_size=batch_size_valid,\n    &gt;         class_mode='categorical')\n\n&gt;  ''' Compile Model'''\n&gt;         sgd = optimizers.SGD(lr=0.01, decay=1e-4, momentum=0.9, nesterov=True);#10-3 to 10-4\n&gt;         final_model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy']);\n&gt;         ''' Training '''\n&gt;         cnn = final_model.fit_generator(train_dir_generator,\n&gt;                            steps_per_epoch= NUMBER_BATCH_PER_EPOC,\n&gt;                            epochs=NUMBER_EPOC,\n&gt;                            validation_data = valid_dir_generator,\n&gt;                            validation_steps = num_patch_to_validate,\n&gt;                            callbacks=[checkpoint,learningRatecb,tensorBoardcb],\n&gt;                             verbose=1)\n</code></pre>\n\n<p>While training  Accuracy is improving over epochs- but stagnant to 40% (highest).  Also, validation accuracy is not improving beyond 15%. Looks like model is not learning nay thing. \nAlso, I do follwing this as a part of data normalization-</p>\n\n<blockquote>\n  <p>patch = np.float32(patch) * scale; #&gt;0-1\n              patch -= np.mean(patch, keepdims=True)  # sample center use in training\n              filtered_img_rgb = patch[..., ::-1]; #bgr-&gt;rgb</p>\n</blockquote>\n\n<p>Plz suggest any possible reason for this behavior of model.</p>",
      "rawMarkdown": "I am training RESNET 18 from scratch. I have dumped 3000  patches of 224x224 from 275 images for each class. SO i have 30000 images for training and 5000 images for testing. While dumping these images I have applied Data Augumentation- gamma Correction/Jpeg compression as these are not available with keras inbuilt DataAugumnetation.\n\nTo get rid of overfitting I have added one dropout layer-\n\n       # Classifier block\n    \t\t\tblock_shape = K.int_shape(block)\n    \t\t\tpool2 = AveragePooling2D(pool_size=(block_shape[ROW_AXIS], block_shape[COL_AXIS]),\n    \t\t\t\t\t\t\t\t strides=(1, 1))(block)\n    \t\t\tflatten1 = Flatten()(pool2) #num_nodes=512\n    \t\t\tflatten2 = Dropout(0.30)(flatten1)\n    \t\t\tdense = Dense(units=10, kernel_initializer=\"he_normal\",\n    \t\t\t\t\t  activation=\"softmax\")(flatten2)\n    \n    \t\t\tmodel = Model(inputs=input, outputs=dense)\n\n \n    Training codes-\n    \n     \n    \n        &gt; For training-\n        &gt;     train_datagen = ImageDataGenerator(\n        &gt;         rotation_range=90,\n        &gt;         samplewise_center = True,\n        &gt;         rescale=1./255,\n        &gt;         vertical_flip = True,\n        &gt;         horizontal_flip=True,\n        &gt;         fill_mode='nearest')\n        &gt; \n        &gt; test_datagen = ImageDataGenerator(rescale=1./255)  \n        &gt; train_dir_generator = train_datagen.flow_from_directory(\n        &gt;         trainDataFolderPath_patch,# this is the target directory\n        &gt;         target_size=(img_height, img_width),  # all images will be resized to 150x150\n        &gt;         batch_size=batch_size,\n        &gt;         class_mode='categorical') \n        &gt; \n        &gt; valid_dir_generator = test_datagen.flow_from_directory(\n        &gt;         validDataFolderPath_patch,\n        &gt;         target_size=(img_height, img_width),\n        &gt;         batch_size=batch_size_valid,\n        &gt;         class_mode='categorical')\n    \n    &gt;  ''' Compile Model'''\n    &gt;         sgd = optimizers.SGD(lr=0.01, decay=1e-4, momentum=0.9, nesterov=True);#10-3 to 10-4\n    &gt;         final_model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy']);\n    &gt;         ''' Training '''\n    &gt;         cnn = final_model.fit_generator(train_dir_generator,\n    &gt;                            steps_per_epoch= NUMBER_BATCH_PER_EPOC,\n    &gt;                            epochs=NUMBER_EPOC,\n    &gt;                            validation_data = valid_dir_generator,\n    &gt;                            validation_steps = num_patch_to_validate,\n    &gt;                            callbacks=[checkpoint,learningRatecb,tensorBoardcb],\n    &gt;                             verbose=1)\n\nWhile training  Accuracy is improving over epochs- but stagnant to 40% (highest).  Also, validation accuracy is not improving beyond 15%. Looks like model is not learning nay thing. \nAlso, I do follwing this as a part of data normalization-\n      \n\n           \n\n&gt;  patch = np.float32(patch) * scale; #&gt;0-1\n&gt;             patch -= np.mean(patch, keepdims=True)  # sample center use in training\n&gt;             filtered_img_rgb = patch[..., ::-1]; #bgr-&gt;rgb\n\nPlz suggest any possible reason for this behavior of model.",
      "votes": null
    },
    {
      "id": "271385",
      "postDate": "01/20/2018 10:51:24",
      "content": "<p>Have you tried w/o augmentation?</p>",
      "rawMarkdown": "Have you tried w/o augmentation?",
      "votes": null
    },
    {
      "id": "271443",
      "postDate": "01/20/2018 13:04:37",
      "content": "<p>Not yet.. i have started with default data augmentation once and then added my own augmentation of gamma/jpeg.</p>",
      "rawMarkdown": "Not yet.. i have started with default data augmentation once and then added my own augmentation of gamma/jpeg.",
      "votes": null
    },
    {
      "id": "273600",
      "postDate": "01/24/2018 21:34:00",
      "content": "<p>I have used ResNet18, and I got validation accuracy near 90 percent. I suggest to remove any data augmentation (because data augmentation is useful for overfitting not underfitting) and try to overfit your model on a sample dataset containing a tiny fraction of the original dataset. This way, you will be able to find your bugs much easier. Good luck!.</p>",
      "rawMarkdown": "I have used ResNet18, and I got validation accuracy near 90 percent. I suggest to remove any data augmentation (because data augmentation is useful for overfitting not underfitting) and try to overfit your model on a sample dataset containing a tiny fraction of the original dataset. This way, you will be able to find your bugs much easier. Good luck!.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 271385,
      "author_name": "antorsae",
      "author_url": "",
      "post_date": "01/20/2018 10:51:24",
      "content": "<p>Have you tried w/o augmentation?</p>",
      "votes": null,
      "replies": [
        {
          "id": 271443,
          "author_name": "sumitjha19",
          "author_url": "",
          "post_date": "01/20/2018 13:04:37",
          "content": "<p>Not yet.. i have started with default data augmentation once and then added my own augmentation of gamma/jpeg.</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 273600,
      "author_name": "hamyadlab",
      "author_url": "",
      "post_date": "01/24/2018 21:34:00",
      "content": "<p>I have used ResNet18, and I got validation accuracy near 90 percent. I suggest to remove any data augmentation (because data augmentation is useful for overfitting not underfitting) and try to overfit your model on a sample dataset containing a tiny fraction of the original dataset. This way, you will be able to find your bugs much easier. Good luck!.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "271366": "I am training RESNET 18 from scratch. I have dumped 3000  patches of 224x224 from 275 images for each class. SO i have 30000 images for training and 5000 images for testing. While dumping these images I have applied Data Augumentation- gamma Correction/Jpeg compression as these are not available with keras inbuilt DataAugumnetation.\n\nTo get rid of overfitting I have added one dropout layer-\n\n       # Classifier block\n    \t\t\tblock_shape = K.int_shape(block)\n    \t\t\tpool2 = AveragePooling2D(pool_size=(block_shape[ROW_AXIS], block_shape[COL_AXIS]),\n    \t\t\t\t\t\t\t\t strides=(1, 1))(block)\n    \t\t\tflatten1 = Flatten()(pool2) #num_nodes=512\n    \t\t\tflatten2 = Dropout(0.30)(flatten1)\n    \t\t\tdense = Dense(units=10, kernel_initializer=\"he_normal\",\n    \t\t\t\t\t  activation=\"softmax\")(flatten2)\n    \n    \t\t\tmodel = Model(inputs=input, outputs=dense)\n\n \n    Training codes-\n    \n     \n    \n        &gt; For training-\n        &gt;     train_datagen = ImageDataGenerator(\n        &gt;         rotation_range=90,\n        &gt;         samplewise_center = True,\n        &gt;         rescale=1./255,\n        &gt;         vertical_flip = True,\n        &gt;         horizontal_flip=True,\n        &gt;         fill_mode='nearest')\n        &gt; \n        &gt; test_datagen = ImageDataGenerator(rescale=1./255)  \n        &gt; train_dir_generator = train_datagen.flow_from_directory(\n        &gt;         trainDataFolderPath_patch,# this is the target directory\n        &gt;         target_size=(img_height, img_width),  # all images will be resized to 150x150\n        &gt;         batch_size=batch_size,\n        &gt;         class_mode='categorical') \n        &gt; \n        &gt; valid_dir_generator = test_datagen.flow_from_directory(\n        &gt;         validDataFolderPath_patch,\n        &gt;         target_size=(img_height, img_width),\n        &gt;         batch_size=batch_size_valid,\n        &gt;         class_mode='categorical')\n    \n    &gt;  ''' Compile Model'''\n    &gt;         sgd = optimizers.SGD(lr=0.01, decay=1e-4, momentum=0.9, nesterov=True);#10-3 to 10-4\n    &gt;         final_model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy']);\n    &gt;         ''' Training '''\n    &gt;         cnn = final_model.fit_generator(train_dir_generator,\n    &gt;                            steps_per_epoch= NUMBER_BATCH_PER_EPOC,\n    &gt;                            epochs=NUMBER_EPOC,\n    &gt;                            validation_data = valid_dir_generator,\n    &gt;                            validation_steps = num_patch_to_validate,\n    &gt;                            callbacks=[checkpoint,learningRatecb,tensorBoardcb],\n    &gt;                             verbose=1)\n\nWhile training  Accuracy is improving over epochs- but stagnant to 40% (highest).  Also, validation accuracy is not improving beyond 15%. Looks like model is not learning nay thing. \nAlso, I do follwing this as a part of data normalization-\n      \n\n           \n\n&gt;  patch = np.float32(patch) * scale; #&gt;0-1\n&gt;             patch -= np.mean(patch, keepdims=True)  # sample center use in training\n&gt;             filtered_img_rgb = patch[..., ::-1]; #bgr-&gt;rgb\n\nPlz suggest any possible reason for this behavior of model.",
    "271385": "Have you tried w/o augmentation?",
    "271443": "Not yet.. i have started with default data augmentation once and then added my own augmentation of gamma/jpeg.",
    "273600": "I have used ResNet18, and I got validation accuracy near 90 percent. I suggest to remove any data augmentation (because data augmentation is useful for overfitting not underfitting) and try to overfit your model on a sample dataset containing a tiny fraction of the original dataset. This way, you will be able to find your bugs much easier. Good luck!."
  },
  "source": "meta"
}