You can do it a bit more directly. The idea is to get an expression in a and b which could be evaluated without major problems.
Start with your equation ( I write w (wavelength) for lambda to avoid the \ [...] characters)
eq1 = i[w] == i0[w] Exp[ - m[w] d/2 ((3 a w^-b)/m[w])^(1/2)]
Now I apply certain transforms of Logarithms to each side of eq1 (that is done by f/@eq1. Try a simple example)
eq2 = (Log[#] /. Log[a_ b_] -> Log[a] + Log[b] /. Log[Exp[x_]] -> x) & /@ eq1
and another one
eq3 = - (# - Log[i0[w]]) & /@ eq2 /. Log[x] - Log[y] -> Log[x/y]
to get as eq3
Log[i0[w]/i[w]] == 1/2 Sqrt[3] d Sqrt[(a w^-b)/m[w]] m[w]
Now take again logarithms on both sides
eq4 = Log[#] & /@ eq3
yielding
Log[Log[i0[w]/i[w]]] == Log[1/2 Sqrt[3] d Sqrt[(a w^-b)/m[w]] m[w]]
To simplify or expand the expression on the right hand side I define a function
flog[Log[a_]] := Plus @@ (Log /@ List @@ a)
Look what it does
In[7]:= flog[Log[1/2 Sqrt[3] d Sqrt[(a w^-b)/m[w]] m[w]]]
Out[7]= -Log[2] + Log[3]/2 + Log[d] + Log[Sqrt[(a w^-b)/m[w]]] + Log[m[w]]
Apply it to the right side of eq 4 (try what MapAt[h, eq4, 2] does) and simplify further
eq5 = MapAt[flog, eq4, 2] /. Log[Sqrt[x_]] -> 1/2 Log[x]
Isolate the terms with a and b on the right side
eq6 = 2 (# + Log[2] - Log[3]/2 - Log[m[w]] - Log[d]) & /@ eq5
eq7 = MapAt[flog, eq6, 2] /. Log[a_^x_] -> x Log[a]
eq8 = (# + Log[m[w]]) & /@ eq7
resulting in
-2 Log[d] + 2 Log[Log[i0[w]/i[w]]] - Log[(3 m[w])/4] == Log[a] - b Log[w]
(I am quite aware that all this could have been done "by hand"). Anyhow, in this expression the left hand side ( which could - of course - be simplified further) is known as it contains known values only, the right hand has the unknowns b and a in the form of Log[ a ]. So with a couple of measurements you should be able to find the values you are looking for, preferably by a least square fit.
To simplify the lefthand side of eq8 use
eq8[[1]] /. -2 Log[d] -> 2 Log[1/d] /. x_ Log[a_] -> Log[a^x] //. Log[a_] + Log[b_] -> Log[ a b]