Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- net = NetGraph[
- {
- 50,
- 50,
- CatenateLayer[],
- ReshapeLayer[{2, 50}],
- NetPairEmbeddingOperator[NetChain[{10, Ramp, 2(*embedding dimension*)}]],
- {2, SoftmaxLayer[]},
- {2, SoftmaxLayer[]},
- ContrastiveLossLayer[(*margin*)]
- },
- {
- NetPort["Input1"] -> 1 -> 6,
- NetPort["Input2"] -> 2 -> 7,
- {1, 2} -> 3 -> 4 -> 5 -> 8
- },
- "Input1" -> 10,
- "Input2" -> 10,
- "Output1" -> NetDecoder[{"Class", {0, 1}}],
- "Output2" -> NetDecoder[{"Class", {0, 1}}]
- ]
- net = NetGraph[
- {
- 50,
- 50,
- CatenateLayer[],
- ReshapeLayer[{2, 50}],
- NetPairEmbeddingOperator[NetChain[{10, Ramp, 2(*embedding dimension*)}]],
- {2, SoftmaxLayer[]},
- {2, SoftmaxLayer[]},
- ContrastiveLossLayer[(*margin*)]
- },
- {
- NetPort["Input1"] -> 1 -> 6,
- NetPort["Input2"] -> 2 -> 7,
- {1, 2} -> 3 -> 4 -> 5 -> 8
- },
- "Input1" -> 10,
- "Input2" -> 10,
- "Output1" -> NetDecoder[{"Class", {0, 1}}],
- "Output2" -> NetDecoder[{"Class", {0, 1}}]
- ]
- sampler[n_] := Block[
- {r},
- r = Table[RandomSample[Range[1000], 2], n];
- <|
- "Input1" -> X[[r[[;; , 1]]]],
- "Input2" -> X[[r[[;; , 2]]]],
- "Output1" -> Y[[r[[;; , 1]]]],
- "Output2" -> Y[[r[[;; , 2]]]],
- "Target" -> RandomChoice[{True, False}, n]
- |>
- ]
- sampler[#BatchSize] &@<|"BatchSize" -> 2|>
- netT = NetTrain[net, sampler[#BatchSize] &, BatchSize -> 2, MaxTrainingRounds -> 50]
- classifier = NetGraph[
- {
- Take[netT, {1, 6}],
- Take[netT, {2, 7}],
- ThreadingLayer[(#1 + #2)/2 &]
- },
- {
- {1, 2} -> 3
- },
- "Output" -> NetDecoder[{"Class", {0, 1}}]
- ]
- classifier = NetGraph[
- {
- Take[netT, {1, 6}],
- Take[netT, {2, 7}],
- ThreadingLayer[(#1 + #2)/2 &]
- },
- {
- {1, 2} -> 3
- },
- "Output" -> NetDecoder[{"Class", {0, 1}}]
- ]
- emb1 = NetChain[
- {
- Take[netT, {1, 1}],
- NetExtract[netT, 5][["Net"]]
- }
- ]
- nf1 = Nearest[emb1@X -> Range[n]]
- emb2 = NetChain[
- {
- Take[netT, {2, 2}],
- NetExtract[netT, 5][["Net"]]
- }
- ];
- nf2 = Nearest[emb2@X -> Range[n]];
- SeedRandom[0];
- data = RandomReal[{-1, 1}, 10];
- classifier[<|"Input1" -> data, "Input2" -> data|>, "Probabilities"]
- {nf1[emb1@data, 5], nf2[emb2@data, 5]}
Add Comment
Please, Sign In to add comment