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.
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.
Bundan habersizdim, bunu benim için temizlediğin için teşekkürler. – Sam