{
  "source_file": "0930",
  "source_platform": "Hashnode",
  "author": "Fadhil Elrizanda",
  "title_listed": "Learning to Build ResNet for Intel Scene Classification from Scratch",
  "keywords": "",
  "domain": "图像处理",
  "content_type": "深度技术解析",
  "is_paid_flag": "否",
  "url": "https://elrizanda.hashnode.dev/learning-to-build-resnet-for-intel-scene-classification-from-scratch",
  "publish_date": "2024-12-24",
  "corpus_stage": "",
  "notes": "",
  "id": "27cf5caec36e",
  "collected_at": "2026-10-02T14:12:12",
  "title": "Learning to Build ResNet for Intel Scene Classification from Scratch",
  "body_markdown": "Learning to Build ResNet for Intel Scene Classification from Scratch\nPublished\nDecember 24, 2024\n•\n8\nmin read\n•\nView as Markdown\nF\nFadhil Elrizanda\nOverview\nThis dataset is scene classification dataset that published by Intel. This dataset also used in previous implementation. Dataset consist of 6 class that consist of difference categories like buildings, forest, glacier, mountain, sea, and street. The dataset have 25,000 images with the size of 150 × 150. This dataset published in kaggle which can be found here.\nlink :\nIntel Image Classification\nIn this article we will try to build ResNet from scratch based on the previous paper about residual network. In this article we will also use wandb to monitor our model performance.\nCode\nThe notebook source can be downloaded in the end of the article. I am using kaggle notebook with 2 x T4 GPU to faster the training. The runtime is up to 3 hours.\nImport Libraries and dependencies\n!pip install --upgrade wandb\nimport\ntensorflow\nas\ntf\nimport\nmatplotlib.pyplot\nas\nplt\nimport\nos\nimport\ndatetime\nfrom\nwandb.integration.keras\nimport\nWandbMetricsLogger\nimport\nwandb\nLogin to Wandb\nwandb.login(key=\n\"#\"\n)\nMake sure to use your account and assign the key.\nEDA and Data Preprocessing\nLoad Dataset\nconfig = {\n\"BATCH_SIZE\"\n:\n32\n,\n\"IMG_SIZE\"\n:\n150\n,\n\"VAL_SPLIT\"\n:\n0.1\n,\n\"EPOCHS\"\n:\n100\n,\n\"PATIENCE\"\n:\n5\n}\n\ntrain_data = tf.keras.preprocessing.image_dataset_from_directory(\n\"/kaggle/input/intel-image-classification/seg_train/seg_train\"\n,\n    labels=\n\"inferred\"\n,\n    label_mode=\n\"categorical\"\n,\n    class_names=class_names,\n    color_mode=\n\"rgb\"\n,\n    batch_size=config[\n\"BATCH_SIZE\"\n],\n    image_size=(config[\n\"IMG_SIZE\"\n],config[\n\"IMG_SIZE\"\n]),\n    shuffle=\nTrue\n,\n    seed=\n32\n,\n    validation_split=config[\n\"VAL_SPLIT\"\n],\n    subset=\n\"training\"\n,\n    interpolation=\n\"bilinear\"\n,\n    verbose=\nTrue\n)\n\nvalid_data = tf.keras.preprocessing.image_dataset_from_directory(\n\"/kaggle/input/intel-image-classification/seg_train/seg_train\"\n,\n    labels=\n\"inferred\"\n,\n    label_mode=\n\"categorical\"\n,\n    class_names=class_names,\n    color_mode=\n\"rgb\"\n,\n    batch_size=config[\n\"BATCH_SIZE\"\n],\n    image_size=(config[\n\"IMG_SIZE\"\n],config[\n\"IMG_SIZE\"\n]),\n    seed=\n32\n,\n    validation_split=config[\n\"VAL_SPLIT\"\n],\n    subset=\n\"validation\"\n,\n    interpolation=\n\"bilinear\"\n,\n    verbose=\nTrue\n)\n\ntest_data = tf.keras.preprocessing.image_dataset_from_directory(\n\"/kaggle/input/intel-image-classification/seg_test/seg_test\"\n,\n    labels=\n'inferred'\n,\n    label_mode=\n'categorical'\n,\n    class_names=class_names,\n    color_mode=\n'rgb'\n,\n    batch_size=config[\n\"BATCH_SIZE\"\n],\n    image_size=(config[\n\"IMG_SIZE\"\n],config[\n\"IMG_SIZE\"\n]),\n    interpolation=\n'bilinear'\n,\n    verbose=\nTrue\n)\nIn this practice we use tensorflow and load it using image_dataset_from_directory to convert the data to tf.data pipeline which is more optimized pipeline.\nVisualize Data Distribution\nIn order to gain more information about the data, we need to visualize the distribution of each class on the dataset to check whether is imbalance or not.\ndef\nget_data_distribution\n(\ndataset=[]\n):\nlabels = []\nfor\ndata\nin\ndataset:\nfor\n_,label\nin\ndata:\n      labels.extend(tf.argmax(label,axis=\n1\n).numpy())\n  y, idx, count = tf.unique_with_counts(labels)\nreturn\ny, count\ndef\nvisualize_data\n(\nclass_data,count\n):\nplt.figure(figsize=(\n10\n,\n10\n))\n  plt.bar(class_data,count,align=\n\"center\"\n)\n  plt.tight_layout()\n  plt.title(\n\"Class Distribution\"\n)\n  plt.ylabel(\n\"Number of Data\"\n)\n  plt.xlabel(\n\"Class in number\"\n)\n  plt.show()\n\nclass_data, counts = get_data_distribution([train_data,valid_data,test_data])\nvisualize_data([class_names[cd]\nfor\ncd\nin\nclass_data],counts.numpy())\nFrom the distribution we can see that the distribution is balanced.\nVisualize Sample Image\nTo check the dataset we can visualize it with matplotlib\nplt.figure(figsize=(\n10\n,\n10\n))\nfor\nimg,label\nin\ntrain_data.take(\n1\n):\nfor\ni\nin\nrange(\n16\n):\n    ax = plt.subplot(\n4\n,\n4\n,i+\n1\n)\n    plt.imshow(img[i].numpy().astype(\n\"uint8\"\n))\n    plt.title(\nf\"Label :\n{class_names[tf.argmax(label[i])]}\n\"\n)\n    plt.axis(\nFalse\n)\nplt.tight_layout()\nplt.show()\nFrom the scene we can understand what the label and the scene images.\nData Augmentation\nTo make the more variation of the data we can use several method to augmentation data on the training dataset.\na. Flip Vertical\ndef\nimg_flip_vertical\n(\nimg\n):\nreturn\ntf.image.flip_left_right(img)\n\n\ntest_flip = (train_data.map(\nlambda\nimg, label: img_flip_vertical(img)))\nplt.figure(figsize=(\n6\n,\n6\n))\nfor\nimg\nin\ntest_flip.take(\n1\n):\nfor\nnum\nin\nrange(\n16\n):\n        ax = plt.subplot(\n4\n,\n4\n,num+\n1\n)\n        plt.imshow((img[num].numpy()).astype(\n\"uint8\"\n))\n        plt.axis(\n\"off\"\n)  \nplt.suptitle(\n\"Flip Augmentation\"\n)\nplt.tight_layout()\nplt.show()\nb. Random constrast\ndef\nimg_random_contrast\n(\nimg\n):\nreturn\ntf.image.random_contrast(img,\n0.95\n,\n1\n)\n\ntest_random_contrast = (train_data.map(\nlambda\nimg, label: img_random_contrast(img)))\nfor\nimg\nin\ntest_random_contrast.take(\n1\n):\nfor\nnum\nin\nrange(\n16\n):\n        ax = plt.subplot(\n4\n,\n4\n,num+\n1\n)\n        plt.imshow((img[num].numpy()).astype(\n\"uint8\"\n))\n        plt.axis(\n\"off\"\n)  \nplt.suptitle(\n\"Random Contrast\"\n)\nplt.tight_layout()\nplt.show()\nc. Random Brightness\ndef\nimg_random_brightness\n(\nimg\n):\nreturn\ntf.image.random_brightness(img,\n.2\n)\n\ntest_random_brightness = (train_data.map(\nlambda\nimg, label: img_random_brightness(img)))\nplt.figure(figsize=(\n6\n,\n6\n))\nfor\nimg\nin\ntest_random_brightness.take(\n1\n):\nfor\nnum\nin\nrange(\n16\n):\n        ax = plt.subplot(\n4\n,\n4\n,num+\n1\n)\n        plt.imshow((img[num].numpy()).astype(\n\"uint8\"\n))\n        plt.axis(\n\"off\"\n)  \nplt.suptitle(\n\"Random Brightness\"\n)\nplt.tight_layout()\nplt.show()\nd. Random Hue\ndef\nrandom_hue\n(\nimg\n):\nreturn\ntf.image.random_hue(img,\n0.05\n)\n\ntest_random_hue = (train_data.map(\nlambda\nimg, label: random_hue(img)))\nplt.figure(figsize=(\n6\n,\n6\n))\nfor\nimg\nin\ntest_random_hue.take(\n1\n):\nfor\nnum\nin\nrange(\n16\n):\n        ax = plt.subplot(\n4\n,\n4\n,num+\n1\n)\n        plt.imshow((img[num].numpy()).astype(\n\"uint8\"\n))\n        plt.axis(\n\"off\"\n)  \nplt.suptitle(\n\"Random Hue\"\n)\nplt.tight_layout()\nplt.show()\nd. Implementing the augmentation and normalization on each dataset\ndef\nimage_augmentation\n(\nimg,label\n):\nimg,label = normalize_img(img,label)\n  img = img_flip_vertical(img)\n  img = img_random_contrast(img)\n  img = img_random_brightness(img)\n  img = random_hue(img)\nreturn\nimg,label\ndef\nnormalize_img\n(\nimg,label\n):\nimg = tf.cast(img,tf.float32)/\n255.0\nreturn\nimg,label\ntrain_dataset = (\n    train_data\n    .map(\nlambda\nimg, label: image_augmentation(img, label), num_parallel_calls=tf.data.AUTOTUNE)  \n    .cache()\n    .prefetch(buffer_size=tf.data.AUTOTUNE) \n)\n\nvalid_dataset = (\n    valid_data\n    .map(\nlambda\nimg, label: normalize_img(img, label), num_parallel_calls=tf.data.AUTOTUNE)  \n    .cache()  \n    .prefetch(buffer_size=tf.data.AUTOTUNE)  \n)\n# Optimization for test_data\ntest_dataset = (\n    test_data\n    .map(\nlambda\nimg, label: normalize_img(img, label), num_parallel_calls=tf.data.AUTOTUNE) \n    .prefetch(buffer_size=tf.data.AUTOTUNE) \n)\ne. Check the augmented training dataset\nplt.figure(figsize=(\n12\n,\n12\n))\nfor\nimg, label\nin\ntrain_dataset.take(\n1\n):\nfor\nnum\nin\nrange(\n16\n): \n        ax = plt.subplot(\n4\n,\n4\n, num +\n1\n)        \n        img_to_display = (img[num].numpy() *\n255\n).clip(\n0\n,\n255\n).astype(\n\"uint8\"\n)\n        plt.imshow(img_to_display)\n        plt.axis(\n\"off\"\n)  \nplt.suptitle(\n\"Augmented Dataset\"\n)\nplt.tight_layout()\nplt.show()\nfrom the augmentation we can see that the image doesn’t change too much but we have difference kind of the images. We need to check the augmented data is difference from the training or not.\nBuilding Model ResNet\nIn the resnet there are two type of the block which is residual block and bottleneck block. This is difference strategy and can be used in difference scenarios. Check the previous post to know the difference of these block. In this article we will try to build 5 different resNet models.\nResidual Block\nclass\nResidualBlock\n(\ntf.keras.layers.Layer\n):\ndef\n__init__\n(\nself, filters, kernel_size=\n3\n, strides=\n1\n, downsample=False\n):\nsuper(ResidualBlock, self).__init__()\n        self.downsample = downsample\n        self.conv1 = tf.keras.layers.Conv2D(filters, kernel_size, strides=strides, padding=\n\"same\"\n,kernel_regularizer=tf.keras.regularizers.L2(\n0.001\n))\n        self.bn1 = tf.keras.layers.BatchNormalization()\n        self.relu = tf.keras.layers.ReLU()\n        self.conv2 = tf.keras.layers.Conv2D(filters, kernel_size, strides=\n1\n, padding=\n\"same\"\n,kernel_regularizer=tf.keras.regularizers.L2(\n0.001\n))\n        self.bn2 = tf.keras.layers.BatchNormalization()\nif\ndownsample:\n            self.downsample_conv = tf.keras.layers.Conv2D(filters,\n1\n, strides=strides,kernel_regularizer=tf.keras.regularizers.L2(\n0.001\n))\n            self.downsample_bn = tf.keras.layers.BatchNormalization()\ndef\ncall\n(\nself, inputs, training=False\n):\nresidual = inputs\n        x = self.conv1(inputs)\n        x = self.bn1(x, training=training)\n        x = self.relu(x)\n        x = self.conv2(x)\n        x = self.bn2(x, training=training)\nif\nself.downsample:\n            residual = self.downsample_conv(inputs)\n            residual = self.downsample_bn(residual, training=training)\n        x += residual\nreturn\nself.relu(x)\nThis block is used in shallower network in resnet architecture. This block will have more parameters rather than bottleneck block.\nBottleneck Block\nclass\nBottleneckBlock\n(\ntf.keras.layers.Layer\n):\ndef\n__init__\n(\nself, filters, strides=\n1\n, downsample=False\n):\nsuper(BottleneckBlock, self).__init__()\n        self.downsample = downsample\n        self.conv1 = tf.keras.layers.Conv2D(filters //\n2\n,\n1\n, strides=\n1\n, padding=\n\"same\"\n,kernel_regularizer=tf.keras.regularizers.L2(\n0.001\n))\n        self.bn1 = tf.keras.layers.BatchNormalization()\n        self.conv2 = tf.keras.layers.Conv2D(filters //\n2\n,\n3\n, strides=strides, padding=\n\"same\"\n,kernel_regularizer=tf.keras.regularizers.L2(\n0.001\n))\n        self.bn2 = tf.keras.layers.BatchNormalization()\n        self.conv3 = tf.keras.layers.Conv2D(filters,\n1\n, strides=\n1\n, padding=\n\"same\"\n,kernel_regularizer=tf.keras.regularizers.L2(\n0.001\n))\n        self.bn3 = tf.keras.layers.BatchNormalization()\n        self.relu = tf.keras.layers.ReLU()\nif\ndownsample:\n            self.downsample_conv = tf.keras.layers.Conv2D(filters,\n1\n, strides=strides,kernel_regularizer=tf.keras.regularizers.L2(\n0.001\n))\n            self.downsample_bn = tf.keras.layers.BatchNormalization()\ndef\ncall\n(\nself, inputs, training=False\n):\nresidual = inputs\n        x = self.conv1(inputs)\n        x = self.bn1(x, training=training)\n        x = self.relu(x)\n\n        x = self.conv2(x)\n        x = self.bn2(x, training=training)\n        x = self.relu(x)\n\n        x = self.conv3(x)\n        x = self.bn3(x, training=training)\nif\nself.downsample:\n            residual = self.downsample_conv(inputs)\n            residual = self.downsample_bn(residual, training=training)\n\n        x += residual\nreturn\nself.relu(x)\nThis block is used for deeper network in resnet. This network enable us to make deeper network with fewer parameters.\nResNet\nclass\nResNet\n(\ntf.keras.Model\n):\ndef\n__init__\n(\nself, num_classes, block_counts,blocktype, initial_filters=\n64\n):\nsuper(ResNet, self).__init__()\n        self.conv1 = tf.keras.layers.Conv2D(initial_filters,\n7\n, strides=\n2\n, padding=\n\"same\"\n,kernel_regularizer=tf.keras.regularizers.L2(\n0.001\n))\n        self.bn1 = tf.keras.layers.BatchNormalization()\n        self.relu = tf.keras.layers.ReLU()\n        self.pool = tf.keras.layers.MaxPooling2D(pool_size=\n3\n, strides=\n2\n, padding=\n\"same\"\n)\n# Replace list with Sequential for residual blocks\nself.residual_blocks = tf.keras.Sequential(name=\n\"residual_blocks\"\n)\n        filters = initial_filters\nfor\ni, count\nin\nenumerate(block_counts):\nfor\nj\nin\nrange(count):\n                strides =\n2\nif\nj ==\n0\nand\ni >\n0\nelse\n1\n# Downsample at the start of a new stage\nself.residual_blocks.add(\n                    blocktype(filters, strides=strides, downsample=(strides ==\n2\n))\n                )\n            filters *=\n2\nself.global_pool = tf.keras.layers.GlobalAveragePooling2D()\n        self.dropout = tf.keras.layers.Dropout(\n0.3\n)\n        self.fc = tf.keras.layers.Dense(num_classes, activation=\n\"softmax\"\n)\ndef\ncall\n(\nself, inputs, training=False\n):\nx = self.conv1(inputs)\n        x = self.bn1(x, training=training)\n        x = self.relu(x)\n        x = self.pool(x)\n        x = self.residual_blocks(x, training=training)\n# Pass through all residual blocks\nx = self.global_pool(x)\n        x = self.dropout(x,training=training)\nreturn\nself.fc(x)\nWe build the resnet using sub class api to have more flexibility over the models.\nResNet 18\ndef\nbuild_resnet18\n(\nnum_classes, input_shape=(\n150\n,\n150\n,\n3\n)\n):\nreturn\nResNet(\n        num_classes=num_classes,\n        block_counts=[\n2\n,\n2\n,\n2\n,\n2\n],\n# From the table for ResNet-18\nblocktype=ResidualBlock,\n# Use basic blocks\ninitial_filters=\n64\n,\n    )\n\nresnet18 = build_resnet18(num_classes=\n6\n)\ndummy_input = tf.keras.Input(shape=(\n150\n,\n150\n,\n3\n))\nresnet18(dummy_input)\n# Build the model\nresnet18.summary()\nResNet 34\ndef\nbuild_resnet34\n(\nnum_classes, input_shape=(\n150\n,\n150\n,\n3\n)\n):\nreturn\nResNet(\n        num_classes=num_classes,\n        block_counts=[\n3\n,\n4\n,\n6\n,\n3\n],\n# From the table for ResNet-18\nblocktype=ResidualBlock,\n# Use basic blocks\ninitial_filters=\n64\n,\n    )\n\nresnet34 = build_resnet34(num_classes=len(class_names))\ndummy_input = tf.keras.Input(shape=(\n150\n,\n150\n,\n3\n))\nresnet34(dummy_input)\n# Build the model\nresnet34.summary()\nResNet 50\ndef\nbuild_resnet50\n(\nnum_classes, input_shape=(\n150\n,\n150\n,\n3\n)\n):\nreturn\nResNet(\n        num_classes=num_classes,\n        block_counts=[\n3\n,\n4\n,\n6\n,\n3\n],\n# From the table for ResNet-152\nblocktype=BottleneckBlock,\n# Use bottleneck blocks\ninitial_filters=\n64\n,\n    )\n\n\nresnet50 = build_resnet50(num_classes=len(class_names))\ndummy_input = tf.keras.Input(shape=(\n150\n,\n150\n,\n3\n))\nresnet50(dummy_input)\n# Build the model\nresnet50.summary()\nResNet 152\ndef\nbuild_resnet101\n(\nnum_classes, input_shape=(\n150\n,\n150\n,\n3\n)\n):\nreturn\nResNet(\n        num_classes=num_classes,\n        block_counts=[\n3\n,\n4\n,\n23\n,\n3\n],\n# From the table for ResNet-152\nblocktype=BottleneckBlock,\n# Use bottleneck blocks\ninitial_filters=\n64\n,\n    )\n\n\nresnet101 = build_resnet101(num_classes=len(class_names))\ndummy_input = tf.keras.Input(shape=(\n150\n,\n150\n,\n3\n))\nresnet101(dummy_input)\n# Build the model\nresnet101.summary()\nFrom the code we can see that we build 5 different resnet model which are introduced in the paper. we will try to training from scratch based on the intel scene image dataset.\nTraining the Model\nconfig = {\n\"BATCH_SIZE\"\n:\n32\n,\n\"IMG_SIZE\"\n:\n150\n,\n\"VAL_SPLIT\"\n:\n0.1\n,\n\"EPOCHS\"\n:\n100\n,\n\"PATIENCE\"\n:\n3\n,\n\"lr\"\n:\n0.0001\n}\ndef\ntrain_model\n(\nbuild_model,model_type\n):\nwandb.init(\n        project=\n\"resnet-comparison\"\n,\n        group=\n\"ResNet Variants\"\n,\n        name=\nf\"ResNet-\n{model_type}\n\"\n,\n# Example: ResNet-18, ResNet-50, etc.\nconfig=config\n    )\n    strategy = tf.distribute.MirroredStrategy()\n    early_stopping_cb = tf.keras.callbacks.EarlyStopping(patience=config[\n\"PATIENCE\"\n])\n    wandb_callback = wandb.keras.WandbCallback(save_model=\nFalse\n)\nwith\nstrategy.scope():\n        model = build_model(num_classes=len(class_names))\n        model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=config[\n\"lr\"\n]),\n                        loss=tf.keras.losses.CategoricalCrossentropy(),\n                        metrics=[\n\"accuracy\"\n])\n        history = model.fit(\n            train_dataset,\n            epochs=config[\n\"EPOCHS\"\n],\n            validation_data=valid_dataset,\n            callbacks=[early_stopping_cb,wandb_callback]\n        )\n\n    test_loss, test_acc = model.evaluate(test_dataset)\n    wandb.log({\n\"test loss\"\n: test_loss,\n\"test Accuracy\"\n: test_acc\n})\n\n    wandb.finish()\nLIST_MODEL = {\n\"resnet18\"\n: build_resnet18,\n\"resnet34\"\n: build_resnet34,\n\"resnet50\"\n: build_resnet50,\n\"resnet101\"\n: build_resnet101,\n\"resnet152\"\n: build_resnet152,\n}\n# Train all models\nfor\nmodel_type, model\nin\nLIST_MODEL.items():\n    train_model(model, model_type)\nIn this code we use distributed mirrored strategy to utilize 2 x T4 GPUS to faster the training. The model logs will be showed in wandb. This training may take several hours (up to 3)\nEvaluation Wandb\nFrom the evaluation we can see that the ResNet models are easily overfit on the training data. Which is represent by comparing accuracy and val accuracy. This may happen because the model is trained from the scratch which is need more data. we can try to transfler learning to optimize the models.\nSummary\nThis article demonstrates the implementation of ResNet Architecture from scratch on intel scene dataset. This demonstrate the challenge of training deep network without pretrained weights. The models are likely become overfitting and the val accuracy only reach about 0.70 accuracy. We can improved in by regularization, increasing data, augmentation or transfer learning.\nSource Code :\nhttps://github.com/fadhilelrizanda/intel-scene-resnet-scratch\n#\nmachine-learning\n#\nartificial-intelligence\n#\ncomputer-vision\n#\ncnn\n#\npython\n#\ntensorflow",
  "metadata": {
    "title": "Learning to Build ResNet for Intel Scene Classification from Scratch",
    "description": "Overview\nThis dataset is scene classification dataset that published by Intel. This dataset also used in previous implementation. Dataset consist of 6 class that consist of difference categories like buildings, forest, glacier, mountain, sea, and str...",
    "keywords": null,
    "author": null,
    "og:title": "Learning to Build ResNet for Intel Scene Classification from Scratch",
    "og:description": "Overview\nThis dataset is scene classification dataset that published by Intel. This dataset also used in previous implementation. Dataset consist of 6 class that consist of difference categories like buildings, forest, glacier, mountain, sea, and str...",
    "og:url": "https://elrizanda.hashnode.dev/learning-to-build-resnet-for-intel-scene-classification-from-scratch",
    "og:site_name": "elrizanda",
    "og:image": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735039506547/4be7178b-d52b-47f8-8e67-71600289a392.png",
    "og:image:width": "1200",
    "og:image:height": "630",
    "og:type": "article",
    "twitter:card": "summary_large_image",
    "twitter:title": "Learning to Build ResNet for Intel Scene Classification from Scratch",
    "twitter:description": "Overview\nThis dataset is scene classification dataset that published by Intel. This dataset also used in previous implementation. Dataset consist of 6 class that consist of difference categories like buildings, forest, glacier, mountain, sea, and str...",
    "twitter:image": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735039506547/4be7178b-d52b-47f8-8e67-71600289a392.png",
    "article:published_time": "2024-12-24T11:26:00.672Z",
    "article:author": "https://elrizanda.hashnode.dev/@fadhilelrizanda"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/27cf5caec36e/code/body-000.txt",
      "chars": 179,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-001.txt",
      "chars": 21,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-002.txt",
      "chars": 1427,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-003.txt",
      "chars": 614,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-004.txt",
      "chars": 274,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-005.txt",
      "chars": 406,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-006.txt",
      "chars": 413,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-007.txt",
      "chars": 445,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-008.txt",
      "chars": 397,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-009.txt",
      "chars": 304,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-010.txt",
      "chars": 584,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-011.txt",
      "chars": 349,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-012.txt",
      "chars": 1326,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-013.txt",
      "chars": 1592,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-014.txt",
      "chars": 1558,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-015.txt",
      "chars": 418,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-016.txt",
      "chars": 433,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-017.txt",
      "chars": 442,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-018.txt",
      "chars": 448,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-019.txt",
      "chars": 1204,
      "language": "text"
    },
    {
      "file": "attachments/27cf5caec36e/code/body-020.txt",
      "chars": 281,
      "language": "text"
    }
  ],
  "images": [
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735039506547/4be7178b-d52b-47f8-8e67-71600289a392.png",
      "bytes": 69285,
      "reused": true,
      "local_path": "attachments/27cf5caec36e/images/000.png",
      "src": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735039506547/4be7178b-d52b-47f8-8e67-71600289a392.png",
      "alt": "Learning to Build ResNet for Intel Scene Classification from Scratch",
      "downloaded": true
    },
    {
      "status": "http_403",
      "url": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___14_0.png",
      "src": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___14_0.png",
      "alt": "",
      "downloaded": false,
      "retried_at": "2026-10-20T18:10:56Z"
    },
    {
      "status": "http_403",
      "url": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___17_0.png",
      "src": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___17_0.png",
      "alt": "",
      "downloaded": false,
      "retried_at": "2026-10-20T18:10:56Z"
    },
    {
      "status": "http_403",
      "url": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___20_0.png",
      "src": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___20_0.png",
      "alt": "",
      "downloaded": false,
      "retried_at": "2026-10-20T18:10:56Z"
    },
    {
      "status": "http_403",
      "url": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___22_0.png",
      "src": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___22_0.png",
      "alt": "",
      "downloaded": false,
      "retried_at": "2026-10-20T18:10:56Z"
    },
    {
      "status": "http_403",
      "url": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___24_0.png",
      "src": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___24_0.png",
      "alt": "",
      "downloaded": false,
      "retried_at": "2026-10-20T18:10:57Z"
    },
    {
      "status": "http_403",
      "url": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___26_0.png",
      "src": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___26_0.png",
      "alt": "",
      "downloaded": false,
      "retried_at": "2026-10-20T18:10:57Z"
    },
    {
      "status": "http_403",
      "url": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___29_0.png",
      "src": "https://www.kaggleusercontent.com/kf/214555894/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.._xnYciYhiewXjLrseTXxrQ.4wdZdF_7bWzE4NHCm0sRtKlxyhqSwfyBEpxc8qp4XepZM-iUHiVmh65-Ylcog_uYt5ChTG1aX-YeH06WebUU8mn5_kc4qw4qGc97pyOtQtj9hhvL_tnEcxYNN7dttVVVkB7QOwBAyfntcCOp1nSkS_WZn5cudpuMpJkHnVdUlagClDGocOkQqfvLWn1OEn4SfHQ5tAolRmaWj6as1kXWHlYXgQis3YCuLpezpIxdYre16XuuW_3qZHLgFTxH030DG0C9I1S1LhQ9qlQXiBVc_HIGStHiDroKcx0nH5r6NqfBneCya7BA0MnAnv79PYNF2qi_HMKp6dAIMTJBJqX0XQhagHs-D59zE6g3s4OZUeuZGr5tiGM2x0RZ7q0ZwGyV6fuYYZIOsr75-nyGQac0CZOel6iAGSxzB6_5C0SBwJqSro_XmAwV1qwhkDlwRNhU_7NDS9L-uzUe6nPeqfmaooMnu4nVMU-5ae2tFIJk0LU7-WMzRdHu3LS_Z9NJR70TMXGoB37dXQA4qd8ufIQiM0h4zP--CSQxyb_OsCTjqw7A3zheWGliYmd0peqSd0IhFMZwk8j79xxO49a5BZN4y-ILk7GIg67JUnaDJT1pH6FPmgKnoST2GhVjJtzLmh0EGvpOl9QCeNvqWluSCgoNO7ejrdc8WZtWL5xxVBWIWvE.kIUGVajusvkEYj343TT6IA/__results___files/__results___29_0.png",
      "alt": "",
      "downloaded": false,
      "retried_at": "2026-10-20T18:10:57Z"
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038483467/1763ddb7-c08a-4d3b-8061-8010483b7dda.png",
      "bytes": 21445,
      "reused": true,
      "local_path": "attachments/27cf5caec36e/images/002.png",
      "src": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038483467/1763ddb7-c08a-4d3b-8061-8010483b7dda.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038511447/32982581-cbff-408e-b00a-17c990031651.png",
      "bytes": 22394,
      "reused": true,
      "local_path": "attachments/27cf5caec36e/images/003.png",
      "src": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038511447/32982581-cbff-408e-b00a-17c990031651.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038533016/68a53e67-523d-4d25-9f4c-6cbde4738df5.png",
      "bytes": 22625,
      "reused": true,
      "local_path": "attachments/27cf5caec36e/images/004.png",
      "src": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038533016/68a53e67-523d-4d25-9f4c-6cbde4738df5.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038558074/d1762ef0-03f8-4fca-a97b-1b5c2bfd90e1.png",
      "bytes": 22862,
      "reused": true,
      "local_path": "attachments/27cf5caec36e/images/005.png",
      "src": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038558074/d1762ef0-03f8-4fca-a97b-1b5c2bfd90e1.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038755948/dfbe385e-14ea-4ece-b610-d8e124c86515.png",
      "bytes": 69285,
      "reused": true,
      "local_path": "attachments/27cf5caec36e/images/006.png",
      "src": "https://cdn.hashnode.com/res/hashnode/image/upload/v1735038755948/dfbe385e-14ea-4ece-b610-d8e124c86515.png",
      "alt": "",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://elrizanda.hashnode.dev/learning-to-build-resnet-for-intel-scene-classification-from-scratch.md",
      "label": "View as Markdown",
      "type": "a"
    },
    {
      "href": "https://hashnode.com/@fadhilelrizanda",
      "label": "F",
      "type": "a"
    },
    {
      "href": "https://www.linkedin.com/in/fadhil-elrizanda/",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://www.kaggle.com/datasets/puneet6060/intel-image-classification/data",
      "label": "Intel Image Classification",
      "type": "a"
    },
    {
      "href": "https://github.com/fadhilelrizanda/intel-scene-resnet-scratch",
      "label": "https://github.com/fadhilelrizanda/intel-scene-resnet-scratch",
      "type": "a"
    },
    {
      "href": "https://elrizanda.hashnode.dev/tag/machine-learning",
      "label": "# machine-learning",
      "type": "a"
    },
    {
      "href": "https://elrizanda.hashnode.dev/tag/artificial-intelligence",
      "label": "# artificial-intelligence",
      "type": "a"
    },
    {
      "href": "https://elrizanda.hashnode.dev/tag/computer-vision",
      "label": "# computer-vision",
      "type": "a"
    },
    {
      "href": "https://elrizanda.hashnode.dev/tag/cnn",
      "label": "# cnn",
      "type": "a"
    },
    {
      "href": "https://elrizanda.hashnode.dev/tag/python",
      "label": "# python",
      "type": "a"
    },
    {
      "href": "https://elrizanda.hashnode.dev/tag/tensorflow",
      "label": "# tensorflow",
      "type": "a"
    }
  ],
  "retry_at": "2026-10-03T08:09:42",
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:51:00Z",
  "source_url": "https://elrizanda.hashnode.dev/learning-to-build-resnet-for-intel-scene-classification-from-scratch",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 17164,
  "expected_body_images": 13,
  "discovery_status": "ok",
  "delivery_status": "partial",
  "missing_reason": "http_403",
  "raw_html": "attachments/27cf5caec36e/pages/source.html",
  "local_html": "attachments/27cf5caec36e/pages/article.html",
  "body_base_path": "attachments/27cf5caec36e/pages/",
  "body_markdown_path": "attachments/27cf5caec36e/pages/article.md"
}