Tensorflow模型不会最大限度地减少错误

时间:2018-04-08 17:54:44

标签: python optimization tensorflow neural-network non-linear-regression

我正在尝试使用Tensorflow实现非线性回归(基于Tanh(x)的4个线性项和4个非线性项。

应该最小化的平方误差之和仅增加。经过相对较少的训练步骤后,权重和偏差变为“inf”

应该有一个简单的解决方案,类似于OLS系数

DETAIL Inputs.csv是一个1323x5表。因变量(y)是第一列,其余列(X1至X4)是四个特征。

前几行显示在这里

[Inputs1 sample[1]

代码计算并比较两个模型 a)使用OLS的线性多变量模型 b)使用4个线性输出加4个非线性输入的混合Q模型。此模型在TensorFlow中实现

下面列出了python代码。它部分基于this Stack Overlow question

    import pandas as pd, numpy as np, tensorflow as tf
    from tqdm import tqdm as metered #progress bar
    import matplotlib.pyplot as plt
    import statsmodels.api as sm
    from sklearn import preprocessing

    # pandas data
    df_train = d.read_csv(r'C:\Ajax\DS\inputs1.csv',sep="|")
    obs=df_train.shape[0]
    cols=df_train.shape[1]-1
    dblcols = cols*2

    graph = tf.get_default_graph()

    # tf variables
    x_ = tf.placeholder(name="input", shape=[None, cols], dtype=np.float32) 
    y_ = tf.placeholder(name="output", shape=[None, 1], dtype=np.float32)

    wts = tf.Variable(tf.random_normal([dblcols,1]),    name='weight')
    b = tf.Variable(tf.random_normal([]), name='bias')

    dependents= df_train["Y"].values.reshape(-1, 1)
    feats = df_train.iloc[:, 1:1+cols].values.reshape(-1, cols)

本节实现OLS(多元线性回归)

    ones = np.ones(obs).reshape(obs,1)
    feats1 = np.concatenate((feats, ones), axis=1)
    model1 = sm.OLS(dependents, feats1).fit()
    print (model1.summary())
    OLS_Yhat = model1.predict(feats1)

本节实现了包含4个线性项和4个非线性项的Q模型

    agg= tf.concat((x_ ,  tf.tanh(x_)),axis=1)
    Qmodel = tf.add(tf.matmul(agg, wts)  , b)  
    ssq = tf.square(y_ - Qmodel, name='cost')
    ssq1= tf.reduce_sum(ssq)
    LR=.01
    train_op = tf.train.GradientDescentOptimizer(LR).minimize(ssq1)

    nz = preprocessing.MaxAbsScaler()
    Zfeats1 = nz.fit_transform(feats) 
    Zfeats = Zfeats1 - np.mean(Zfeats1,axis=0)

    print("\nNormalized feats\n", Zfeats[:9,:],"\nstdev=",np.std(Zfeats),"\n" )

    n_epochs = 10000
    train_errors, nt_errors, weights, biases = [],[],[],[]

    config = tf.ConfigProto(device_count = {'GPU': 0})

    fig, ax = plt.subplots()
    fig = plt.gcf()
    fig.set_size_inches(7, 7)
    ax.set_ylabel(r'Prediction', fontsize=15)
    ax.set_xlabel(r'Actual', fontsize=15)
    ax.set_title('OLS and Q predictors')
    ax.grid(True)
    fig.tight_layout()

训练圈:

    with tf.Session(config=config) as sess:
        sess.run(tf.global_variables_initializer())

        for i in metered(range(n_epochs)):

            uu, err2, weight, bias = sess.run([train_op, ssq1, wts, b],
                                  feed_dict={x_: Zfeats, y_: dependents})
            out1.append(uu)
            nt_errors.append(err2) 
            weights.append(weight)
            biases.append(bias)

        NN_yhat = sess.run(Qmodel, feed_dict={x_: Zfeats})
        ax.scatter(dependents, NN_yhat, c='red', label='Q')
        ax.scatter(dependents, OLS_Yhat, c='blue', label='OLS')

    plt.legend()
    plt.show()

该代码旨在将两个模型(在垂直轴上)生成的预测与实际数据(在水平轴上)进行比较。

注意,在10到30次迭代之后,权重和偏差呈指数增长并变为无穷大或NAN。平方误差之和随着时期呈指数增长。

将学习率从.01降低到.001无济于事。它需要3倍的历元,但错误单调增加,权重最终变为inf

OLS模型可以看到蓝色。但Qmodel无法显示,显然是因为一个1323x1的NAN数组被返回为NN_yhat

enter image description here

graph generated by code

我还想了解为什么没有归还给uu。

0 个答案:

没有答案