Add s_variable_scale_2x (Task 307, 262/262): ConvTranspose stride-2 upscale
Browse files
own-solver/neurogolf_solver/solvers/wave5.py
CHANGED
|
@@ -366,3 +366,57 @@ def s_symmetry_check_lr(td):
|
|
| 366 |
y = oh.make_tensor_value_info("output", TensorProto.FLOAT, [1, 10, 30, 30])
|
| 367 |
g = oh.make_graph(nodes, "g", [x], [y], initializer=inits)
|
| 368 |
return oh.make_model(g, ir_version=8, opset_imports=[oh.make_opsetid("", 17)])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 366 |
y = oh.make_tensor_value_info("output", TensorProto.FLOAT, [1, 10, 30, 30])
|
| 367 |
g = oh.make_graph(nodes, "g", [x], [y], initializer=inits)
|
| 368 |
return oh.make_model(g, ir_version=8, opset_imports=[oh.make_opsetid("", 17)])
|
| 369 |
+
|
| 370 |
+
|
| 371 |
+
|
| 372 |
+
def s_variable_scale_2x(td):
|
| 373 |
+
"""Variable-shape scale 2x: each pixel becomes a 2x2 block. Output = 2H x 2W."""
|
| 374 |
+
exs = get_exs(td)
|
| 375 |
+
for inp, out in exs:
|
| 376 |
+
h, w = inp.shape
|
| 377 |
+
if out.shape != (2 * h, 2 * w):
|
| 378 |
+
return None
|
| 379 |
+
if not np.array_equal(np.repeat(np.repeat(inp, 2, axis=0), 2, axis=1), out):
|
| 380 |
+
return None
|
| 381 |
+
if len(exs) < 2:
|
| 382 |
+
return None
|
| 383 |
+
if any(out.shape[0] > 30 or out.shape[1] > 30 for _, out in exs):
|
| 384 |
+
return None
|
| 385 |
+
kernel = np.ones((10, 1, 2, 2), dtype=np.float32)
|
| 386 |
+
inits = [
|
| 387 |
+
onh.from_array(kernel, 'up_kernel'),
|
| 388 |
+
onh.from_array(np.array([1], dtype=np.int64), 'axes_1'),
|
| 389 |
+
onh.from_array(np.array([2], dtype=np.int64), 'axes_2'),
|
| 390 |
+
onh.from_array(np.array([3], dtype=np.int64), 'axes_3'),
|
| 391 |
+
onh.from_array(np.array([], dtype=np.int64), 'scalar_shape'),
|
| 392 |
+
onh.from_array(np.float32(2.0), 'two_f'),
|
| 393 |
+
onh.from_array(np.arange(30, dtype=np.float32).reshape(1, 1, 30, 1), 'row_pos'),
|
| 394 |
+
onh.from_array(np.arange(30, dtype=np.float32).reshape(1, 1, 1, 30), 'col_pos'),
|
| 395 |
+
onh.from_array(np.array([0, 0], dtype=np.int64), 'sl_st'),
|
| 396 |
+
onh.from_array(np.array([30, 30], dtype=np.int64), 'sl_en'),
|
| 397 |
+
onh.from_array(np.array([2, 3], dtype=np.int64), 'sl_ax'),
|
| 398 |
+
]
|
| 399 |
+
nodes = [
|
| 400 |
+
oh.make_node('ConvTranspose', ['input', 'up_kernel'], ['upscaled'],
|
| 401 |
+
kernel_shape=[2, 2], strides=[2, 2], group=10),
|
| 402 |
+
oh.make_node('Slice', ['upscaled', 'sl_st', 'sl_en', 'sl_ax'], ['sliced']),
|
| 403 |
+
oh.make_node('ReduceSum', ['input', 'axes_1'], ['presence'], keepdims=1),
|
| 404 |
+
oh.make_node('ReduceMax', ['presence'], ['row_has'], axes=[3], keepdims=1),
|
| 405 |
+
oh.make_node('ReduceSum', ['row_has', 'axes_2'], ['h_nd']),
|
| 406 |
+
oh.make_node('Reshape', ['h_nd', 'scalar_shape'], ['h_f']),
|
| 407 |
+
oh.make_node('ReduceMax', ['presence'], ['col_has'], axes=[2], keepdims=1),
|
| 408 |
+
oh.make_node('ReduceSum', ['col_has', 'axes_3'], ['w_nd']),
|
| 409 |
+
oh.make_node('Reshape', ['w_nd', 'scalar_shape'], ['w_f']),
|
| 410 |
+
oh.make_node('Mul', ['h_f', 'two_f'], ['oh_f']),
|
| 411 |
+
oh.make_node('Mul', ['w_f', 'two_f'], ['ow_f']),
|
| 412 |
+
oh.make_node('Less', ['row_pos', 'oh_f'], ['row_mask_b']),
|
| 413 |
+
oh.make_node('Cast', ['row_mask_b'], ['row_mask'], to=TensorProto.FLOAT),
|
| 414 |
+
oh.make_node('Less', ['col_pos', 'ow_f'], ['col_mask_b']),
|
| 415 |
+
oh.make_node('Cast', ['col_mask_b'], ['col_mask'], to=TensorProto.FLOAT),
|
| 416 |
+
oh.make_node('Mul', ['row_mask', 'col_mask'], ['grid_mask']),
|
| 417 |
+
oh.make_node('Mul', ['sliced', 'grid_mask'], ['output']),
|
| 418 |
+
]
|
| 419 |
+
x = oh.make_tensor_value_info("input", TensorProto.FLOAT, [1, 10, 30, 30])
|
| 420 |
+
y = oh.make_tensor_value_info("output", TensorProto.FLOAT, [1, 10, 30, 30])
|
| 421 |
+
g = oh.make_graph(nodes, "g", [x], [y], initializer=inits)
|
| 422 |
+
return oh.make_model(g, ir_version=8, opset_imports=[oh.make_opsetid("", 17)])
|