To summarize, Heidi, Xiaomei, and I had a great meeting today. Weather
in the Northwest has been messy so the term began a little more slowly
(and snowily) than usual. We spent a lot of time today reasoning about
the neural networks approach as well as drilling down into some of the
data formats and looking over some tutorials.
We came with a fairly shaky and abstract understanding but I think have
much more confidence now that what we're interested in really is doable
with the "magic" of neural nets. My biggest concern is in our computing
capacity to train and execute these nets.
The team agreed that the sketches I made appear to have been on the
right track, although many details needed to be filled in. Right now our
goal is to keep learning and start doing some exploratory programming,
such as starting off with some sort of "hello world" neural network. The
Caffe tutorial I posted in the Neural Net thread is a very good example
which we looked over, though we agreed we would like to try something a
little closer to the format of our problem. That seems like a good
library to use. I have access to an unused GPU machine (an old gaming
PC) which I might use to try some of the examples.
In order to "Parameterize" our networks we will need to look for other
examples of applying NNs to AVIRIS data. We would like to be able to
"steal" the topology of the network if we can in order to save time on
trial and error. A literature search for "AVIRIS neural network" is
bound to bring up most of what we are looking for.
In order to "Train" the mineral ID stage we need to work with the USGS
digital spectral library, so we took a closer look at the data formats.
The library contains ~6000 samples with classifications. There are
multiple samples for many of the minerals and other surface types, so we
should be able to take advantage of redundancy in training the net. We
may have to write a little regular expression to ensure that, for
example, we group "Actinolite HS116.3B" with "Actinolite NMNHR16485".
Variations in the observations will end up shaping the threshold
functions inside the net, but we don't have to worry too much about that
since the library will take care of it.
As feared, the USGS digital spectral data is not in the same format as
each AVIRIS pixel. The format is documented here:
https://speclab.cr.usgs.gov/specpr-format.html
Each sample has 256 or more "layers". AVIRIS pixels have only 224, so we
will have to think about filtering the data points. One approach is a
simple filter that chooses the first datapoint corresponding to each
AVIRIS layer and discards the rest. Or we could choose the median
datapoint for each, rather than the first. Another approach is to
average all of the data points for a corresponding layer, although the
implication of this is not clear. Perhaps there are other approaches as
well.
The radiance for each wavelength is represented by USGS as a 32-bit IEEE
floating-point number. AVIRIS measures these using 16-bit integers, so
we will have to map a conversion over the library to prepare it for
input to the trainer.
Although it would make sense to see what performance we get training and
running the net on a full-sized pixel, we want to throw away as much
useless data as we can in order to save precious processor cycles. Can
we throw away some of the layers, for example those outside the visible
light spectrum? To the NN it shouldn't really matter, but the more data
we have the better its judgments can be. Can we scale down our numbers
from, say, 16 to 8 or fewer bits? The trailing digits of the ratios we
are looking at may not be all the influential, but we don't know that yet.
We would like further information on how to "Preprocess" our raw AVIRIS
data. A pixelwise, layerwise spectral scaling routine wouldn't be too
hard to implement or too costly to execute, but we need to figure out
the parameters. After all of this legwork, the classification should be
a matter of running the net and waiting for it to finish. We do want to
be mindful of the output format since if we throw away too much data the
next mining ID stage won't have enough to work on. Do we want output
values to be yes/no answers or do we want probabilities, which we get
for free?
As far as mining ID goes, answering a few preliminary questions will
influence the design of the second NN. Namely, what features in general
characterize a mine? I assume in my sketch that we are interested now in
groups of pixels. How wide should these groups be? That is, what are the
physical dimensions of surface weathering gradients for example, and how
does this compare to the resolution of our images? We will want to
classify neighborhoods of pixels that are big enough to capture
interesting features, but small enough not to explode in complexity.
What do we do if we have "bad" data? If a pixel comes in with snow
cover, or unrecoverable noise, or whatever, are we safe throwing it
away? I have a certain amount of faith that the net could be trained to
ignore these, but we will still want a representation for holes in our
data, like NULL.
This covers the main points we discussed in our meeting. Heidi was right
that talking it over provided some unique insights and questions. All of
us agreed to be proactive and chime in about what we're working on,
whether that be data formats or neural nets or web development. We plan
to meet again next Friday, although we haven't reserved a space yet.
Have a Happy Martin Luther King Jr. Day weekend,
Taylor