同一训练集上的Tensorflow变量值不同

时间:2018-08-02 09:10:06

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

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

我正在尝试根据公寓的属性(例如纬度,经度,到公共交通的距离,建成年份等)来预测公寓的价格。

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

<form className="form-inline my-2 my-lg-0">
                        <ul className="navbar-nav" style={{float: 'right',marginBottom:'-10px'}}>


                            <li id="reviewId" className="nav-item" style={liStyle}>
                                <Link to="/interactions" onClick={this.reviewClick}
                                   className="nav-link js-scroll-trigger"
                                   style={linkStyle}>
                                    <small>Interactions</small>
                                </Link>
                            </li>



                            &nbsp;&nbsp;&nbsp;

                            <li id="reportId" className="nav-item"
                                style={{cursor: 'pointer', float: 'right', borderBottom: '1px solid transparent'}}>


                                <Link to="/report" onClick={this.reportClick}
                                   className="nav-link js-scroll-trigger"
                                      style={linkStyle}>
                                    <small>Reports</small>
                                </Link>
                            </li>


                            &nbsp;&nbsp;&nbsp;

                            <li className="nav-item"
                                style={{cursor: 'pointer', float: 'right', paddingTop: '7px'}}>
                                <img src={dollerIcon} alt="icon" style={{width:'20px'}}/>
                                &nbsp;&nbsp;&nbsp;
                            </li>




                            <li id="dashbordId" className="nav-item" style={{
                                cursor: 'pointer',
                                float: 'right',
                                borderBottom: '1px solid transparent',
                                paddingTop: '2%'
                            }}>
                                <ProfileDropdown user="admin"/>

                            </li>


                        </ul>


                    </form>

Example of hidden layer value difference

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

  • 模型中的初始学习率
  • 根据时间调整学习率的学习率时间表
  • 最终定义的规律性和提早停止
  • 用于权重初始化的初始化策略(例如He初始化或随机初始化)

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

因此,结论是,不要看权重来判断模型的性能,因为权重每次都会稍有不同。使用性能度量标准,例如在交叉验证中计算的准确性或在测试集上计算的混淆矩阵。

P.S。 tf.contrib.learn.DNNRegressor是最新TensorFlow版本中已弃用的函数,如您在the docs中所见。请改用tf.estimator.DNNRegressor