Обучение нейронной сети для очень большого количества набора данных - PullRequest
0 голосов
/ 29 июня 2018

В моем наборе данных 3000000 образцов. Каждый образец имеет 102 значения. Первые 101 значения находятся в диапазоне от 0 до 1. Последнее значение варьируется от нескольких сотен до тысяч. Я написал глубокую нейронную сеть, которая принимает первые 101 значение в качестве входных данных и возвращает последнее в качестве выходного значения. Я разделил свои данные на мини-пакеты с каждой партией размером 30. Я использовал 3 скрытых слоя с tanh в качестве функции активации. Я использовал показатель обучения со значением 0,0001 и MSE в качестве функции стоимости. Значение функции стоимости уменьшается с 2491723,839 до 47836,267 в первые 100 эпох, а затем остается постоянным. Я не могу понять, где я совершил ошибку.

PS - У меня очень старый рабочий стол (7-8 лет), и на его вычисление уходит много времени (500 эпох за 24 часа). Я прилагаю свой код ниже. Спасибо

    n_x=X_train.shape[0]
    m=X_train.shape[1]
    n_y=Y_train.shape[0]
    costs=[]

    X=tf.placeholder(tf.float32,[n_x,None],name="X")
    Y=tf.placeholder(tf.float32,[n_y,None],name="Y")

    parameters=init_par(layer_dims)

    A=forward(X,parameters,layer_dims)

    cost=cost_fn(A,Y,minibatch_size)

    otz=tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

    init=tf.global_variables_initializer()

    with tf.Session() as sess:
        sess.run(init)
        for epoch in range(num_epochs):
           epoch_cost=0.
           num_minibatches=int(m/minibatch_size)
           minibatches=random_mini_batches(X_train,Y_train,minibatch_size)

           for minibatch in minibatches:
               (minibatch_X,minibatch_Y)=minibatch
               _,minibatch_cost = sess.run([otz,cost], feed_dict={X:minibatch_X,Y:minibatch_Y})
               epoch_cost+=minibatch_cost/num_minibatches
           if print_cost == True and epoch % 100 == 0:
               print ("Cost after epoch %i: %f" % (epoch, epoch_cost))
           if print_cost == True and epoch % 5 == 0:
               costs.append(epoch_cost)

        plt.plot(np.squeeze(costs))
        plt.ylabel('cost')
        plt.xlabel('iterations (per tens)')
        plt.title("Learning rate =" + str(learning_rate))
        plt.show()

        parameters=sess.run(parameters)
        print("TRAINED!!")

        print("Train Accuracy : ", cost.eval({X: X_train, Y: Y_train}))

Функция стоимости:

    def cost_fn(A,Y,minibatch_size):
        loss=tf.pow((A-Y),2)
        cost=tf.reduce_sum(loss)/minibatch_size
        return cost

Init_par это:

    def init_par(layer_dims):
        L=len(layer_dims)
        parameters={}
        for l in range(1,L):
                parameters["W"+str(l)]=tf.get_variable("W"+str(l),[layer_dims[l],layer_dims[l-1]],initializer=tf.contrib.layers.xavier_initializer())
                parameters["b"+str(l)]=tf.get_variable("b"+str(l),[layer_dims[l],1],initializer=tf.zeros_initializer())
        return parameters

Форвард:

    def forward(X,parameters,layer_dims):
        outputs={}
        outputs["A0"]=X
        L=len(layer_dims)
        for l in range(1,L-1):
                outputs["Z"+str(l)] =tf.add(tf.matmul(parameters["W"+str(l)],outputs["A"+str(l-1)]),parameters["b"+str(l)])
                outputs["A"+str(l)]=tf.nn.tanh(outputs["Z"+str(l)])
        outputs["Z"+str(L-1)]=tf.add(tf.matmul(parameters["W"+str(L-1)],outputs["A"+str(L-2)]),parameters["b"+str(L-1)])
        outputs["A"+str(L-1)] =tf.nn.relu(outputs["Z"+str(L-1)])
        return outputs["A"+str(L-1)]
...