【问题标题】:TensorFlow TypeError: Value passed to parameter input has DataType uint8 not in list of allowed values: float16, float32TensorFlow TypeError:传递给参数输入的值具有 DataType uint8 不在允许值列表中:float16、float32
【发布时间】:2017-12-03 00:41:43
【问题描述】:

我正在尝试让一个简单的 CNN 训练过去 3 天。

首先,我设置了一个输入管道/队列配置,它从目录树中读取图像并准备批处理。

我在link 获得了此代码。所以,我现在有 train_image_batchtrain_label_batch 需要提供给我的 CNN。

train_image_batch, train_label_batch = tf.train.batch(
        [train_image, train_label],
        batch_size=BATCH_SIZE
        # ,num_threads=1
    )

我不知道怎么做。我正在使用link 给出的 CNN 代码。

# Input Layer
input_layer = tf.reshape(train_image_batch, [-1, IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS])

# Convolutional Layer #1
conv1 = new_conv_layer(input_layer, NUM_CHANNELS, 5, 32, 2)

 # Pooling Layer #1
pool1 = new_pooling_layer(conv1, 2, 2)

打印上的 input_layer 显示了这个

Tensor("Reshape:0", shape=(5, 120, 120, 3), dtype=uint8)

下一行因 TypeError 而崩溃; conv1 = new_conv_layer(...)。 new_conv_layer 函数的主体如下所示

def new_conv_layer(input,              # The previous layer.
               num_input_channels, # Num. channels in prev. layer.
               filter_size,        # Width and height of each filter.
               num_filters,        # Number of filters.
               stride):

# Shape of the filter-weights for the convolution.
# This format is determined by the TensorFlow API.
shape = [filter_size, filter_size, num_input_channels, num_filters]

# Create new weights aka. filters with the given shape.
weights = tf.Variable(tf.truncated_normal(shape, stddev=0.05))

# Create new biases, one for each filter.
biases = tf.Variable(tf.constant(0.05, shape=[num_filters]))

# Create the TensorFlow operation for convolution.
# Note the strides are set to 1 in all dimensions.
# The first and last stride must always be 1,
# because the first is for the image-number and
# the last is for the input-channel.
# But e.g. strides=[1, 2, 2, 1] would mean that the filter
# is moved 2 pixels across the x- and y-axis of the image.
# The padding is set to 'SAME' which means the input image
# is padded with zeroes so the size of the output is the same.
layer = tf.nn.conv2d(input=input,
                     filter=weights,
                     strides=[1, stride, stride, 1],
                     padding='SAME')

# Add the biases to the results of the convolution.
# A bias-value is added to each filter-channel.
layer += biases

# Rectified Linear Unit (ReLU).
# It calculates max(x, 0) for each input pixel x.
# This adds some non-linearity to the formula and allows us
# to learn more complicated functions.
layer = tf.nn.relu(layer)

# Note that ReLU is normally executed before the pooling,
# but since relu(max_pool(x)) == max_pool(relu(x)) we can
# save 75% of the relu-operations by max-pooling first.

# We return both the resulting layer and the filter-weights
# because we will plot the weights later.
return layer, weights

正是它在 tf.nn.conv2d 崩溃并出现此错误

TypeError:传递给参数“input”的值的 DataType uint8 不在允许值列表中:float16、float32

【问题讨论】:

    标签: python machine-learning tensorflow neural-network


    【解决方案1】:

    您需要将您的图像从int 投射到float,您只需对输入图像执行此操作即可。

     image = image.astype('float')
    

    对我来说很好用。

    【讨论】:

      【解决方案2】:

      输入管道中的图像类型为“uint8”,您需要将其类型转换为“float32”,您可以在图像 jpeg 解码器之后执行此操作:

      image = tf.image.decode_jpeg(...
      image = tf.cast(image, tf.float32)
      

      【讨论】:

      • 天哪!在我到处阅读的任何 TF 教程中,从来没有人提到过。非常感谢!
      • 有什么理由不使用tf.float16?对于 8 位值,大小就足够了。 float32 更快吗?
      • @Czechnology,您也可以使用 float16。 tf.nn.conv 的输出返回与输入相同的类型。所以在这种情况下,输出也将是 float16,这是一个降低的精度,不推荐使用(除非您需要它来减少内存占用但精度较低)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多