python - Tensorflow 不更新权重
问题描述
我正在做一个 tensoflow 教程,但在更新权重时遇到了一些麻烦。
from sklearn.datasets import load_digits
mnist = load_digits(2)
X,y = mnist.data, mnist.target
print("y [shape - %s]:" % (str(y.shape)), y[:10])#y [shape - (360,)]: [0 1 0 1 0 1 0 0 1 1]
print("X [shape - %s]:" % (str(X.shape)))#X [shape - (360, 64)]:
# inputs and shareds
shared_weights = tf.Variable(initial_value=tf.random_uniform([64]))#<student.code_variable()>
input_X = tf.placeholder(shape=(None,64),dtype="float32",name="features")
input_y = tf.placeholder(shape=(None,),dtype="float32",name="label")
reduced_sum=tf.reduce_sum(input_X*shared_weights/256, axis=1)
predicted_y = tf.nn.sigmoid(reduced_sum)#<predicted probabilities for input_X>
loss =tf.losses.log_loss(labels=input_y,predictions=predicted_y)#<logistic loss (scalar, mean over sample)>
optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
#I don't understand how i have to implement this (I don't use it)
train_function = lambda X,y: s.run(optimizer,feed_dict={input_X:X,input_y:y})
#<compile function that takes X and y, returns log loss and updates weights>
predict_function =lambda X: s.run(predicted_y,feed_dict={input_X:X})
#<compile function that takes X and computes probabilities of y>
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y)
from sklearn.metrics import roc_auc_score
s.run(tf.global_variables_initializer())
for i in range(5):
#print(reduced_sum.eval(feed_dict={input_X:X_train}))
#print(shared_weights.eval())
s.run(optimizer,feed_dict={input_X:X_train,input_y:y_train})# <run optimizer operation>
loss_i = loss.eval(feed_dict={input_X:X_train, input_y:y_train}) #<compute loss at iteration i>
print("loss at iter %i:%.4f" % (i, loss_i))
print("train auc:",roc_auc_score(y_train, predict_function(X_train)))
print("test auc:",roc_auc_score(y_test, predict_function(X_test)))
print ("resulting weights:")
plt.imshow(shared_weights.get_value().reshape(8, -1))
plt.colorbar();
本教程的这一部分以 jolly 为指导。批量(单个小批量)优化是强制的。我打印了损失和重量,但它们没有改变,为什么?
解决方案
在优化器中使用更大的步长,例如 50.0,并使用更多的迭代,例如 50。
指向 Sergey 的结果权重是正确的。
并且不需要调用 s.run 和 loss.eval 替换它
r = train_function(X_train,y_train)
loss_i = r[0]
shared_weights = r[1]
推荐阅读
- python-3.x - 处理多个文件时在哪里导入依赖项
- java - 无法在 html 页面中加载 Css 文件
- c# - AWS S3 Presigned URL Get 返回 ListBucketResult
- java - 如何解决从 GCS 下载加密文件时出错的问题
- sql - 我想对所有 top1 记录数量求和?
- powershell - 通过 powershell 脚本更改 Conda 环境(用于 Gitlab-CI)
- javascript - 导出chain promise的返回值
- git - 从工作树提交更改 .git/config 中的远程 url
- angular5 - 如何从ActivatedRoute以角度获取请求正文
- mysql - 使用 spring-boot 和 bitronix JTA 管理器将 XA 数据源配置为 mysql 8 DB 失败并出现 SqlException XAERR_RMERR