【问题标题】:Deep learning - cost function increases for my training set, Theano深度学习 - 我的训练集 Theano 的成本函数增加
【发布时间】:2016-09-28 04:30:37
【问题描述】:

我正在尝试训练一个极其简单的神经网络,它有 2 个隐藏层(例如),每个隐藏层有 5 个神经元。

出于某种原因,对于某个数据集,我的成本函数(选择交叉熵,但并不重要)总是在增加。

这是我的代码 -

import theano_net as N
from load import mnist
import theano
from theano import tensor as T
import numpy as np
import cv2

def floatX(X):
    return np.asarray(X,dtype=theano.config.floatX)

def init_weights(shape):
    return theano.shared(floatX(np.random.randn(*shape)*0.01))

def appendGD(params, grad, step):
    updates = []
    for p,g in zip(params,grad):
        updates.append([p, p - (g * step)])
    return updates

def model(X,w1,w2,wo):
    h0 = X
    z1 = T.dot(h0, w1.T)  ## n on m1
    h1 = T.nnet.sigmoid(z1)

    z2 = T.dot(h1, w2.T)  ## n on m2
    h2 = T.nnet.sigmoid(z2)

    zo = T.dot(h2, wo.T)

    return T.nnet.softmax(zo)

numOfTrainPics = 4872
numOfTestPics = 382
numOfPixels = 40000
numOfLabels = 6

trX = np.zeros((numOfTrainPics,numOfPixels))
trY = np.zeros((numOfTrainPics,numOfLabels))
teX = np.zeros((numOfTestPics,numOfPixels))
teY = np.zeros((numOfTestPics,numOfLabels))

for i in range(1,4873): #generate trX and trY
    img = cv2.imread('C:\\Users\\Oria\\Desktop\\Semester B\\Computer Vision Cornel 2016\\Train\\Train\\%s.jpg' %(i))
    img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
    img = np.reshape(img,(1,numOfPixels))
    trX[i-1,:] = img
    if(i < 1330):
        trY[i-1,0] = 1
    if(i > 1329)&(i < 1817):
        trY[i-1,1] = 1
    if(i > 1816)&(i < 2389):
        trY[i-1,2] = 1
    if(i > 2388)&(i < 3043):
        trY[i-1,3] = 1
    if(i > 3042)&(i < 4438):
        trY[i-1,4] = 1
    if(i > 4437)&(i < 4873):
        trY[i-1,5] = 1
for i in range(1,383):
    img = cv2.imread('C:\\Users\\Oria\\Desktop\\Semester B\\Computer Vision Cornel 2016\\Test\\Test\\%s.jpg' %(i))
    img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
    img = np.reshape(img,(1,numOfPixels))
    teX[i-1,:] = img
    if(i < 59):
        teY[i-1,0] = 1
    if(i > 58)&(i < 120):
        teY[i-1,1] = 1
    if(i > 119)&(i < 185):
        teY[i-1,2] = 1
    if(i > 184)&(i < 261):
        teY[i-1,3] = 1
    if(i > 260)&(i < 326):
        teY[i-1,4] = 1
    if(i > 325)&(i < 383):
        teY[i-1,5] = 1
print "matrices generated"
###

x = T.fmatrix()
y = T.fmatrix()
step = 0.1
m1 = 5
m2 = 5
w1 = init_weights((m1, numOfPixels))
w2 = init_weights((m2, m1))
wo = init_weights((numOfLabels, m2))

temp = model(x, w1, w2, wo)

predictions = T.argmax(temp, axis= 1)

cost = T.mean(T.nnet.categorical_crossentropy(temp, y))

params = [w1, w2, wo]
gradient = T.grad(cost=cost, wrt = params)
update = appendGD(params, gradient, step)

train = theano.function(inputs = [x,y], outputs = cost, updates = update, allow_input_downcast=True)
predict = theano.function(inputs=[x],outputs=[predictions],allow_input_downcast=True)

for i in range(10000):
    for start, end in zip(range(0,len(trX),241),range(241,len(trX),241)):
        cost = train(trX[start:end], trY[start:end])
    print cost

对于我在这段代码中加载的 trX,trY,我的成本函数一直在增加。

但是,当我运行相同的代码但 trX 和 trY 来自 MNIST 数据集时,它工作正常并且成本函数正在减少。

我不明白为什么会这样以及如何解决它。

一个线索可能是,当我查看 mnist 数据集的第一行 trX(第一张图片)时,它是一个非常稀疏的矩阵,非零元素都在 0 和 1 之间。

[ 0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.01176471
  0.07058824  0.07058824  0.07058824  0.49411765  0.53333333  0.68627451
  0.10196078  0.65098039  1.          0.96862745  0.49803922  0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.11764706  0.14117647  0.36862745
  0.60392157  0.66666667  0.99215686  0.99215686  0.99215686  0.99215686
  0.99215686  0.88235294  0.6745098   0.99215686  0.94901961  0.76470588
  0.25098039  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.19215686
  0.93333333  0.99215686  0.99215686  0.99215686  0.99215686  0.99215686
  0.99215686  0.99215686  0.99215686  0.98431373  0.36470588  0.32156863
  0.32156863  0.21960784  0.15294118  0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.07058824  0.85882353  0.99215686  0.99215686  0.99215686
  0.99215686  0.99215686  0.77647059  0.71372549  0.96862745  0.94509804
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.31372549  0.61176471
  0.41960784  0.99215686  0.99215686  0.80392157  0.04313725  0.
  0.16862745  0.60392157  0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.05490196  0.00392157  0.60392157  0.99215686  0.35294118  0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.54509804  0.99215686  0.74509804  0.00784314
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.04313725  0.74509804  0.99215686
  0.2745098   0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.1372549
  0.94509804  0.88235294  0.62745098  0.42352941  0.00392157  0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.31764706  0.94117647  0.99215686  0.99215686  0.46666667  0.09803922
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.17647059  0.72941176  0.99215686  0.99215686
  0.58823529  0.10588235  0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.0627451   0.36470588
  0.98823529  0.99215686  0.73333333  0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.97647059  0.99215686  0.97647059  0.25098039  0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.18039216  0.50980392
  0.71764706  0.99215686  0.99215686  0.81176471  0.00784314  0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.15294118  0.58039216  0.89803922
  0.99215686  0.99215686  0.99215686  0.98039216  0.71372549  0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.09411765  0.44705882  0.86666667  0.99215686
  0.99215686  0.99215686  0.99215686  0.78823529  0.30588235  0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.09019608  0.25882353  0.83529412  0.99215686  0.99215686
  0.99215686  0.99215686  0.77647059  0.31764706  0.00784314  0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.07058824  0.67058824  0.85882353  0.99215686  0.99215686  0.99215686
  0.99215686  0.76470588  0.31372549  0.03529412  0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.21568627  0.6745098   0.88627451  0.99215686  0.99215686  0.99215686
  0.99215686  0.95686275  0.52156863  0.04313725  0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.53333333  0.99215686  0.99215686  0.99215686  0.83137255
  0.52941176  0.51764706  0.0627451   0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.        ]

当我查看我的 trX,但是在我的代码中加载数据库时,trX[0] 大多是非零,元素介于 0 和 255 之间。

我只想在我的数据库上训练一个神经网络。这应该不会太难,并且代码已被证明可以与 MNIST 一起使用。我只是不明白如何正确加载我的数据集。

【问题讨论】:

    标签: python machine-learning computer-vision neural-network


    【解决方案1】:

    您必须将输入数据标准化为 [0, 1] 或 [-1, 1] 范围,正如您所看到的,这已经在您拥有的 MNIST 数据集中完成了。 如果没有归一化,训练神经网络会困难得多。

    您可以轻松地做到这一点,方法是减去数据集的平均值,然后除以标准差,或者只进行最小-最大归一化,这将给出 [0, 1] 范围。

    对于每通道 8 位的图像,您只需将每个像素除以 255 即可得到 [0, 1] 范围,这通常足以训练 NN,但并非总是如此。

    【讨论】:

    • 值得一提的是,这不是关于“变得更难”,而是简单地说,NN 中使用的所有启发式方法,例如用于初始化权重的分布参数都是手工制作的,用于 [0 ,1] 范围。在这个范围之外,几乎总是会超出激活函数输入值的合理范围
    • 而且这种标准化不会将输入保持在 [-1, 1] 范围内。
    • @MarcinMożejko 实际上大约是 [-1, 1] 范围。
    • @MarcinMożejko 啊,你是对的,它标准化但不是预定义的范围。我会更新答案。
    • @Matias,使用 Adam 或 Rmsprop 等现代方法是不正确的,因为它们很好地适应了这些简单的问题。实际问题仅在于初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2019-10-20
    • 2016-01-03
    • 2019-12-30
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多