2017-02-10 17 views
0

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

Я разбиваю изображения на массивы значений пикселей и передаю их через сеть. Проблемы заключаются в том, что он сходится к одному и тому же постоянному значению для всех изображений. Я использую 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 

ответ

0

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