def test_lecun_init_torch():
    torch = pytest.importorskip("torch")
    nseed = args.seed
    random.seed(nseed)
    torch.manual_seed(nseed)
    numpy.random.seed(nseed)
    os.environ["CHAINER_SEED"] = str(nseed)
    import e2e_asr_attctc_th as m
    model = m.Loss(m.E2E(40, 5, args), 0.5)
    b = model.predictor.ctc.ctc_lo.bias.data.numpy()
    assert numpy.all(b == 0.0)
    w = model.predictor.ctc.ctc_lo.weight.data.numpy()
    numpy.testing.assert_allclose(w.mean(), 0.0, 1e-2, 1e-2)
    numpy.testing.assert_allclose(w.var(), 1.0 / w.shape[1], 1e-2, 1e-2)

    for name, p in model.named_parameters():
        print(name)
        data = p.data.numpy()
        if "embed" in name:
            numpy.testing.assert_allclose(data.mean(), 0.0, 5e-2, 5e-2)
            numpy.testing.assert_allclose(data.var(), 1.0, 5e-2, 5e-2)
        elif "predictor.dec.decoder.0.bias_ih" in name:
            assert data.sum() == data.size // 4
        elif "predictor.dec.decoder.1.bias_ih" in name:
            assert data.sum() == data.size // 4
        elif data.ndim == 1:
            assert numpy.all(data == 0.0)
        else:
            numpy.testing.assert_allclose(data.mean(), 0.0, 5e-2, 5e-2)
            numpy.testing.assert_allclose(
                data.var(), 1.0 / numpy.prod(data.shape[1:]), 5e-2, 5e-2)
def test_lecun_init_chainer():
    nseed = args.seed
    random.seed(nseed)
    numpy.random.seed(nseed)
    os.environ["CHAINER_SEED"] = str(nseed)
    import e2e_asr_attctc as m
    model = m.Loss(m.E2E(40, 5, args), 0.5)
    b = model.predictor.ctc.ctc_lo.b.data
    assert numpy.all(b == 0.0)
    w = model.predictor.ctc.ctc_lo.W.data
    numpy.testing.assert_allclose(w.mean(), 0.0, 1e-2, 1e-2)
    numpy.testing.assert_allclose(w.var(), 1.0 / w.shape[1], 1e-2, 1e-2)

    for name, p in model.namedparams():
        print(name)
        data = p.data
        if "lstm0/upward/b" in name:
            assert data.sum() == data.size // 4
        elif "lstm1/upward/b" in name:
            assert data.sum() == data.size // 4
        elif "embed" in name:
            numpy.testing.assert_allclose(data.mean(), 0.0, 5e-2, 5e-2)
            numpy.testing.assert_allclose(data.var(), 1.0, 5e-2, 5e-2)
        elif data.ndim == 1:
            assert numpy.all(data == 0.0)
        else:
            numpy.testing.assert_allclose(data.mean(), 0.0, 5e-2, 5e-2)
            numpy.testing.assert_allclose(
                data.var(), 1.0 / numpy.prod(data.shape[1:]), 5e-2, 5e-2)
def load_pretrained(self, src_dict, idim, odim, args, train_batch,
                    train_reader):
    dst_dict = self.state_dict()
    for k, v in src_dict.items():
        assert k in dst_dict, k + " not found"
        dst_dict[k] = v
    self.load_state_dict(dst_dict)
    tgt_dict = self.state_dict()
    for k, v in src_dict.items():
        assert (tgt_dict[k] == v).all()

    if args.verbose > 0:
        import e2e_asr_attctc_th as base
        init = base.Loss(base.E2E(idim, odim, args), args.mtlalpha)
        init.load_state_dict(src_dict)
        init.eval()
        self.predictor.eval()
        # test first batch prediction equality
        with open_kaldi_feat(train_batch[0], train_reader) as data:
            init_ctc, init_att, init_acc = init.predictor(data)
            re_ctc, re_att, re_acc = self.predictor(data, supervised=True)
        print("init: ", init_ctc, init_att, init_acc)
        print("re:   ", re_ctc, re_att, re_acc)
        np.testing.assert_almost_equal(init_ctc.data[0], re_ctc.data[0])
        np.testing.assert_almost_equal(init_att.data[0], re_att.data[0])
        np.testing.assert_almost_equal(init_acc, re_acc)
    return self