2016-04-06 14 views
1

Sadece bir bağlam: Cifar-10 veri setinde görüntü sınıflandırması için 3 katmanlı bir sinir ağı (1 gizli katman) uygulamaya çalışıyorum. Geri yayılımı uyguladım ve asıl olarak ağı sadece gradyan iniş kullanarak eğitmeye çalıştım, ama benim maliyetim 40 civarında ya da bu şekilde yayıldı (ki bu da yeni görüntüleri aynı anda rastgele tahmin ederek aynı oranda sınıflandırıyordu; neredeyse anlamsız).Neural net optimizasyonu başarısız (Scipy fmin_cg kullanarak)

Daha sonra ağ scipy.optimize.fmin_cg işlevini kullanarak eğitmeye çalıştım. Kaydırılmamış ağırlıkları işleve aktardım ve geri yayma işlevim degradeler için aynı boyut vektörünü döndürür; bu, işlev için girdi gereksinimlerini karşılar.

fonksiyonun My uygulaması benziyor

aşağıdadır: fit ve fit_slim işlevleri şunlardır

scipy.optimize.fmin_cg(cost, iw, fprime=fit_slim) 

:

def fit(X, Y, w, l, predict=False, x=None): 
    w_grad = ([np.mat(np.zeros(np.shape(w[i]))) 
       for i in range(len(w))]) 
    for i in range(len(X)): 
     x = x if predict else X[i] 
     y = Y[i] 
     # forward propagate 
     a = x 
     a_s = [] 
     for j in range(len(w)): 
      a = np.mat(np.append(1, a)).T 
      a_s.append(a) 
      z = w[j] * a 
      a = sigmoid(z) 
     if predict: return a 
     # backpropagate 
     delta = a - y.T 
     w_grad[-1] += delta * a_s[-1].T 
     for j in reversed(range(1, len(w))): 
      delta = delta[1:] if j != len(w)-1 else delta 
      delta = np.multiply(w[j].T*delta, s_prime(a_s[j])) 
      w_grad[j-1] += (delta[1:] * a_s[j-1].T) 
    # regularization 
    for i in range(len(w)): 
     w_grad[i] /= len(X) 
     w_grad[i][:,1:] += (l/len(X)) * w[i][:,1:] 
    return flatten(w_grad).T 

def fit_slim(iw): 
    iw = shape_back(iw) 
    return fit(X, Y, iw, l) 

Ve cost işlevi geçerli:

def cost(iw): 
    J = 0 
    m = len(X) 
    iw = shape_back(iw) 
    for i in range(m): 
     h = fit(X, Y, iw, l, True, X[i]) 
     J += ((1.0/m)*(np.sum((np.multiply(-Y[i],np.log(h))- 
       np.multiply((1-Y[i]),np.log(1-h))).flatten()))) 
    for i in range(len(w)): 
     J += np.sum(((l/(2.0*m))*np.power(w[i],2)).flatten()) 
    return J 

iw değişken, uzun bir vektör içine kaydedilmemiş ağırlıklar ve shape_back işlevi fit ve cost işlevlerinde kullanmak için özgün matris şekline geri yeniden iw yeniden şekillendirir.

Karşılaştığım ilk konu, tek bir yinelemeyi çalıştırmak için fit işlevimin sonsuza kadar sürmesi gerçeğidir. Ve sonsuza dek, bir dakika demek istiyorum ki, bu çok yavaş görünüyor. Yine de, sözünü ettiğim gibi, yaklaşık olarak çok yüksek bir maliyet olan yaklaşık 40 plateaus maliyet platosuna kadar çalışmasına izin verdim. Alternatif bir optimizasyon tekniği uygulamak bana göre makul görünüyordu ve fmin_cg işlevini çözdüm.

File "image_net.py", line 143, in <module> 
    print scipy.optimize.fmin_cg(cost, iw, fprime=fit_slim, maxiter=2, callback=callback) 
    File "/Users/samgriesemer/anaconda/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 1092, in fmin_cg 
    res = _minimize_cg(f, x0, args, fprime, callback=callback, **opts) 
    File "/Users/samgriesemer/anaconda/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 1156, in _minimize_cg 
    deltak = numpy.dot(gfk, gfk) 
ValueError: shapes (616610,1) and (616610,1) not aligned: 1 (dim 1) != 616610 (dim 0) 

fonksiyon bana hiç mantıklı değil aynı vektörün nokta ürününü, almaya çalıştığı geliyor bana: Onu çalıştırdığınızda

aşağıdaki hatayı alıyorsunuz .

Sorularımı tekrarlamak için iki sorunum var.

1) fit işlevimi daha iyi hale getirmek için yapabileceğim bir şey var mı? Veri kümemde 10,000 örnek var, bu yüzden anlatabilmek için zaman almanın zaman aldığını anlıyorum, ama nedenini anlayamıyorum, hatta birçok iterasyondan sonra bile maliyetim hala çok yüksek.

2) Neden fmin_cg işlevini çalıştırırken bir hata alıyorum? Fonksiyona geçtiğim argümanlar aynı büyüklükteki vektörlerdir. Fonksiyonda aynı büyüklükteki vektörün nokta çarpımını neden almaya çalışacağını anlamıyorum.

Bu sorunlara/yanlış anlamaya ışık tutabilecek herkese çok teşekkürler.

cevap

1

It seems to me that the function is attempting to take the dot product of the same vector, which doesn't make any sense to me.

numpy.dot bu şekilde çalışmıyor. Sorun, hata mesajının tam olarak söylediği şeydir: bir matris çarpma işlemini gerçekleştirmeye çalışır ve boyutlar eşleşmediğinden başarısız olur.sadece ilki Numpy için tek boyutlu olduğunu ve olarak yorumlanır değil: bir "tek boyutlu", numpy şekilleri (n,), (n, 1) ve (1, n) arasında ayrım olarak düşünebildiğim diziler için o

Bildirimi bir satır veya sütun vektörü.

>>> a = np.ones(3)  # a 1D array 
>>> np.dot(a, a) 
3.0 
>>> b = a.reshape(-1, 1) # a column vector 
>>> b 
array([[ 1.], 
     [ 1.], 
     [ 1.]]) 
>>> np.dot(b, b)   # column times column, fails 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shapes (3,1) and (3,1) not aligned: 1 (dim 1) != 3 (dim 0) 
>>> np.dot(b, b.T)  # column times row, i.e. an outer product 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 
>>> np.dot(b.T, b)  # row times column, but notice the dimensions 
array([[ 3.]])    
+0

Bundan habersizdim, bunu benim için temizlediğin için teşekkürler. – Sam