Tensorflow:获取预测

时间:2018-08-22 15:29:16

标签: python 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_predoutslayer_1,但它也会返回此错误。

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

1 个答案:

答案 0 :(得分:1)

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

让我们遍历您的代码,让我对一些事情发表评论。我希望这将比仅修复单个ValueError更有帮助。

首先定义两个占位符变量Xy,然后定义一个新的张量y_cls作为argmax的{​​{1}}。据此,我怀疑y是一个单编码的地面真理类矢量(批处理的第一个轴)的集合。

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

现在,您定义第一层:

tf.constant

以下内容是这样的:对于批次中长度为layer = tf.nn.relu_layer(X, weights, bias, name="relu_layer") 的每个向量x,将计算值X_train.shape[1],结果将通过u=x*W+b传递。函数,基本上将所有<0的值都设置为零,并保持其他所有状态不变。因此,您的输出为relu,其中最大值是逐元素取的。输出z=max(0,x*W+b)的形状为z。您定义的(y_train.shape[1],)张量输出为layer,其形状为tf.nn.relu_layer,以说明批量大小。

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

(None, y_train.shape[1])

用不同的方式写,您计算出layer_1 = tf.nn.relu(layer) outs = tf.nn.relu(layer_1, name="outs") 。因为relu函数是idempotent,所以这根本没有效果(除了创建更大的计算图之外)。因此layer_1 = max(0,layer) = max(0,max(0,x*W+b))中的所有数字都与layer_1中的相同。 然后,您使用layer再次执行此操作。因此outsoutslayer_1相同。

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

计算精度时,将outs的输出强制转换为float16。为什么选择float16? tf.equal(y_pred, y_cls)返回布尔类型,并且要使用此掩码进行计算,您必须强制转换它。但是,如果您只想要总和,则强制转换为tf.equal似乎更合理。但是,我怀疑您不是真正希望将总和作为您的“准确性”,而是真实阳性与总样本数之比。看看tf.metrics.accuracy!

在第二个代码段中,调用一些int函数,该函数的源代码未知。

optimize

我希望您以optimize(sess, training_op, X_train, X_test, y_train, y_test, epoch=20) 作为训练数据和地面真相标签training_opn_epochs运行X_train(但您将epoch = 20传递给该函数)。为什么您也将y_trainX_test传递给训练方法,我并不能真正理解,因为通常您希望在两个不同的步骤中进行训练和测试。

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

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

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