Я пытаюсь скопировать упражнение примерно на полпути вниз по этой ссылке: https://d2l.ai/chapter_recurrent-neural-networks/sequence.html
В этом упражнении функция синуса используется для создания 1000 точек данных в диапазоне от -1 до 1, а рекуррентная сеть используется для аппроксимации функции.
Ниже приведен код, который я использовал. Я вернусь, чтобы подробнее изучить, почему это не работает, поскольку сейчас это не имеет для меня особого смысла, когда я легко смог использовать сеть прямой связи для аппроксимации этой функции.
//get data
ArrayList<DataSet> list = new ArrayList();
DataSet dss = DataSetFetch.getDataSet(Constants.DataTypes.math, "sine", 20, 500, 0, 0);
DataSet dsMain = dss.copy();
if (!dss.isEmpty()){
list.add(dss);
}
if (list.isEmpty()){
return;
}
//format dataset
list = DataSetFormatter.formatReccurnent(list, 0);
//get network
int history = 10;
ArrayList<LayerDescription> ldlist = new ArrayList<>();
LayerDescription l = new LayerDescription(1,history, Activation.RELU);
ldlist.add(l);
LayerDescription ll = new LayerDescription(history, 1, Activation.IDENTITY, LossFunctions.LossFunction.MSE);
ldlist.add(ll);
ListenerDescription ld = new ListenerDescription(20, true, false);
MultiLayerNetwork network = Reccurent.getLstm(ldlist, 123, WeightInit.XAVIER, new RmsProp(), ld);
//train network
final List<DataSet> lister = list.get(0).asList();
DataSetIterator iter = new ListDataSetIterator<>(lister, 50);
network.fit(iter, 50);
network.rnnClearPreviousState();
//test network
ArrayList<DataSet> resList = new ArrayList<>();
DataSet result = new DataSet();
INDArray arr = Nd4j.zeros(lister.size()+1);
INDArray holder;
if (list.size() > 1){
//test on training data
System.err.println("oops");
}else{
//test on original or scaled data
for (int i = 0; i < lister.size(); i++) {
holder = network.rnnTimeStep(lister.get(i).getFeatures());
arr.putScalar(i,holder.getFloat(0));
}
}
//add originaldata
resList.add(dsMain);
//result
result.setFeatures(dsMain.getFeatures());
result.setLabels(arr);
resList.add(result);
//display
DisplayData.plot2DScatterGraph(resList);
Можете ли вы объяснить код, который мне понадобится для 1 из 10 скрытых и 1 исходящих сетей lstm для аппроксимации синусоидальной функции?
Я не использую нормализацию, так как функция уже -1:1, и я использую ввод Y в качестве функции и следующий ввод Y в качестве метки для обучения сети.
Вы заметили, что я создаю класс, который позволяет упростить построение сетей, и я пытался внести множество изменений в проблему, но мне надоело гадать.
Вот несколько примеров моих результатов. Синий — данные, красный — результат