我建立了一个标准的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
模块可以让我以方便的方式进行基本的图像转换?