Skip to main content
 首页 » 编程设计

python之Tensorflow 属性错误 : 'numpy.float32' object has no attribute 'value'

2024年09月03日27arxive

我正在使用此代码作为基础,并希望通过 Tensorboard 中的损失查看学习进度。添加作者并尝试添加摘要后,我收到标题中显示的上述错误。

""" Convolutional Neural Network. 
 
Build and train a convolutional neural network with TensorFlow. 
This example is using the MNIST database of handwritten digits 
(http://yann.lecun.com/exdb/mnist/) 
 
Author: Aymeric Damien 
Project: https://github.com/aymericdamien/TensorFlow-Examples/ 
""" 
 
from __future__ import division, print_function, absolute_import 
 
import tensorflow as tf 
 
# Import MNIST data 
from tensorflow.examples.tutorials.mnist import input_data 
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) 
 
# Training Parameters 
learning_rate = 0.001 
num_steps = 200 
batch_size = 128 
display_step = 10 
 
# Network Parameters 
num_input = 784 # MNIST data input (img shape: 28*28) 
num_classes = 10 # MNIST total classes (0-9 digits) 
dropout = 0.75 # Dropout, probability to keep units 
 
# tf Graph input 
X = tf.placeholder(tf.float32, [None, num_input]) 
Y = tf.placeholder(tf.float32, [None, num_classes]) 
keep_prob = tf.placeholder(tf.float32) # dropout (keep probability) 
 
 
# Create some wrappers for simplicity 
def conv2d(x, W, b, strides=1): 
    # Conv2D wrapper, with bias and relu activation 
    x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME') 
    x = tf.nn.bias_add(x, b) 
    return tf.nn.relu(x) 
 
 
def maxpool2d(x, k=2): 
    # MaxPool2D wrapper 
    return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1], 
                          padding='SAME') 
 
 
# Create model 
def conv_net(x, weights, biases, dropout): 
    # MNIST data input is a 1-D vector of 784 features (28*28 pixels) 
    # Reshape to match picture format [Height x Width x Channel] 
    # Tensor input become 4-D: [Batch Size, Height, Width, Channel] 
    x = tf.reshape(x, shape=[-1, 28, 28, 1]) 
 
    # Convolution Layer 
    conv1 = conv2d(x, weights['wc1'], biases['bc1']) 
    # Max Pooling (down-sampling) 
    conv1 = maxpool2d(conv1, k=2) 
 
    # Convolution Layer 
    conv2 = conv2d(conv1, weights['wc2'], biases['bc2']) 
    # Max Pooling (down-sampling) 
    conv2 = maxpool2d(conv2, k=2) 
 
    # Fully connected layer 
    # Reshape conv2 output to fit fully connected layer input 
    fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]]) 
    fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1']) 
    fc1 = tf.nn.relu(fc1) 
    # Apply Dropout 
    fc1 = tf.nn.dropout(fc1, dropout) 
 
    # Output, class prediction 
    out = tf.add(tf.matmul(fc1, weights['out']), biases['out']) 
    return out 
 
# Store layers weight & bias 
weights = { 
    # 5x5 conv, 1 input, 32 outputs 
    'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])), 
    # 5x5 conv, 32 inputs, 64 outputs 
    'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])), 
    # fully connected, 7*7*64 inputs, 1024 outputs 
    'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])), 
    # 1024 inputs, 10 outputs (class prediction) 
    'out': tf.Variable(tf.random_normal([1024, num_classes])) 
} 
 
biases = { 
    'bc1': tf.Variable(tf.random_normal([32])), 
    'bc2': tf.Variable(tf.random_normal([64])), 
    'bd1': tf.Variable(tf.random_normal([1024])), 
    'out': tf.Variable(tf.random_normal([num_classes])) 
} 
 
# Construct model 
logits = conv_net(X, weights, biases, keep_prob) 
prediction = tf.nn.softmax(logits) 
 
# Define loss and optimizer 
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits( 
    logits=logits, labels=Y)) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) 
train_op = optimizer.minimize(loss_op) 
 
 
# Evaluate model 
correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) 
 
# Initialize the variables (i.e. assign their default value) 
init = tf.global_variables_initializer() 
 
# Start training 
with tf.Session() as sess: 
 
    # Run the initializer 
    sess.run(init) 
 
    for step in range(1, num_steps+1): 
        batch_x, batch_y = mnist.train.next_batch(batch_size) 
        # Run optimization op (backprop) 
        sess.run(train_op, feed_dict={X: batch_x, Y: batch_y, keep_prob: 0.8}) 
        if step % display_step == 0 or step == 1: 
            # Calculate batch loss and accuracy 
            loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, 
                                                                 Y: batch_y, 
                                                                 keep_prob: 1.0}) 
            print("Step " + str(step) + ", Minibatch Loss= " + \ 
                  "{:.4f}".format(loss) + ", Training Accuracy= " + \ 
                  "{:.3f}".format(acc)) 
 
    print("Optimization Finished!") 
 
    # Calculate accuracy for 256 MNIST test images 
    print("Testing Accuracy:", \ 
        sess.run(accuracy, feed_dict={X: mnist.test.images[:256], 
                                      Y: mnist.test.labels[:256], 
                                      keep_prob: 1.0})) 

运行它完全正常,然后我添加了 writer 变量以写入我操作系统的根 tmp 目录。

# Start training 
with tf.Session() as sess: 
 
    writer = tf.summary.FileWriter("/tmp/log/", graph=sess.graph) 
 
    # Run the initializer 
    sess.run(init) 
 
    for step in range(1, num_steps+1): 
        batch_x, batch_y = mnist.train.next_batch(batch_size) 
        # Run optimization op (backprop) 
        sess.run(train_op, feed_dict={X: batch_x, Y: batch_y, keep_prob: 0.8}) 
        if step % display_step == 0 or step == 1: 
            # Calculate batch loss and accuracy 
            summary, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, 
                                                                 Y: batch_y, 
                                                                 keep_prob: 1.0}) 
            print("Step " + str(step) + ", Minibatch Loss= " + \ 
                  "{:.4f}".format(summary) + ", Training Accuracy= " + \ 
                  "{:.3f}".format(acc)) 
 
            writer.add_summary(summary=summary, global_step=step) 
            writer.flush() 
        writer.close() 
 
    print("Optimization Finished!") 
 
    # Calculate accuracy for 256 MNIST test images 
    print("Testing Accuracy:", \ 
        sess.run(accuracy, feed_dict={X: mnist.test.images[:256], 
                                      Y: mnist.test.labels[:256], 
                                      keep_prob: 1.0})) 

但那是错误发生的时候。我到底做错了什么,需要应用什么更正来解决这个问题。我对 Tensorflow 还是很陌生,但我之前使用过摘要编写器,没有出现此错误。

我也使用了本教程,希望能解决这个问题: https://www.tensorflow.org/guide/summaries_and_tensorboard

错误只是为了让每个人都知道罪魁祸首

Step 1, Minibatch Loss= 98733.8750, Training Accuracy= 0.102 
Traceback (most recent call last): 
  File "convolutional_network_raw.py", line 137, in <module> 
    writer.add_summary(summary=summary, global_step=step) 
  File "/home/kyle/.conda/envs/csc/lib/python3.6/site-packages/tensorflow/python/summary/writer/writer.py", line 126, in add_summary 
    for value in summary.value: 
AttributeError: 'numpy.float32' object has no attribute 'value' 

请您参考如下方法:

进入文件编写器的摘要是一个 tf.Summary 对象。您需要先将损失值转换为摘要对象,如下所示(还要更改打印中的变量,以免出错):

        loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, 
                                                             Y: batch_y, 
                                                             keep_prob: 1.0}) 
        summary = tf.Summary(value=[tf.Summary.Value(tag="loss", simple_value=loss)]) 
        print("Step " + str(step) + ", Minibatch Loss= " + \ 
              "{:.4f}".format(loss) + ", Training Accuracy= " + \ 
              "{:.3f}".format(acc))