Hi. I just finished lesson 1 and 2 from part 1 of fast.ai. Now, I try to use the VGG16 model on plant seedlings classification competition on Kaggle. But I got stuck with 6% on accuracy. It seems like I missed something. Any help is appreciated.
Machine that I use
I use my own laptop with specs: Intel® Core™ i5-6200U CPU @ 2.30GHz, NVIDIA GeForce 930M with 2GB of GPU memory, and 12GB of RAM.
Notebook
My work can be seen here. https://nbviewer.jupyter.org/gist/arisbw/498c69744ec720ca359b0886f9e200d6
Data
I didn’t use all data. First, I took 1000 images that consist of 12 classes from the train set for valid set. After that, I created a sample set of 500 images for the train set and 100 images for the valid set. Here is the number of images from each class in each set.
"""
Train set:
Black-grass : 206
Charlock : 310
Cleavers : 232
Common Chickweed : 490
Common wheat : 177
Fat Hen : 365
Loose Silky-bent : 502
Maize : 164
Scentless Mayweed : 404
Shepherds Purse : 187
Small-flowered Cranesbill : 401
Sugar beet : 312
Valid set:
Black-grass : 57
Charlock : 80
Cleavers : 55
Common Chickweed : 121
Common wheat : 44
Fat Hen : 110
Loose Silky-bent : 152
Maize : 57
Scentless Mayweed : 112
Shepherds Purse : 44
Small-flowered Cranesbill : 95
Sugar beet : 73
"""
"""
From sample set(the following is the data that I use):
Train set:
Black-grass : 21
Charlock : 48
Cleavers : 28
Common Chickweed : 53
Common wheat : 31
Fat Hen : 49
Loose Silky-bent : 66
Maize : 18
Scentless Mayweed : 61
Shepherds Purse : 23
Small-flowered Cranesbill : 57
Sugar beet : 45
Valid set:
Black-grass : 6
Charlock : 12
Cleavers : 3
Common Chickweed : 11
Common wheat : 5
Fat Hen : 10
Loose Silky-bent : 19
Maize : 7
Scentless Mayweed : 11
Shepherds Purse : 3
Small-flowered Cranesbill : 9
Sugar beet : 4
"""
Model
Basically, I followed the model from scripts in fast.ai repo.
def ConvBlock(layers, model, filters):
for i in range(layers):
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(filters, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
def FCBlock(model):
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
vgg_mean = np.array([123.68, 116.779, 103.939]).reshape((3,1,1))
def vgg_preprocess(x):
x = x - vgg_mean
return x[:, ::-1]
def VGG_16():
model = Sequential()
model.add(Lambda(vgg_preprocess, input_shape=(3,224,224)))
ConvBlock(2, model, 64)
ConvBlock(2, model, 128)
ConvBlock(3, model, 256)
ConvBlock(3, model, 512)
ConvBlock(3, model, 512)
model.add(Flatten())
FCBlock(model)
FCBlock(model)
model.add(Dense(1000, activation='softmax'))
return model
Results
This is the first result after I fine-tune the last layer to match my needs. I use 10 epochs and batch size = 4.
Epoch 1/10
500/500 [==============================] - 68s - loss: 15.4570 - acc: 0.0360 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 2/10
500/500 [==============================] - 64s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 3/10
500/500 [==============================] - 65s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 4/10
500/500 [==============================] - 64s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 5/10
500/500 [==============================] - 64s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 6/10
500/500 [==============================] - 64s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 7/10
500/500 [==============================] - 67s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 8/10
500/500 [==============================] - 70s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 9/10
500/500 [==============================] - 64s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 10/10
500/500 [==============================] - 67s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
And this is my result after I train all the dense layers. Still no change.
Epoch 1/10
500/500 [==============================] - 64s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 2/10
500/500 [==============================] - 63s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 3/10
500/500 [==============================] - 63s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 4/10
500/500 [==============================] - 63s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 5/10
500/500 [==============================] - 63s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 6/10
500/500 [==============================] - 64s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 7/10
500/500 [==============================] - 63s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 8/10
500/500 [==============================] - 63s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 9/10
500/500 [==============================] - 63s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600
Epoch 10/10
500/500 [==============================] - 63s - loss: 15.4411 - acc: 0.0420 - val_loss: 15.1510 - val_acc: 0.0600