使用输入管道和tf.keras.preprocessing.image进行数据扩充

时间:2018-06-22 10:40:07

标签: python tensorflow image-processing keras pipeline

我建立了一个标准的cnn在MNIST数据库上进行训练。我设法将数据放入tf.Dateset对象

train_ds = tf.data.Dataset.from_tensor_slices((X_train, y_train))

并使用迭代器根据此数据向网络提供经过改组的批次。

工作正常,但现在我想添加一些数据增强功能。浏览后,我发现模块tf.keras.preprocessing.image具有我需要的所有转换。

为简单起见,我首先尝试使用random_zoom映射所有图像。首先我重塑

def reshape(X, y):
    X_reshaped = tf.reshape(X, [28, 28, 1])
    return (X_reshaped, y)

train_ds_reshaped = train_ds.map(reshape)

然后使用我random_zoom将我的所有数据映射到更改后的新数据

def zoom(X, y):
    X_zoomed = tf.keras.preprocessing.image.random_zoom(X, (0.9, 0.9))   
    return (X_zoomed, y)

train_ds_zoom = train_ds_reshaped.map(zoom)

但是它会引发错误:

      8 
      9 def zoom(X, y):
---> 10     X_zoomed = tf.keras.preprocessing.image.random_zoom(X, (0.9, 0.9))
     11     return (X_zoomed, y)
     12 

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/_impl/keras/preprocessing/image.py in random_zoom(x, zoom_range, row_axis, col_axis, channel_axis, fill_mode, cval)
    211 
    212   h, w = x.shape[row_axis], x.shape[col_axis]
--> 213   transform_matrix = transform_matrix_offset_center(zoom_matrix, h, w)
    214   x = apply_transform(x, transform_matrix, channel_axis, fill_mode, cval)
    215   return x

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/_impl/keras/preprocessing/image.py in transform_matrix_offset_center(matrix, x, y)
    256 
    257 def transform_matrix_offset_center(matrix, x, y):
--> 258   o_x = float(x) / 2 + 0.5
    259   o_y = float(y) / 2 + 0.5
    260   offset_matrix = np.array([[1, 0, o_x], [0, 1, o_y], [0, 0, 1]])

TypeError: float() argument must be a string or a number, not 'Dimension'

tf.keras.preprocessing.image.random_zoom文档中这样写:

  

执行Numpy图像张量的随机空间缩放。

因此,我猜random_zoom想要np张量而不是tf张量。但是我不确定是否是这种情况。

问题。我可以简单地使用tf.keras.preprocessing.image模块转换数据吗?如果不是那么简单,是否还有其他tf模块可以让我以方便的方式进行基本的图像转换?

0 个答案:

没有答案