Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add samediff layer support (forward only, no output layers) #4675

Merged
merged 34 commits into from Feb 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
666cc11
First steps for samediff layer
AlexDBlack Dec 18, 2017
2a76f5f
First pass on layer implementation
AlexDBlack Dec 18, 2017
8d02e3a
Parameter initialization
AlexDBlack Dec 18, 2017
c68eda1
Temp
AlexDBlack Dec 20, 2017
6a08173
More tests and implementation
AlexDBlack Dec 20, 2017
84f6506
More tests/implementation
AlexDBlack Dec 21, 2017
c6e4d2c
More tests, add activation fn config to SameDiffDense
AlexDBlack Dec 21, 2017
156d81d
First steps on samediff conv layer
AlexDBlack Dec 21, 2017
c9bc902
More tests
AlexDBlack Dec 22, 2017
e67ca0f
Test clean up
AlexDBlack Dec 22, 2017
9e32a44
Fix + test serialization; add global config inheritance for samediff …
AlexDBlack Dec 22, 2017
b9e5b48
SameDiff Conv layer test; samediff param initializer reshape order co…
AlexDBlack Dec 22, 2017
3775aa0
More samediff conv
AlexDBlack Dec 22, 2017
1775364
Add SameDiffLayerUtils
AlexDBlack Dec 28, 2017
84299fa
SameDiff dense: multi-layer forward test
AlexDBlack Dec 29, 2017
310ee10
JSON/equals for for SameDiffConv
AlexDBlack Dec 29, 2017
6e36209
Refactoring, first steps for SameDiff output layer
AlexDBlack Dec 29, 2017
f1e15ed
SameDiffOutput layer tests; fixes/improvements
AlexDBlack Dec 29, 2017
18ce864
Additional tests and fixes
AlexDBlack Jan 2, 2018
5db9cbc
Fixes and improved tests
AlexDBlack Jan 2, 2018
c50f402
First pass on SameDiff loss layer
AlexDBlack Jan 3, 2018
dbac4b8
Fix, cleanup
AlexDBlack Jan 3, 2018
29a15ee
SameDiff loss layer: fixes; score and forward passing for MSE
AlexDBlack Jan 3, 2018
578eb4f
Debugging testS
AlexDBlack Jan 5, 2018
196ab9e
Clean up debug tests
AlexDBlack Jan 8, 2018
6fc7581
SameDiff loss layer: implement + test computeScoreForExamples
AlexDBlack Jan 8, 2018
94658a6
Remove samediff output/loss layers for now
AlexDBlack Feb 19, 2018
d869d8d
Add parameter initialization for samediff layers
AlexDBlack Feb 19, 2018
62d267f
Refactoring, reduce number of methods to override
AlexDBlack Feb 20, 2018
f84cb57
More cleanup/fixes
AlexDBlack Feb 20, 2018
79af7a8
API tweaks, add MinimalSameDiffDense example
AlexDBlack Feb 20, 2018
9e0ea03
Javadoc and cleanup
AlexDBlack Feb 21, 2018
75b49bc
Add check for existence of no-arg costructor for better UX
AlexDBlack Feb 21, 2018
ff87f84
Remove java 1.8 from pom
AlexDBlack Feb 21, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -55,6 +55,22 @@ public static ComputationGraph testModelSerialization(ComputationGraph net){
}
}

public static INDArray randomOneHot(int examples, int nOut){
return randomOneHot(examples, nOut, new Random(12345));
}

public static INDArray randomOneHot(int examples, int nOut, long rngSeed){
return randomOneHot(examples, nOut, new Random(rngSeed));
}

public static INDArray randomOneHot(int examples, int nOut, Random rng){
INDArray arr = Nd4j.create(examples, nOut);
for( int i=0; i<examples; i++ ){
arr.putScalar(i, rng.nextInt(nOut), 1.0);
}
return arr;
}

public static INDArray randomOneHotTimeSeries(int minibatch, int outSize, int tsLength){
return randomOneHotTimeSeries(minibatch, outSize, tsLength, new Random());
}
Expand Down
@@ -0,0 +1,189 @@
package org.deeplearning4j.nn.layers.samediff;

import lombok.extern.slf4j.Slf4j;
import org.deeplearning4j.TestUtils;
import org.deeplearning4j.nn.conf.ConvolutionMode;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.ConvolutionLayer;
import org.deeplearning4j.nn.layers.samediff.testlayers.SameDiffConv;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.params.ConvolutionParamInitializer;
import org.deeplearning4j.nn.weights.WeightInit;
import org.junit.Test;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

import java.util.Arrays;
import java.util.Map;
import java.util.Random;

import static org.junit.Assert.*;

@Slf4j
public class TestSameDiffConv {

@Test
public void testSameDiffConvBasic() {

int nIn = 3;
int nOut = 4;
int kH = 2;
int kW = 3;

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.list()
.layer(new SameDiffConv.Builder().nIn(nIn).nOut(nOut).kernelSize(kH, kW).build())
.build();

MultiLayerNetwork net = new MultiLayerNetwork(conf);
net.init();

Map<String, INDArray> pt1 = net.getLayer(0).paramTable();
assertNotNull(pt1);
assertEquals(2, pt1.size());
assertNotNull(pt1.get(ConvolutionParamInitializer.WEIGHT_KEY));
assertNotNull(pt1.get(ConvolutionParamInitializer.BIAS_KEY));

assertArrayEquals(new int[]{nOut, nIn, kH, kW}, pt1.get(ConvolutionParamInitializer.WEIGHT_KEY).shape());
assertArrayEquals(new int[]{1, nOut}, pt1.get(ConvolutionParamInitializer.BIAS_KEY).shape());

TestUtils.testModelSerialization(net);
}

@Test
public void testSameDiffConvForward() {

int imgH = 16;
int imgW = 20;

int count = 0;

//Note: to avoid the exporential number of tests here, we'll randomly run every Nth test only.
//With n=1, m=3 this is 1 out of every 3 tests (on average)
Random r = new Random(12345);
int n = 1;
int m = 5;
for (int minibatch : new int[]{5, 1}) {

Activation[] afns = new Activation[]{
Activation.TANH,
Activation.SIGMOID,
Activation.ELU,
Activation.IDENTITY,
Activation.SOFTPLUS,
Activation.SOFTSIGN,
Activation.CUBE,
Activation.HARDTANH,
Activation.RELU
};

for (boolean hasBias : new boolean[]{true, false}) {
for (int nIn : new int[]{3, 4}) {
for (int nOut : new int[]{4, 5}) {
for (int[] kernel : new int[][]{{2, 2}, {2, 1}, {3, 2}}) {
for (int[] strides : new int[][]{{1, 1}, {2, 2}, {2, 1}}) {
for (int[] dilation : new int[][]{{1, 1}, {2, 2}, {1, 2}}) {
for (ConvolutionMode cm : new ConvolutionMode[]{ConvolutionMode.Truncate, ConvolutionMode.Same}) {
for (Activation a : afns) {
int i = r.nextInt(m);
if (i >= n) {
//Example: n=2, m=3... skip on i=2, run test on i=0, i=1
continue;
}

String msg = "Test " + (count++) + " - minibatch=" + minibatch + ", nIn=" + nIn
+ ", nOut=" + nOut + ", kernel=" + Arrays.toString(kernel) + ", stride="
+ Arrays.toString(strides) + ", dilation=" + Arrays.toString(dilation)
+ ", ConvolutionMode=" + cm + ", ActFn=" + a + ", hasBias=" + hasBias;
log.info("Starting test: " + msg);

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(12345)
.list()
.layer(new SameDiffConv.Builder()
.weightInit(WeightInit.XAVIER)
.nIn(nIn)
.nOut(nOut)
.kernelSize(kernel)
.stride(strides)
.dilation(dilation)
.convolutionMode(cm)
.activation(a)
.hasBias(hasBias)
.build())
.layer(new SameDiffConv.Builder()
.weightInit(WeightInit.XAVIER)
.nIn(nOut)
.nOut(nOut)
.kernelSize(kernel)
.stride(strides)
.dilation(dilation)
.convolutionMode(cm)
.activation(a)
.hasBias(hasBias)
.build())
.build();

MultiLayerNetwork net = new MultiLayerNetwork(conf);
net.init();

assertNotNull(net.paramTable());

MultiLayerConfiguration conf2 = new NeuralNetConfiguration.Builder()
.weightInit(WeightInit.XAVIER)
.seed(12345)
.list()
.layer(new ConvolutionLayer.Builder()
.nIn(nIn)
.nOut(nOut)
.kernelSize(kernel)
.stride(strides)
.dilation(dilation)
.convolutionMode(cm)
.activation(a)
.hasBias(hasBias)
.build())
.layer(new ConvolutionLayer.Builder()
.nIn(nOut)
.nOut(nOut)
.kernelSize(kernel)
.stride(strides)
.dilation(dilation)
.convolutionMode(cm)
.activation(a)
.hasBias(hasBias)
.build())
.build();

MultiLayerNetwork net2 = new MultiLayerNetwork(conf2);
net2.init();

//Check params:
Map<String, INDArray> params1 = net.paramTable();
Map<String, INDArray> params2 = net2.paramTable();
assertEquals(msg, params2, params1);

INDArray in = Nd4j.rand(new int[]{minibatch, nIn, imgH, imgW});
INDArray out = net.output(in);
INDArray outExp = net2.output(in);

assertEquals(msg, outExp, out);

//Also check serialization:
MultiLayerNetwork netLoaded = TestUtils.testModelSerialization(net);
INDArray outLoaded = netLoaded.output(in);

assertEquals(msg, outExp, outLoaded);
}
}
}
}
}
}
}
}
}
}
}