In [1]:
def unpack_maybe_tuple(x):
    if hasattr(x, '__getitem__'):
        return x
    return (x, x)

In [2]:
def out_size(in_size, k, stride=1, pad=0):
    in_h, in_w = unpack_maybe_tuple(in_size)
    k_h, k_w = unpack_maybe_tuple(k)
    s_h, s_w = unpack_maybe_tuple(stride)
    p_h, p_w = unpack_maybe_tuple(pad)
    out_w = (in_w + 2 * p_w - k_w) / s_w + 1
    out_h = (in_h + 2 * p_h - k_h) / s_h + 1
    return (out_h, out_w)

In [3]:
in_size = (96, 192)

In [4]:
c1 = out_size(in_size, 11, stride=3, pad=1)
print(c1)


(30.0, 62.0)

In [64]:
p1 = out_size(c1, (3, 5), stride=2)
print(p1)


(11.0, 22.0)

In [65]:
c2 = out_size(p1, (1, 2), stride=(1, 2))
print(c2)


(11.0, 11.0)

In [66]:
c3 = out_size(c2, 5, stride=2, pad=1)
print(c3)


(5.0, 5.0)

In [67]:
p3 = out_size(c3, 3, stride=2, pad=1)
print(p3)


(3.0, 3.0)

In [68]:
c4 = out_size(p3, 3, pad=1)
print(c4)


(3.0, 3.0)

In [69]:
c5 = out_size(c4, 3, stride=2, pad=1)
print(c5)


(2.0, 2.0)

In [70]:
c6 = out_size(c5, 2)
print(c6)


(1.0, 1.0)