1

For a reinforcement-learing I create two List<INDArray> with states and the corresponing move predicton and reward value. How can I transform this two Lists into one org.nd4j.linalg.dataset.api.DataSet

Ackdari
  • 3,222
  • 1
  • 16
  • 33

1 Answers1

0

Most methods accept org.nd4j.linalg.dataset.api.iterator.DataSetIterator as well, not only org.nd4j.linalg.dataset.DataSet. So you could use this code for it:

import java.util.ArrayList;
import java.util.List;

import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.dataset.api.DataSetPreProcessor;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;


public class DataSetIteratorImpl implements DataSetIterator {
    
    
    private static final long serialVersionUID = -3010080072504907088L;
    
    
    private List<DataSet> entries;
    private int current = 0;
    private DataSetPreProcessor dataSetPreProcessor;
    
    
    public DataSetIteratorImpl() {
        entries = new ArrayList<DataSet>();
        reset();
    }
    
    
    public void addEntry(DataSet entry) {
        entries.add(entry);
    }
    
    
    @Override
    public boolean hasNext() {
        return current < entries.size();
    }

    @Override
    public DataSet next() {
        return entries.get(current++);
    }

    @Override
    public boolean asyncSupported() {
        return false;
    }

    @Override
    public int batch() {
        return entries.size();
    }

    @Override
    public DataSetPreProcessor getPreProcessor() {
        return dataSetPreProcessor;
    }

    @Override
    public void reset() {
        current = 0;
    }

    @Override
    public boolean resetSupported() {
        return true;
    }

    @Override
    public void setPreProcessor(DataSetPreProcessor _dataSetPreProcessor) {
        dataSetPreProcessor = _dataSetPreProcessor;
    }
    
    @Override
    public int inputColumns() {
        throw new UnsupportedOperationException();
    }

    @Override
    public DataSet next(int arg0) {
        throw new UnsupportedOperationException();
    }
    
    @Override
    public List<String> getLabels() {
        throw new UnsupportedOperationException();
    }
    
    @Override
    public int totalOutcomes() {
        throw new UnsupportedOperationException();
    }


    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}

You could create the iterator with this code:

DataSetIterator iterator = new DataSetIteratorImpl ();

And then when you fill the iterator, just call several times:

iterator.addEntry(new DataSet(INDArrayinput, INDArrayoutput));

After that the iterator is ready to be used as a training set.