首页 > 解决方案 > Tensorflow:获得预测

问题描述

我试图获得预测和学习网络。

这是我的网络的参数

X = tf.placeholder(tf.float32, shape=(None, X_train.shape[1]), name="input")
y = tf.placeholder(tf.float32, shape=(None, y_train.shape[1]), name="y")
y_cls = tf.argmax(y, axis=1)

weights = tf.Variable(tf.truncated_normal([X_train.shape[1], y_train.shape[1]], stddev=0.05), name="weights", trainable=True)
bias = tf.constant(1.0, shape=[y_train.shape[1]], name="bias")

layer = tf.nn.relu_layer(X, weights, bias, name="relu_layer")
layer_1 = tf.nn.relu(layer)
outs = tf.nn.relu(layer_1, name="outs")
y_pred = tf.argmax(outs, axis=1)

cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=layer_1, labels=y)
cost = tf.reduce_mean(cross_entropy)
acc = tf.cast(tf.equal(y_pred, y_cls), tf.float16)
predicted = tf.reduce_sum(acc)

learning_rate = 1e-3
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
training_op = optimizer.minimize(cost)

并尝试通过

n_epochs = 100
batch_size = 500
n_batches = int(np.ceil(1000 / batch_size))

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    optimize(sess, training_op, X_train, X_test, y_train, y_test, epoch=20)
    print(sess.run(y_pred, feed_dict={X: X_test}))

但它返回一个错误

ValueError: setting an array element with a sequence.

y_pred我也尝试使用outslayer_1但它也会返回此错误。

我该如何解决这个问题并获得预测值?

标签: pythontensorflow

解决方案


您的代码存在多个问题,我认为您在此处发布的错误是最不重要的错误之一。

让我们看看你的代码,让我评论一些事情。我希望这将比仅修复单个ValueError.

您从定义两个占位符变量开始Xy并将新张量定义y_clsargmaxof y。由此我怀疑这y是一个热编码的地面真实类向量的集合(批处理的第一个轴)。

然后你继续定义权重和偏差。对于权重,您选择tf.Variable而对于您使用的偏差tf.constant。我不认为这是故意的,你实际上希望这些偏见是不可训练的。所以请注意:如果您使用tf.constant,您将创建一个将来无法更改的常量值。因此,偏差张量在训练期间不会更新。请阅读 tensorflow 中的变量和常量。这个问题可能是一个开始:TensorFlow 变量和常量

现在定义第一层:

layer = tf.nn.relu_layer(X, weights, bias, name="relu_layer")

这里发生的情况如下:对于批处理中的每个x长度向量,计算值并将结果传递给函数,该函数基本上将所有值 <0 设置为零,并保持其他所有内容不变。所以你的输出是元素取最大值的地方。输出有 shape 。您定义的张量的输出具有形状以说明批量大小。X_train.shape[1]u=x*W+breluz=max(0,x*W+b)z(y_train.shape[1],)layertf.nn.relu_layer(None, y_train.shape[1])

然后你定义“有趣”的东西:

layer_1 = tf.nn.relu(layer)
outs = tf.nn.relu(layer_1, name="outs")

换种说法,你计算layer_1 = max(0,layer) = max(0,max(0,x*W+b))。因为 relu 函数是幂等的,所以这根本没有影响(除了创建更大的计算图)。所以 中的所有数字layer_1都与 中的相同layer。然后,您再次使用outs. 所以和outs是一样layer_1layer

然后继续添加另一个激活函数:softmax。这个函数的应用有点隐蔽,因为它发生在cross_entropy计算的同时。以这种方式结合一个 relu 激活(或三个)和一个 softmax 至少可以说是“非常规的”。有趣的是,您使用layer_1作为logits参数而不是layeror outs

当您计算准确度时,您将输出tf.equal(y_pred, y_cls)转换为 float16。为什么选择浮动 16?tf.equal返回一个 bool 类型并使用此掩码进行计算,您肯定必须强制转换它。但是,如果您只想要总和,那么转换为 anint似乎更合理。但是,我怀疑您并不是真的想要总和作为您的“准确性”,而是真正想要的比率与提供的样本总数。看看tf.metrics.accuracy!

在第二个代码片段中,您调用了一些optimize我们不知道其源代码的函数。

optimize(sess, training_op, X_train, X_test, y_train, y_test, epoch=20)

我希望你运行你的training_opfor n_epochs(但你将 epoch=20 传递给这个函数)X_train作为 training data 和 ground truth labels y_train。为什么你也通过X_testy_test训练方法,我不太明白,因为通常你想在两个不同的步骤中保持训练和测试。

最后你打电话sess.run(y_pred, feed_dict={inp: X_test})。在 feed_dict 中,您为占位符分配inp的值X_test。但是,您之前没有定义占位符inp,因此无法运行此代码。我假设您想将其用作网络的输入,因此将其用作您在开始时定义X_test的占位符的值。X

我强烈建议您阅读有关神经网络以及如何构建它们的更多信息,并阅读一些 tensorflow 教程。

然后修改您的整个代码,并在遇到麻烦时随时提出新问题。


推荐阅读