代码之家  ›  专栏  ›  技术社区  ›  Petr Petrov

Tensorflow:获取预测

  •  0
  • Petr Petrov  · 技术社区  · 6 年前

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

    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 outs layer_1 但它也返回这个错误。

    我怎样才能修正它并得到预测值呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Merlin1896    6 年前

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

    让我们看看你的代码,让我评论一些事情。我希望这比修理单间更有用 ValueError .

    首先定义两个占位符变量 X y y_cls 作为 argmax 属于 是的 是的

    然后继续定义权重和偏差。对于重量,你可以选择 tf.Variable 而对于你使用的偏见 tf.constant . 我不认为这是故意的,事实上你希望偏见是不可训练的。 所以请注意:如果你使用 tf.常数 ,您将创建一个将来无法更改的常量值。因此,偏压张量在训练过程中不会更新。请阅读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 有形状 (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函数是 idempotent ,这完全没有效果(除了创建更大的计算图)。所以所有的数字 layer_1 与中相同 . 你再这样做一次 outs . 所以 就跟 .

    然后继续添加另一个激活函数:softmax。此函数的应用程序有点隐藏,因为它与 cross_entropy 是经过计算的。至少可以说,以这种方式将relu激活(或三个)和softmax结合起来是“非常规的”。有趣的是,你用 第1层 作为你的 logits 参数与否 出局

    当你计算你的精度时,你将输出 tf.equal(y_pred, y_cls) 浮16。为什么选择浮动16? tf.equal 返回bool类型,若要使用此掩码进行计算,必须对其进行强制转换。但如果你只想得到总数,那么 int 似乎更合理。然而,我怀疑你并不是真的想把总数当作你的“准确度”,而是真阳性率和样本总数的比值。看一看 tf.metrics.accuracy!

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

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

    我希望你能 training_op n_epochs (但是您将epoch=20传递给此函数) X_train 作为训练数据和地面真相标签 y_train . 为什么你也通过了 X_test y_test 对于训练方法,我不太了解,因为通常你想把训练和测试分为两个不同的步骤。

    sess.run(y_pred, feed_dict={inp: X_test}) . 在feed dict中,指定占位符 inp 价值观 . 但是,您尚未定义占位符 输入 X_检验 作为网络的输入,因此将其用作占位符的值 你在开头定义的。

    然后修改你的整个代码,当你遇到麻烦的时候,你可以自由地提出新的问题。