def test_layer_forward_pass_insensitive_to_internal_state_init(layer_specs): layer, specs = layer_specs layer_buffers = set_up_layer(layer, specs) time_steps = specs.get('time_steps', 3) eps = specs.get('eps', 1e-8) layer.forward_pass(layer_buffers) # get outputs after normal forward pass outputs = {} for key, value in layer_buffers.outputs.items(): outputs[key] = HANDLER.get_numpy_copy(value) # randomize internal state for internal, shape_template in layer.internal_shapes.items(): value = layer_buffers.internals[internal] if shape_template.scales_with_time: # exclude context slice HANDLER.set_from_numpy( value[:time_steps], np.random.randn(time_steps, *value.shape[1:])) else: HANDLER.set_from_numpy(value, np.random.randn(*value.shape)) # compare new output layer.forward_pass(layer_buffers) for key, value in layer_buffers.outputs.items(): assert np.allclose(outputs[key], HANDLER.get_numpy_copy(value), rtol=eps, atol=eps), internal
def test_layer_backward_pass_insensitive_to_internal_state_init(layer_specs): layer, specs = layer_specs layer_buffers = set_up_layer(layer, specs) time_steps = specs.get('time_steps', 3) eps = specs.get('eps', 1e-8) layer.forward_pass(layer_buffers) layer.backward_pass(layer_buffers) # get deltas after normal backward pass deltas = {} for key, value in layer_buffers.input_deltas.items(): deltas[key] = HANDLER.get_numpy_copy(value) # randomize internal state for internal, shape_template in layer.internal_shapes.items(): value = layer_buffers.internals[internal] if shape_template.scales_with_time: # exclude context slice HANDLER.set_from_numpy( value[:time_steps], np.random.randn(time_steps, *value.shape[1:])) else: HANDLER.set_from_numpy(value, np.random.randn(*value.shape)) # clear deltas for k, v in layer_buffers.input_deltas.items(): HANDLER.fill(v, 0.0) # compare new deltas layer.forward_pass(layer_buffers) layer.backward_pass(layer_buffers) for key, value in layer_buffers.input_deltas.items(): assert np.allclose(deltas[key], HANDLER.get_numpy_copy(value), rtol=eps, atol=eps), \ "Failed for internal.{} when inspecting {}".format(internal, key)
def f(x): flat_inputs = inputs.reshape((size,)) HANDLER.set_from_numpy(flat_inputs, x) HANDLER.fill(outputs, 0.) fwd(inputs, outputs) return HANDLER.get_numpy_copy(outputs).sum()
def f(x): flat_inputs = inputs.reshape((size, )) HANDLER.set_from_numpy(flat_inputs, x) HANDLER.fill(outputs, 0.) fwd(inputs, outputs) return HANDLER.get_numpy_copy(outputs).sum()