Нейронная сеть Theano Все выходные данные сходятся к одному и тому же значению для всех входных данных

Я изо всех сил пытался заставить реализацию нейронной сети сходиться к значимым значениям. У меня черно-белые изображения. Каждое изображение состоит либо из 40 % черного и 60 % белого, либо из 60 % белого и 40 % черного. Классификация для более черного или белого.

Я разбиваю изображения на массивы значений пикселей и передаю их по сети. Проблема в том, что он сходится к одному и тому же постоянному значению для всех изображений. Я использую 1000 изображений для обучения. 25*25 пикселей для ввода и скрытый слой 20.

КОД:

 def layer(x, w):
     ##bias node
     b = np.array([1], dtype=theano.config.floatX)
     ##concate bias node
     new_x = T.concatenate([x, b])

     ##evalu. matrix mult
     m = T.dot(w.T, new_x)

     ##run through sigmoid
     h = nnet.sigmoid(m)
     return h

##for gradient descient, calc cost function to mininize
def grad_desc(cost, theta):
    return theta - (.01 * T.grad(cost, wrt=theta))

##input x
x = T.dvector()

##y target
y = T.dscalar()
alpha = .1 #learning rate

###first layer weights
theta1 = theano.shared(np.array(np.random.rand((25*25)+1,20), dtype=theano.config.floatX)) # randomly initialize

###output layer weights
theta3 = theano.shared(np.array(np.random.rand(21,1), dtype=theano.config.floatX))

hid1 = layer(x, theta1) #hidden layer
out1 = T.sum(layer(hid1, theta3)) #output layer

fc = (out1 - y)**2 #cost expression to minimize

cost = theano.function(inputs=[x, y], outputs=fc, updates=[
        ##updates gradient weights
        (theta1, grad_desc(fc, theta1)),
        (theta3, grad_desc(fc, theta3))])


run_forward = theano.function(inputs=[x], outputs=out1)

inputs = np.array(inputs).reshape(1000,25*25) #training data X
exp_y = np.array(exp_y) #training data Y


cur_cost = 0
for i in range(10000):
    for k in range(len(inputs)):
        cur_cost = cost(inputs[k], exp_y[k])
    if i % 10 == 0:
        print('Cost: %s' % (cur_cost,))

Покрытие затрат на одно значение, а также любые входы, имеющие одинаковый результат:

....
Cost: 0.160380273066
Cost: 0.160380273066
Cost: 0.160380273066
Cost: 0.160380273066
Cost: 0.160380273066
Cost: 0.160380273066
Cost: 0.160380273066
Cost: 0.160380273066

person John Down    schedule 10.02.2017    source источник


Ответы (1)


Просто идея:
Я видел примеры, когда все изображение было представлено в NN так же, как это делаете вы. Однако эти сети были разработаны для распознавания символов и аналогичной обработки изображений. Поэтому, если вы отправите все изображение в сеть, она попытается найти похожие изображения. Я понял, что ваши изображения случайны, и это может быть причиной того, что он не может тренироваться. На самом деле сходства между тренировочными изображениями может и не быть, и учиться там нечему. Я бы представил картинку программе таким образом, если бы захотел различать изображения кругов и квадратов. Однако, чтобы решить, является ли изображение довольно темным или светлым, я бы просто передал сети количество черных пикселей и белых пикселей. Некоторая линейная предварительная обработка может быть очень полезной.

person Manngo    schedule 10.02.2017