我在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>
<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>
<li className="nav-item"
style={{cursor: 'pointer', float: 'right', paddingTop: '7px'}}>
<img src={dollerIcon} alt="icon" style={{width:'20px'}}/>
</li>
<li id="dashbordId" className="nav-item" style={{
cursor: 'pointer',
float: 'right',
borderBottom: '1px solid transparent',
paddingTop: '2%'
}}>
<ProfileDropdown user="admin"/>
</li>
</ul>
</form>
答案 0 :(得分:1)
在构建网络时,变量将使用随机值初始化。由于损失函数可能会有很多局部最小值,因此,每次运行网络时,拟合的参数都会更改。 此外,如果损失函数是凸的(只有一个(全局)最小值),则变量的顺序在某种程度上是任意的。例如,如果您将一个具有1个隐藏层的网络与2个隐藏节点进行拟合,则第一次运行时节点1的参数可能与节点2的参数相对应,反之亦然。
答案 1 :(得分:0)
在机器学习中,神经网络的当前“知识状态”通过图中连接的权重表示。通常认为,您的整个网络代表着高维功能,学习任务意味着找到此功能的全局最优值。学习过程根据指定的优化程序更改神经网络中连接的权重,在您的情况下,该默认值是tf.contrib.learn.DNNRegressor
(这是Adagrad优化程序)的默认值。但是还有其他参数会影响模型中的最终“知识状态”。例如(有,但我保证在下面的列表中不完整):
加号(这可能是了解为什么每次重新训练后体重都不一样的最重要的事情),您必须考虑在训练期间使用随机梯度下降算法。这意味着,对于每个优化步骤,算法都会选择整个训练集的随机子集。因此,一个优化步骤并不总是指向高维函数的全局最优值,而是指向可以用随机选择的子集计算出的最陡下降值。由于优化过程中的这种随机性,您可能永远无法达到任务的全局最优。但是,通过精心选择的超参数(当然还有好的数据),您将获得一个很好的近似解,该解位于函数的局部最优值中,并且每次重新训练模型时都可能会改变。
因此,结论是,不要看权重来判断模型的性能,因为权重每次都会稍有不同。使用性能度量标准,例如在交叉验证中计算的准确性或在测试集上计算的混淆矩阵。
P.S。 tf.contrib.learn.DNNRegressor
是最新TensorFlow版本中已弃用的函数,如您在the docs中所见。请改用tf.estimator.DNNRegressor
。