Должны ли векторы предсказания softmax быть близко друг к другу при обучении CNN? - PullRequest
0 голосов
/ 04 февраля 2020

Во время отладки моей домашней CNN я обнаружил, что прогнозы softmax слишком похожи для разных изображений. Я пытался экспериментировать, инициализируя различные типы весов (случайные значения от 0 до 1, Glorot, целые числа и т. Д. c.), Но я получаю похожие векторы softmax, как это.

enter image description here

Вот мой код для прямого распространения:

def forwardprop(image,cache):

    cache['C1']['fmaps'] = []
    for index in range(cache['C1']['filters'].shape[0]):
       cache['C1']['fmaps'].append(signal.correlate(image, cache['C1']['filters'][index], mode='valid'))

    cache['C1']['fmaps'] = np.asarray(cache['C1']['fmaps'])
    cache['C1']['fmaps'] += cache['C1']['bias']
    cache['C1']['maxpool'] = maxpool_run(cache['C1']['fmaps'],(2,2))
    cache['C1']['sigmoid'] = lib.sigmoid(cache['C1']['maxpool'])
    cache['C2']['fmaps'] = []
    for i in range(cache['C2']['filters'].shape[0]):
        fmap = np.sum(signal.correlate(cache['C1']['sigmoid'], cache['C2']['filters'][i].reshape(1,5,5), mode='valid', method='direct'), axis=0)
        cache['C2']['fmaps'].append(fmap)
    cache['C2']['fmaps'] = np.asarray(cache['C2']['fmaps'])
    cache['C2']['fmaps'] += cache['C2']['bias']
    cache['C2']['maxpool'] = maxpool_run(cache['C2']['fmaps'],(2,2))
    cache['C2']['sigmoid'] = lib.sigmoid(cache['C2']['maxpool'])
    flatten = cache['C2']['sigmoid'].flatten().reshape(400,1)
    cache['C3']['fmaps'] = cache['C3']['filters'].dot(flatten) + cache['C3']['bias']
    cache['C3']['sigmoid'] = lib.sigmoid(cache['C3']['fmaps'])
    cache['F6']['fmaps'] = cache['F6']['filters'].dot(cache['C3']['sigmoid']) + cache['F6']['bias']
    cache['F6']['sigmoid'] = lib.sigmoid(cache['F6']['fmaps'])
    cache['F7']['fmaps'] = cache['F7']['filters'].dot(cache['F6']['sigmoid']) + cache['F7']['bias']
    cache['softmax'] = lib.softmax(cache['F7']['fmaps']).T
    return cache

Я также нормализую изображения с помощью этой функции:

def image_normalize(image):
    """
    Normalizes an image so that all pixel values are between 0 and 1
    """
    image = image.astype(np.float64)
    normalized = (image - image.min()) / (image.max() - image.min() )
    return normalized 

А это мои функции maxpool, sigmoid и softmax:

def sigmoid(x):
    def _s(x):
        sigmoid = math.exp(-np.logaddexp(0, -x))
        return sigmoid 
    vectorized = np.vectorize(_s)
    return vectorized(x) 

def softmax (predictions):
    normalized = predictions - np.max(predictions)
    out = np.exp(normalized)
    return out / np.sum(out)
def maxpool(input,sampling_field): 
    rows, cols = input.shape
    # Filter 
    filter_rows, filter_cols = sampling_field
    output_1D = rows // filter_rows
    output_2D = cols // filter_cols
    output = input.reshape(output_1D, filter_rows, output_2D, filter_cols).max(axis=(1,3)).reshape(output_1D, output_2D)
    return output 

Итак, просто для пояснения, мой вопрос, можно ли получить те же или похожие значения Softmax для разные образы? Интуитивно, вы должны получить разные результаты, потому что пиксели разные. Что может быть не так?

...