【问题标题】:got shape [4575, 32, 32, 3], but wanted [4575] Tensorflow得到了形状 [4575, 32, 32, 3],但想要 [4575] Tensorflow
【发布时间】:2017-12-01 04:02:52
【问题描述】:

我是 Tensorflow 的新手。我按照这个主题创建了 Tensorflow 的 CNN:A Guide to TF Layers: Building a Convolutional Neural Network

我想创建 CNN 来使用它来训练交通标志数据集。我使用的数据集是:BelgiumTS。它包括两部分,一部分存储用于训练的图像,第二部分存储用于测试的图像。所有这些都是 .ppm 格式。

我定义了一个加载数据集的方法:

def load_data(data_dir):
"""Load Data and return two numpy array"""
directories = [d for d in os.listdir(data_dir) if os.path.isdir(os.path.join(data_dir,d))]

list_labels = []
list_images = []

for d in directories:
    label_dir = os.path.join(data_dir,d)
    file_names = [os.path.join(label_dir,f) for f in os.listdir(label_dir) if f.endswith(".ppm")]

    for f in file_names:
        list_images.append(skimage.data.imread(f))
        list_labels.append(int(d))
 #resize images to 32x32 pixel       
list_images32 = [skimage.transform.resize(image,(32,32)) for image in list_images]

#Got Error "Value passed to parameter 'input' has DataType float64 not in list of allowed values: float16, float32" if I don't add this line
list_images32 = tf.cast(list_images32,tf.float32)

images = np.array(list_images32)
labels = np.asarray(list_labels,dtype=int32)

return images,labels

这是 CNN 定义的:

def cnn_model_fn(features, labels, mode):
#Input layer
input_layer = tf.reshape(features["x"],[-1,32,32,1])

#Convolutional layer 1
conv1 = tf.layers.conv2d(
    inputs=input_layer,
    filters=32,
    kernel_size=[5,5],
    padding="same",
    activation=tf.nn.relu)

#Pooling layer 1
pool1 = tf.layers.max_pooling2d(inputs=conv1,pool_size=[2,2],strides=2)

#Convolutional layer 2
conv2 = tf.layers.conv2d(
    inputs=pool1,
    filters=64,
    kernel_size=[5,5],
    padding="same",
    activation=tf.nn.relu)

#Pooling layer 2
pool2 = tf.layers.max_pooling2d(inputs=conv2,pool_size=[2,2],strides=2)

#Dense layer
pool2_flat = tf.reshape(pool2,[-1,7*7*64])
dense = tf.layers.dense(inputs=pool2_flat,units=1024,activation=tf.nn.relu)

#Dropout
dropout = tf.layers.dropout(inputs=dense,rate=0.4,training=mode == tf.estimator.ModeKeys.TRAIN)

#Logits layer
logits = tf.layers.dense(inputs=dropout,units=10)

predictions = {
    "classes": tf.argmax(input=logits,axis=1),
    "probabilities": tf.nn.softmax(logits,name="softmax_tensor")
    }

if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode,predictions=predictions)

#Calculate Loss Value
onehot_labels = tf.one_hot(indices=tf.cast(labels,tf.int32),depth=10)
loss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels,logits=logits)

if mode == tf.estimator.ModeKeys.TRAIN:
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
    train_op = optimizer.minimize(
        loss = loss,
        global_step = tf.train.get_global_step())
    return tf.estimator.EstimatorSpec(mode=mode,loss=loss,train_op=train_op)

eval_metric_ops = {
    "accuracy": tf.metrics.accuracy(
        labels=labels,predictions=predictions["classes"])}
return tf.estimator.EstimatorSpec(mode=mode,loss=loss,eval_metric_ops=eval_metric_ops)

我在 main 中运行我的应用程序:

def main(unused_argv):
   # Load training and eval data
   train_data_dir = "W:/Projects/AutoDrive/Training"
   test_data_dir = "W:/Projects/AutoDrive/Testing"

   images,labels = load_data(train_data_dir) 
   test_images,test_labels = load_data(test_data_dir)


   # Create the Estimator
   autoDrive_classifier = tf.estimator.Estimator(
  model_fn=cnn_model_fn, model_dir="/tmp/autoDrive_convnet_model")

   # Set up logging for predictions
   # Log the values in the "Softmax" tensor with label "probabilities"
   tensors_to_log = {"probabilities": "softmax_tensor"}
   logging_hook = tf.train.LoggingTensorHook(
  tensors=tensors_to_log, every_n_iter=50)

   # Train the model
   train_input_fn = tf.estimator.inputs.numpy_input_fn(
                               x={"x": images},
                               y=labels,
                               batch_size=100,
                               num_epochs=None,
                               shuffle=True)
   autoDrive_classifier.train(
            input_fn=train_input_fn,
            steps=10000,
            hooks=[logging_hook])

   # Evaluate the model and print results
   eval_input_fn = tf.estimator.inputs.numpy_input_fn(
                              x={"x": test_images},
                              y=test_labels,
                              num_epochs=1,
                              shuffle=False)
   eval_results = autoDrive_classifier.evaluate(input_fn=eval_input_fn)
   print(eval_results)

但是当我运行它时,我得到了这个错误:ValueError: Argument must be a dense tensor ... got shape [4575, 32, 32, 3], but Wanted [4575] 做到了我丢了东西?

最后,这是完整的代码:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import numpy as np
import tensorflow as tf
import os
import skimage.data
import skimage.transform
import matplotlib
import matplotlib.pyplot as plt

tf.logging.set_verbosity(tf.logging.INFO)

def load_data(data_dir):
    """Load Data and return two lists"""
    directories = [d for d in os.listdir(data_dir) if 
    os.path.isdir(os.path.join(data_dir,d))]

    list_labels = []
    list_images = []

    for d in directories:
        label_dir = os.path.join(data_dir,d)
        file_names = [os.path.join(label_dir,f) for f in os.listdir(label_dir) if f.endswith(".ppm")]

    for f in file_names:
        list_images.append(skimage.data.imread(f))
        list_labels.append(int(d))

    list_images32 = [skimage.transform.resize(image,(32,32)) for image in list_images]
    list_images32 = tf.cast(list_images32,tf.float32)
    images = np.array(list_images32)
    labels = np.asarray(list_labels,dtype=int32)

    return images,labels

def cnn_model_fn(features, labels, mode):
    #Input layer
    input_layer = tf.reshape(features["x"],[-1,32,32,1])

    #Convolutional layer 1
    conv1 = tf.layers.conv2d(
    inputs=input_layer,
    filters=32,
    kernel_size=[5,5],
    padding="same",
    activation=tf.nn.relu)

   #Pooling layer 1
   pool1 = tf.layers.max_pooling2d(inputs=conv1,pool_size=[2,2],strides=2)

   #Convolutional layer 2
   conv2 = tf.layers.conv2d(
    inputs=pool1,
    filters=64,
    kernel_size=[5,5],
    padding="same",
    activation=tf.nn.relu)

  #Pooling layer 2
  pool2 = tf.layers.max_pooling2d(inputs=conv2,pool_size=[2,2],strides=2)

  #Dense layer
  pool2_flat = tf.reshape(pool2,[-1,7*7*64])
  dense = tf.layers.dense(inputs=pool2_flat,units=1024,activation=tf.nn.relu)

  #Dropout
  dropout = tf.layers.dropout(inputs=dense,rate=0.4,training=mode == tf.estimator.ModeKeys.TRAIN)

  #Logits layer
  logits = tf.layers.dense(inputs=dropout,units=10)

  predictions = {
    "classes": tf.argmax(input=logits,axis=1),
    "probabilities": tf.nn.softmax(logits,name="softmax_tensor")
    }

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode,predictions=predictions)

  #Calculate Loss Value
  onehot_labels = tf.one_hot(indices=tf.cast(labels,tf.int32),depth=10)
  loss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels,logits=logits)

  if mode == tf.estimator.ModeKeys.TRAIN:
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
    train_op = optimizer.minimize(
        loss = loss,
        global_step = tf.train.get_global_step())
    return tf.estimator.EstimatorSpec(mode=mode,loss=loss,train_op=train_op)

  eval_metric_ops = {
    "accuracy": tf.metrics.accuracy(
        labels=labels,predictions=predictions["classes"])}
  return tf.estimator.EstimatorSpec(mode=mode,loss=loss,eval_metric_ops=eval_metric_ops)


  def main(unused_argv):
      # Load training and eval data
      train_data_dir = "W:/Projects/TSRecognition/Training"
      test_data_dir = "W:/Projects/TSRecognition/Testing"

      images,labels = load_data(train_data_dir) 
      test_images,test_labels = load_data(test_data_dir)


      # Create the Estimator
      TSRecognition_classifier = tf.estimator.Estimator(
      model_fn=cnn_model_fn, model_dir="/tmp/TSRecognition_convnet_model")

      # Set up logging for predictions
      # Log the values in the "Softmax" tensor with label "probabilities"
      tensors_to_log = {"probabilities": "softmax_tensor"}
      logging_hook = tf.train.LoggingTensorHook(
      tensors=tensors_to_log, every_n_iter=50)

      # Train the model
      train_input_fn = tf.estimator.inputs.numpy_input_fn(
                           x={"x": images},
                           y=labels,
                           batch_size=100,
                           num_epochs=None,
                           shuffle=True)
      TSRecognition_classifier.train(
             input_fn=train_input_fn,
             steps=10000,
             hooks=[logging_hook])

      # Evaluate the model and print results
      eval_input_fn = tf.estimator.inputs.numpy_input_fn(
                            x={"x": test_images},
                            y=test_labels,
                            num_epochs=1,
                            shuffle=False)
      eval_results = TSRecognition_classifier.evaluate(input_fn=eval_input_fn)
      print(eval_results)

if __name__ == "__main__":
tf.app.run()

【问题讨论】:

  • 你能发布完整的错误,指出它发生在哪一行吗?
  • 当然可以,但是完整的错误非常非常长。我只能展示其中的一部分:...,[0.33944547, 0.36223958, 0.21651348], [0.36325061, 0.39558824, 0.2814951], [0.26700368, 0.3114277, 0.23193934]] 3],但想要 [282]。

标签: tensorflow convolution object-detection traffic


【解决方案1】:

您的代码的简短答案:

去掉load_data 函数中的np.array 和np.asarray 调用。特别是改变:

list_images32 = [skimage.transform.resize(image,(32,32)) for image in list_images]

...到...

list_images32 = [skimage.transform.resize(image,(32,32)).astype(np.float32).tolist() for image in list_images]

...并从您的 load_data 函数返回 list_images32 AS IS。不要用 np.asarray() 调用“包装它”。 我的建议中的tolist() 部分很重要。 对于astype() 调用,我只是建议在numpy 中做一些你在TensorFlow 中所做的事情。

只需删除您在list_labels 上的np.asarray 就足够您的标签了。

为那些想要了解正在发生的事情的人提供完整的答案......

TensorFlow (tensor_util.py) 中恰好一个地方抛出了“got shape...but Wanted”异常,原因是这个函数:

def _GetDenseDimensions(list_of_lists):
   """Returns the inferred dense dimensions of a list of lists."""
   if not isinstance(list_of_lists, (list, tuple)):
     return []
   elif not list_of_lists:
     return [0]
   else:
     return [len(list_of_lists)] + _GetDenseDimensions(list_of_lists[0])

它试图遍历它所假定的嵌套 plain Python 列表或 plain Python 元组;由于np.array/np.asarray 调用,它不知道如何处理它在您的数据结构中找到的 Numpy 数组类型。

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2022-01-02
    • 2020-01-22
    • 2017-05-24
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多