Функция Relu, вернуть 0 и большие числа - PullRequest
0 голосов
/ 29 апреля 2018

Привет, я новичок в нейронных сетях с тензорным потоком. Я взял небольшую часть набора данных space365. Я хочу создать нейронную сеть для классификации между 10 местами.

Для этого я попытался сделать небольшую копию сети vgg. У меня проблема в том, что на выходе функции softmax я получаю массив с горячим кодированием. Ища проблемы в моем коде, я понял, что выходные данные функций relu либо 0, либо большое число (около 10000).

Я не знаю, где я не прав. Вот мой код:

def variables(shape):
    return tf.Variable(2*tf.random_uniform(shape,seed=1)-1)

def layerConv(x,filter):
    return tf.nn.conv2d(x,filter, strides=[1, 1, 1, 1], padding='SAME') 
def maxpool(x):
    return tf.nn.max_pool(x,[1,2,2,1],[1,2,2,1],padding='SAME')

weights0 = variables([3,3,1,16])

l0 = tf.nn.relu(layerConv(input,weights0))
l0 = maxpool(l0)

weights1 = variables([3,3,16,32])
l1 = tf.nn.relu(layerConv(l0,weights1))
l1 = maxpool(l1)

weights2 = variables([3,3,32,64])
l2 = tf.nn.relu(layerConv(l1,weights2))
l2 = maxpool(l2)

l3 = tf.reshape(l2,[-1,64*32*32])

syn0 = variables([64*32*32,1024])
bias0 =  variables([1024])
l4 = tf.nn.relu(tf.matmul(l3,syn0) + bias0)
l4 = tf.layers.dropout(inputs=l4, rate=0.4)

syn1 = variables([1024,10])
bias1 = variables([10])
output_pred = tf.nn.softmax(tf.matmul(l4,syn1) + bias1)

error = tf.square(tf.subtract(output_pred,output),name='error')
loss = tf.reduce_sum(error, name='cost')

#TRAINING

optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train = optimizer.minimize(loss)

Ввод нейронной сети представляет собой нормализованное изображение в градациях серого размером 256 * 256 пикселей. Скорость обучения равна 0,1, а размер пакета - 32.

Заранее спасибо !!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Ваша проблема - инициализация вашего веса. NN - очень сложные невыпуклые задачи оптимизации. Поэтому хороший инициат имеет первостепенное значение для получения хороших результатов. Если вы используете ReLU, вы должны использовать инициализацию, предложенную He et al. (https://www.cv -foundation.org / OpenAccess / content_iccv_2015 / документы / He_Delving_Deep_into_ICCV_2015_paper.pdf? SPM = 5176.100239.blogcont55892.28.pm8zm1 и файл = He_Delving_Deep_into_ICCV_2015_paper.pdf ).

В сущности инициализация вашей сети должна быть инициализирована распределенными значениями iid gaussian со средним 0 и стандартным отклонением следующим образом:

stddev = sqrt(2 / Nr_input_neurons)
0 голосов
/ 29 апреля 2018

По сути, что такое reLu:

def relu(vector):
    vector[vector < 0] = 0
    return vector

и softmax:

def softmax(x):
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum(axis=0)

Вывод softmax, представляющего собой массив с горячим кодированием, означает, что существует проблема, и это может быть много.

Вы можете попробовать уменьшить стоимость обучения для начинающих, вы можете использовать 1e-4 / 1e-3 и проверить. Если это не работает, попробуйте добавить регуляризацию. Я также скептически отношусь к вашей инициализации веса.

Регулирование: это форма регрессии, которая ограничивает / упорядочивает или сокращает оценки коэффициентов до нуля. Другими словами, этот метод препятствует обучению более сложной или гибкой модели, чтобы избежать риска переоснащения. - Регуляризация в ML

Ссылка на: Создание многослойной нейронной сети с регуляризацией L2 в тензорном потоке

...