簡體   English   中英

輸出標簽在vgg16中保持相同的值

[英]Output labels sticking to same value in vgg16

我正在嘗試在svhn數據集上運行VGG16模型進行數字檢測

http://ufldl.stanford.edu/housenumbers/train_32x32.mat

但是,預測值始終相同。 我嘗試使用-

  1. 從0-255縮放到0-1

  2. 從每個圖像中減去平均值

  3. 除以std

這是我的運行方式:

初始化VGG16:

vgg = tf.keras._impl.keras.applications.vgg16.VGG16 
    (include_top=True,
    weights=None,
    input_tensor=None,
    input_shape=(64,64,3),
    pooling='max',
    classes=10)

vgg.compile(loss=tf.keras.losses.categorical_crossentropy,  
optimizer=tf.keras.optimizers.SGD(lr=1e-4, momentum=0.9, nesterov=True),metrics=['mae', 'acc'])
#Here train_data shape is (None,64,64,3) and labels_data shape is (None,10) and are one hot like labels
vgg.fit(train_data, labels_data, epochs=5, batch_size=96)

火車數據可以像這樣讀取和預處理:

train_data = sio.loadmat('datasets/housing/train_32x32.mat')

我正在使用以下兩個函數來預處理train_data:

import numpy as np
import cv2
import tensorflow as tf
import os
import scipy
from skimage import data, io, filters
import scipy.io as sio
from utils import *
import h5py

from tensorflow.python.keras._impl.keras import backend as K
from tensorflow.python.keras._impl.keras.applications.imagenet_utils         import _obtain_input_shape
from tensorflow.python.keras._impl.keras.applications.imagenet_utils import decode_predictions  # pylint: disable=unused-import
from tensorflow.python.keras._impl.keras.applications.imagenet_utils import preprocess_input  # pylint: disable=unused-import
from tensorflow.python.keras._impl.keras.engine.topology import get_source_inputs
from tensorflow.python.keras._impl.keras.layers import Conv2D
from tensorflow.python.keras._impl.keras.layers import Dense
from tensorflow.python.keras._impl.keras.layers import Flatten
from tensorflow.python.keras._impl.keras.layers import GlobalAveragePooling2D
from tensorflow.python.keras._impl.keras.layers import     GlobalMaxPooling2D
from tensorflow.python.keras._impl.keras.layers import Input
from tensorflow.python.keras._impl.keras.layers import MaxPooling2D
from tensorflow.python.keras._impl.keras.models import Model
from tensorflow.python.keras._impl.keras.utils import layer_utils
from tensorflow.python.keras._impl.keras.utils.data_utils import get_file
from tensorflow.python.keras._impl.keras.engine import Layer

def reshape_mat_vgg (QUANTITY,matfilepath='datasets/housing/train_32x32.mat', type="non-quantized", size=(64,64)):
data = read_mat_file (matfilepath)
train = data['X'][:,:,:,0:QUANTITY]
train = np.swapaxes(np.swapaxes(np.swapaxes(train,2,3),1,2),0,1)
labels = data['y'][0:QUANTITY]
labels_data = []; labels_data = np.array(labels_data)
train_data = np.zeros((QUANTITY,size[0],size[1],3))
print "Reorganizing Data..."
for i in range(QUANTITY):
    image_i = np.copy(train[i,:,:,:])
    image_i = preprocess_small_vgg16 (image_i, new_size=size, type=type)
    train_data[i,:,:,:] = image_i
    label_i = np.zeros((10)); label_i[labels[i]-1] = 1.0; label_i = label_i.reshape(1,10)
    if i == 0:
        labels_data = np.vstack(( label_i ))
    else:
        labels_data = np.vstack(( labels_data, label_i ))
    if i % 1000 == 0:
        print i*100/(QUANTITY-1),"percent done..."
print "100 percent done..."
return train_data, labels_data



def preprocess_small_vgg16 (image, new_size=(64,64), type="non-quantized"):    
img = np.copy (image)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#Whitening
imgnorm = img * 255.0/np.max(img)
#Normalisation
gray = imgnorm
borderless  = gray[:,5:gray.shape[1]-5,:] # centering
final_img = (cv2.resize (borderless, new_size))
final_img = final_img/np.max(final_img) #scaling 0-1
stddev = np.std(final_img); mn = np.mean (final_img)
final_img = (final_img - mn) / stddev #standardizing
return final_img

輸出:

Epoch 1/10
5000/5000 [==============================] - 1346s - loss: 3.2877 - 
mean_absolute_error: 0.0029 - acc: 0.1850         
Epoch 2/10

在多個時期運行無濟於事。 我嘗試了5個時代。

當我檢查輸出或預測時,它對所有輸入都顯示相同的結果,例如(使用np.argmax(pred,axis = -1)轉換):

[3 3 3 . . . 3 3 3]

請在我的模型中標記問題。

我認為您的大部分問題是5個紀元不足以使VGG權重收斂。 在VGG的原始論文中,作者說他們訓練了370k次迭代(74個紀元)以獲得最佳結果,因此您可以考慮給它更多的時間進行收斂。

我已經將您的數據集輸入到tensorflow教程網絡中 ,您可以看到經過數千次迭代后總損失如何減少。

total_loss曲線

當然,您可以微調學習速率的衰減,以防止花在高原上的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM