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,但它也返回此错误。

我怎样才能解决这个问题并获得预测值?

梅林1896

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

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

您从定义两个占位符变量开始Xy然后定义一个新的张量y_cls作为argmaxof y由此我怀疑这y是单热编码的地面实况类向量的集合(批处理的第一轴)。

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

现在定义第一层:

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

此处发生的情况如下:对于批次中的每个x长度向量都会计算X_train.shape[1]该值u=x*W+b,并将此结果传递给relu函数,该函数基本上将所有值 <0 设置为零,而其他所有内容保持原样。所以你的输出是z=max(0,x*W+b)在元素上取最大值的地方。输出z具有 shape (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")

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

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

当您计算准确度时,您将输出转换tf.equal(y_pred, y_cls)为 float16。为什么是 float16?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_trainy_trainX_testy_test

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

我强烈建议你阅读更多关于神经网络以及如何构建它们并阅读一些 tensorflow 教程。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章