Во время отладки моей домашней CNN я обнаружил, что прогнозы softmax слишком похожи для разных изображений. Я пытался экспериментировать, инициализируя различные типы весов (случайные значения от 0 до 1, Glorot, целые числа и т. Д. c.), Но я получаю похожие векторы softmax, как это.
Вот мой код для прямого распространения:
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 для разные образы? Интуитивно, вы должны получить разные результаты, потому что пиксели разные. Что может быть не так?