训练大量数据集的神经网络

时间:2018-06-29 07:10:28

标签: python tensorflow machine-learning neural-network deep-learning

我的数据集中有3000000个样本。每个样本具有102个值。前101个值的范围是0到1。最后一个值的范围是几百到几千。我编写了一个深度神经网络,该神经网络将前101个值作为输入要素,并返回最后一个作为输出值。我将数据分成小批,每批大小为30。我使用了3个以tanh作为激活函数的隐藏层。我使用值为0.0001的学习率和MSE作为我的成本函数。 成本函数的值在前100个时期中从2491723.839降低到47836.267,然后保持不变。 我不知道我在哪里弄错了。

PS-我的台式机很旧(7-8岁),要花很多时间(24小时内为500个纪元)进行计算。我附上下面的代码。 谢谢

    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)]

0 个答案:

没有答案