我尝试将逻辑回归用于mnist数据集,但是实现方面存在一些问题
from sklearn.datasets import load_digits
from sklearn.metrics import roc_auc_score
s = tf.InteractiveSession(config=tf.ConfigProto(gpu_options=gpu_options))
mnist = load_digits(2)
X,y = mnist.data, mnist.target
# inputs and shareds
weights = tf.Variable(np.zeros((64, 1), dtype='float32'))
input_X = tf.placeholder(tf.float32, shape=(None, 64))
input_y = tf.placeholder(tf.float32, shape=(None, 1))
predicted_y = tf.add(tf.matmul(input_X, weights), input_y)
loss = tf.losses.log_loss(input_y, predicted_y)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-2).minimize(loss)
train_function = s.run(optimizer, feed_dict={input_X: X, input_y: y.reshape(-1, 1)})
predict_function = s.run(predicted_y, feed_dict={input_X: X})
X_train, X_test, y_train, y_test = train_test_split(X, y)
for i in range(5):
s.run(optimizer)
loss_i = s.run(loss, feed_dict={input_X: X_test, input_y: y_test})
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(weights.eval().reshape([8,8]))
plt.colorbar()
当我尝试运行train_prediction
时出现问题。它返回
FailedPreconditionError: Attempting to use uninitialized value Variable_16
[[Node: Variable_16/read = Identity[T=DT_FLOAT, _class=["loc:@Variable_16"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](Variable_16)]]
我尝试更改输入的形状,但我不明白,这是怎么回事。
答案 0 :(得分:0)
TensorFlow文档明确指出:
启动图形时,必须先明确初始化变量,然后才能运行使用其值的Ops。您可以通过运行变量的初始值设定项op,从保存文件还原变量或仅运行为变量分配值的assign Op来初始化变量。实际上,变量初始值设定项op只是将变量的初始值分配给变量本身的赋值Op。
因此,在打开TF会话之后,您必须运行Initializer Op之一来初始化weight
变量。
我建议您使用tf.get_variable()
定义新变量,该变量创建一个新变量或检索给定名称的现有变量。在其参数列表中,可以传递tf.initializer
,但如果不这样做,它将加载默认的初始化程序。