【问题标题】:Tensorflow variable value different on same training set同一训练集上的Tensorflow变量值不同
【发布时间】:2018-08-02 09:10:06
【问题描述】:

我在 Python 3.6 上构建了一个神经网络模型

我正在尝试根据纬度、液化天然气、到公共交通的距离、建造年份等属性来预测公寓的价格。

我对模型使用相同的训练集。但是,每次我打印出隐藏层中变量的值都是不同的。

    testing_df_w_price = testing_df.copy()
    testing_df.drop('PricePerSq',axis = 1, inplace = True)
    training_df, testing_df = training_df.drop(['POID'], axis=1), testing_df.drop(['POID'], axis=1)

    col_train = list(training_df.columns)
    col_train_bis = list(training_df.columns)

    col_train_bis.remove('PricePerSq')
    mat_train = np.matrix(training_df)
    mat_test  = np.matrix(testing_df)
    mat_new = np.matrix(training_df.drop('PricePerSq', axis = 1))
    mat_y = np.array(training_df.PricePerSq).reshape((training_df.shape[0],1))

    prepro_y = MinMaxScaler()
    prepro_y.fit(mat_y)

    prepro = MinMaxScaler()
    prepro.fit(mat_train)

    prepro_test = MinMaxScaler()
    prepro_test.fit(mat_new)

    train = pd.DataFrame(prepro.transform(mat_train),columns = col_train)
    test  = pd.DataFrame(prepro_test.transform(mat_test),columns = col_train_bis)

    # List of features
    COLUMNS = col_train
    FEATURES = col_train_bis
    LABEL = "PricePerSq"

    # Columns for tensorflow
    feature_cols = [tf.contrib.layers.real_valued_column(k) for k in FEATURES]

    # Training set and Prediction set with the features to predict
    training_set = train[COLUMNS]
    prediction_set = train.PricePerSq

    # Train and Test
    x_train, x_test, y_train, y_test = train_test_split(training_set[FEATURES] , prediction_set, test_size=0.25, random_state=42)

    y_train = pd.DataFrame(y_train, columns = [LABEL])

    training_set = pd.DataFrame(x_train, columns = FEATURES).merge(y_train, left_index = True, right_index = True) # good

    # Training for submission
    training_sub = training_set[col_train] # good

    # Same thing but for the test set
    y_test = pd.DataFrame(y_test, columns = [LABEL])
    testing_set = pd.DataFrame(x_test, columns = FEATURES).merge(y_test, left_index = True, right_index = True) # good

    # Model
    # tf.logging.set_verbosity(tf.logging.INFO)
    tf.logging.set_verbosity(tf.logging.ERROR)
    regressor = tf.contrib.learn.DNNRegressor(feature_columns=feature_cols,
                                              hidden_units=[int(len(col_train)+1/2)],
                                              model_dir = "/tmp/tf_model")
    for k in regressor.get_variable_names():
        print(k)
        print(regressor.get_variable_value(k))

Example of hidden layer value difference

【问题讨论】:

  • 请不要发布代码的图像,而是代码本身。
  • 谢谢,我已经编辑了帖子。

标签: tensorflow machine-learning neural-network deep-learning data-science


【解决方案1】:

当您构建网络时,变量会使用随机值进行初始化。由于您的损失函数可能存在许多局部最小值,因此每次运行网络时拟合参数都会发生变化。 此外,如果您的损失函数是凸函数(只有一个(全局)最小值),则变量的顺序有些随意。例如,如果您拟合具有 1 个隐藏层和 2 个隐藏节点的网络,则第一次运行时节点 1 的参数可能对应于节点 2 的参数,反之亦然。

【讨论】:

    【解决方案2】:

    在机器学习中,神经网络的当前“知识状态”通过图中连接的权重来表示。通常认为,您的整个网络代表一个高维函数,学习任​​务意味着找到该函数的全局最优值。学习过程会根据指定的优化器更改神经网络中连接的权重,在您的情况下,这是默认的 tf.contrib.learn.DNNRegressor(即 Adagrad 优化器)。但是还有其他参数会影响模型中的最终“知识状态”。例如(我保证以下列表不完整):

    • 模型中的初始学习率
    • 随着时间调整学习率的学习率计划
    • 最终确定的规律和提前停止
    • 用于权重初始化的初始化策略(例如 He 初始化或随机初始化)

    另外(这可能是理解为什么每次重新训练后权重不同的最重要的事情),您必须考虑在训练期间使用随机梯度下降算法。这意味着,对于每个优化步骤,算法都会选择整个训练集的随机子集。因此,一个优化步骤并不总是指向高维函数的全局最优值,而是指向可以用随机选择的子集计算的最陡下降。由于优化过程中的这种随机成分,您可能永远不会达到您的任务的全局最优值。但是通过精心选择的超参数(当然还有好的数据),您将获得一个很好的近似解,它位于函数的局部最优值之内,并且每次重新训练模型时都会发生变化。

    所以总结一下,不要看权重来判断模型的性能,因为它们每次都会略有不同。使用性能度量,例如在交叉验证中计算的准确度或在测试集上计算的混淆矩阵。

    附: tf.contrib.learn.DNNRegressor 是最新 TensorFlow 版本中已弃用的函数,您可以在 the docs 中看到。请改用tf.estimator.DNNRegressor

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多