简体   繁体   中英

Validation Accuracy stuck at .5073

I am trying to create a regression model but my validation accuracy stays at .5073 . I am trying to train on images and have the network find the position of an object and the rough area it covers. I increased the unfrozen layers and the plateau for accuracy dropped to .4927 . I would appreciate any help finding out what I am doing wrong.

base = MobileNet(weights='imagenet', include_top=False, input_shape=(200,200,3), dropout=.3)
location = base.output
location = GlobalAveragePooling2D()(location)
location = Dense(16, activation='relu', name="locdense1")(location)
location = Dense(32, activation='relu', name="locdense2")(location)
location = Dense(64, activation='relu', name="locdense3")(location)
finallocation = Dense(3, activation='sigmoid', name="finalLocation")(location)

model = Model(inputs=base_model.input,outputs=finallocation)#[types, finallocation])
for layer in model.layers[:91]: #freeze up to 87
    if ('loc' or 'Loc') in layer.name:
        layer.trainable=True
    else: layer.trainable=False

optimizer = Adam(learning_rate=.001)
model.compile(optimizer=optimizer, loss='mean_squared_error', metrics=['accuracy'])
history = model.fit(get_batches(type='Train'), validation_data=get_batches(type='Validation'), validation_steps=500, steps_per_epoch=1000, epochs=10)

Data is generated from a tfrecord file which has image data and some labels. This is the last bit of that generator.

IMG_SIZE = 200
def format_position(image, positionx, positiony, width):
    image = tf.cast(image, tf.float32)
    image = (image/127.5) - 1
    image = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))
    labels = tf.stack([positionx, positiony, width])
    return image, labels

Get batches: dataset is loaded from two directories with tfrecord files, one for training, and other for validation

def get_batches(type):
    dataset = load_dataset(type=type)
    if type == 'Train':
        databatch = dataset.repeat()
    databatch = dataset.batch(32)
    databatch = databatch.prefetch(2)
    return databatch

```positionx positiony width``` are all normalized from 0-1 (relative position with respect to the image.
Here is an example output:

Epoch 1/10 1000/1000 [==============================] - 233s 233ms/step - loss: 0.0267 - accuracy: 0.5833 - val_loss: 0.0330 - val_accuracy: 0.5073 Epoch 2/10 1000/1000 [==============================] - 283s 283ms/step - loss: 0.0248 - accuracy: 0.6168 - val_loss: 0.0337 - val_accuracy: 0.5073 Epoch 3/10 1000/1000 [==============================] - 221s 221ms/step - loss: 0.0238 - accuracy: 0.6309 - val_loss: 0.0312 - val_accuracy: 0.5073

  1. The final activation function in your model should not be sigmoid since it will output numbers between 0 and 1 and I am assuming your labels (ie, positionx , positiony , and width are not in this range). You could replace it with either 'linear' or 'relu' .
  2. You're doing regression, and your loss function is 'mean_squared_error' . You cannot use accuracy as the metric function. You should use 'mae' (mean absolute error) or 'mse' to check the difference between your predictions and actual target values.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM