@@ -60,7 +60,11 @@ namespace Tensorflow | |||||
public Tensor resize_images_v2(Tensor images, TensorShape size, string method = ResizeMethod.BILINEAR, bool preserve_aspect_ratio = false, bool antialias = false, | public Tensor resize_images_v2(Tensor images, TensorShape size, string method = ResizeMethod.BILINEAR, bool preserve_aspect_ratio = false, bool antialias = false, | ||||
string name = null) | string name = null) | ||||
=> image_ops_impl.resize_images(images, tf.constant(size.dims), method, preserve_aspect_ratio, antialias, name); | |||||
=> image_ops_impl.resize_images_v2(images, size, method, preserve_aspect_ratio, antialias, name); | |||||
public Tensor resize_images_v2(Tensor images, Tensor size, string method = ResizeMethod.BILINEAR, bool preserve_aspect_ratio = false, bool antialias = false, | |||||
string name = null) | |||||
=> image_ops_impl.resize_images_v2(images, size, method, preserve_aspect_ratio, antialias, name); | |||||
public Tensor resize_images_with_pad(Tensor image, int target_height, int target_width, string method, bool antialias) | public Tensor resize_images_with_pad(Tensor image, int target_height, int target_width, string method, bool antialias) | ||||
=> image_ops_impl.resize_images_with_pad(image, target_height, target_width, method, antialias); | => image_ops_impl.resize_images_with_pad(image, target_height, target_width, method, antialias); | ||||
@@ -209,6 +213,9 @@ namespace Tensorflow | |||||
public Tensor resize(Tensor image, TensorShape size, string method = ResizeMethod.BILINEAR) | public Tensor resize(Tensor image, TensorShape size, string method = ResizeMethod.BILINEAR) | ||||
=> image_ops_impl.resize_images_v2(image, size, method: method); | => image_ops_impl.resize_images_v2(image, size, method: method); | ||||
public Tensor resize(Tensor image, Tensor size, string method = ResizeMethod.BILINEAR) | |||||
=> image_ops_impl.resize_images_v2(image, size, method: method); | |||||
public Tensor resize_bilinear(Tensor images, Tensor size, bool align_corners = false, bool half_pixel_centers = false, string name = null) | public Tensor resize_bilinear(Tensor images, Tensor size, bool align_corners = false, bool half_pixel_centers = false, string name = null) | ||||
=> gen_image_ops.resize_bilinear(images, size, align_corners: align_corners, half_pixel_centers: half_pixel_centers, name: name); | => gen_image_ops.resize_bilinear(images, size, align_corners: align_corners, half_pixel_centers: half_pixel_centers, name: name); | ||||
@@ -175,11 +175,12 @@ namespace Tensorflow | |||||
{ | { | ||||
if (tf.Context.executing_eagerly()) | if (tf.Context.executing_eagerly()) | ||||
{ | { | ||||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||||
/*var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||||
"Pad", name, | "Pad", name, | ||||
null, | null, | ||||
input, paddings); | input, paddings); | ||||
return results[0]; | |||||
return results[0];*/ | |||||
return pad_eager_fallback(input, paddings, name: name, ctx: tf.Context); | |||||
} | } | ||||
var _op = tf.OpDefLib._apply_op_helper("Pad", name: name, args: new { input, paddings }); | var _op = tf.OpDefLib._apply_op_helper("Pad", name: name, args: new { input, paddings }); | ||||
@@ -187,6 +188,19 @@ namespace Tensorflow | |||||
return _op.output; | return _op.output; | ||||
} | } | ||||
private static Tensor pad_eager_fallback(Tensor inputs, Tensor padding, string name = null, Context ctx = null) | |||||
{ | |||||
var (_attr_T, input) = tf.Runner.ArgsToMatchingEager(ctx, args: new[] { inputs }); | |||||
var (_attr_Tpaddings, paddings) = tf.Runner.ArgsToMatchingEager(ctx, default_dtype: tf.int32, args: new[] { padding }); | |||||
var _inputs_flat = input.concat(paddings); | |||||
var _attrs = new object[] { "T", _attr_T, "Tpaddings", _attr_Tpaddings }; | |||||
var results = tf.Runner.Execute(ctx, "Pad", 1, _inputs_flat, _attrs, name: name); | |||||
if (tf.Runner.MustRecordGradient()) | |||||
tf.Runner.RecordGradient("Pad", _inputs_flat, _attrs, results); | |||||
return results[0]; | |||||
} | |||||
public static Tensor pack(Tensor[] values, int axis = 0, string name = null) | public static Tensor pack(Tensor[] values, int axis = 0, string name = null) | ||||
{ | { | ||||
if (tf.Context.executing_eagerly()) | if (tf.Context.executing_eagerly()) | ||||
@@ -2210,7 +2210,7 @@ new_height, new_width"); | |||||
/// <param name="antialias"></param> | /// <param name="antialias"></param> | ||||
/// <param name="name"></param> | /// <param name="name"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public static Tensor resize_images_v2(Tensor images, TensorShape size, string method = ResizeMethod.BILINEAR, | |||||
public static Tensor resize_images_v2<T>(Tensor images, T size, string method = ResizeMethod.BILINEAR, | |||||
bool preserve_aspect_ratio = false, | bool preserve_aspect_ratio = false, | ||||
bool antialias = false, | bool antialias = false, | ||||
string name = null) | string name = null) | ||||
@@ -183,5 +183,48 @@ namespace Tensorflow.Keras | |||||
throw new NotImplementedException(""); | throw new NotImplementedException(""); | ||||
} | } | ||||
/// <summary> | |||||
/// Resizes the images contained in a 4D tensor. | |||||
/// </summary> | |||||
/// <param name="x"></param> | |||||
/// <param name="height_factor"></param> | |||||
/// <param name="width_factor"></param> | |||||
/// <param name="data_format"></param> | |||||
/// <param name="interpolation"></param> | |||||
/// <returns></returns> | |||||
public Tensor resize_images(Tensor x, int height_factor, int width_factor, | |||||
string data_format, string interpolation = "nearest") | |||||
{ | |||||
var (rows, cols) = (0, 0); | |||||
if (data_format == "channels_first") | |||||
(rows, cols) = (2, 3); | |||||
else if (data_format == "channels_last") | |||||
(rows, cols) = (1, 2); | |||||
else | |||||
throw new ValueError($"Invalid `data_format` argument: {data_format}"); | |||||
var original_shape = x.shape; | |||||
var new_shape = array_ops.shape(x)[new Slice(rows, cols + 1)]; | |||||
new_shape *= constant_op.constant(np.array(height_factor, width_factor)); | |||||
if (data_format == "channels_first") | |||||
// x = permute_dimensions(x, [0, 2, 3, 1]); | |||||
throw new NotImplementedException(""); | |||||
if (interpolation == "nearest") | |||||
x = tf.image.resize_images_v2(x, new_shape, method: ResizeMethod.NEAREST_NEIGHBOR); | |||||
if (data_format == "channels_first") | |||||
// x = permute_dimensions(x, [0, 3, 1, 2]); | |||||
throw new NotImplementedException(""); | |||||
int new_height = original_shape[rows] < 0 ? -1 : original_shape[rows] * height_factor; | |||||
int new_width = original_shape[cols] < 0 ? -1 : original_shape[cols] * width_factor; | |||||
TensorShape output_shape = data_format == "channels_first" ? | |||||
(-1, -1, new_height, new_width) : (-1, new_height, new_width, -1); | |||||
x.set_shape(output_shape); | |||||
return x; | |||||
} | |||||
} | } | ||||
} | } |