Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 13 additions & 11 deletions src/CSharp/CSharpExamples/AdversarialExampleGeneration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -148,24 +148,26 @@ private static double Test(

foreach (var (data, target) in dataLoader) {

data.requires_grad = true;
using (var d = torch.NewDisposeScope())
{
data.requires_grad = true;

using (var output = model.forward(data))
using (var loss = criterion(output, target)) {
using (var output = model.forward(data))
using (var loss = criterion(output, target))
{

model.zero_grad();
loss.backward();
model.zero_grad();
loss.backward();

var perturbed = Attack(data, ε, data.grad());
var perturbed = Attack(data, ε, data.grad());

using (var final = model.forward(perturbed)) {
using (var final = model.forward(perturbed))
{

correct += final.argmax(1).eq(target).sum().ToInt32();
correct += final.argmax(1).eq(target).sum().ToInt32();
}
}
}


GC.Collect();
}

return (double)correct / size;
Expand Down
125 changes: 62 additions & 63 deletions src/CSharp/CSharpExamples/CIFAR10.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ internal static void Run(int epochs, int timeout, string modelName)
torch.cuda.is_available() ? torch.CUDA :
torch.CPU;

if (device.type == DeviceType.CUDA) {
if (device.type == DeviceType.CUDA)
{
_trainBatchSize *= 8;
_testBatchSize *= 8;
}
Expand All @@ -61,7 +62,8 @@ internal static void Run(int epochs, int timeout, string modelName)
var sourceDir = _dataLocation;
var targetDir = Path.Combine(_dataLocation, "test_data");

if (!Directory.Exists(targetDir)) {
if (!Directory.Exists(targetDir))
{
Directory.CreateDirectory(targetDir);
Decompress.ExtractTGZ(Path.Combine(sourceDir, "cifar-10-binary.tar.gz"), targetDir);
}
Expand All @@ -70,40 +72,41 @@ internal static void Run(int epochs, int timeout, string modelName)

Module model = null;

switch (modelName.ToLower()) {
case "alexnet":
model = new AlexNet(modelName, _numClasses, device);
break;
case "mobilenet":
model = new MobileNet(modelName, _numClasses, device);
break;
case "vgg11":
case "vgg13":
case "vgg16":
case "vgg19":
model = new VGG(modelName, _numClasses, device);
break;
case "resnet18":
model = ResNet.ResNet18(_numClasses, device);
break;
case "resnet34":
_testBatchSize /= 4;
model = ResNet.ResNet34(_numClasses, device);
break;
case "resnet50":
_trainBatchSize /= 6;
_testBatchSize /= 8;
model = ResNet.ResNet50(_numClasses, device);
break;
case "resnet101":
_trainBatchSize /= 6;
_testBatchSize /= 8;
model = ResNet.ResNet101(_numClasses, device);
break;
case "resnet152":
_testBatchSize /= 4;
model = ResNet.ResNet152(_numClasses, device);
break;
switch (modelName.ToLower())
{
case "alexnet":
model = new AlexNet(modelName, _numClasses, device);
break;
case "mobilenet":
model = new MobileNet(modelName, _numClasses, device);
break;
case "vgg11":
case "vgg13":
case "vgg16":
case "vgg19":
model = new VGG(modelName, _numClasses, device);
break;
case "resnet18":
model = ResNet.ResNet18(_numClasses, device);
break;
case "resnet34":
_testBatchSize /= 4;
model = ResNet.ResNet34(_numClasses, device);
break;
case "resnet50":
_trainBatchSize /= 6;
_testBatchSize /= 8;
model = ResNet.ResNet50(_numClasses, device);
break;
case "resnet101":
_trainBatchSize /= 6;
_testBatchSize /= 8;
model = ResNet.ResNet101(_numClasses, device);
break;
case "resnet152":
_testBatchSize /= 4;
model = ResNet.ResNet152(_numClasses, device);
break;
}

var hflip = transforms.HorizontalFlip();
Expand All @@ -116,19 +119,20 @@ internal static void Run(int epochs, int timeout, string modelName)

using (var train = new CIFARReader(targetDir, false, _trainBatchSize, shuffle: true, device: device, transforms: new ITransform[] { }))
using (var test = new CIFARReader(targetDir, true, _testBatchSize, device: device))
using (var optimizer = torch.optim.Adam(model.parameters(), 0.001)) {
using (var optimizer = torch.optim.Adam(model.parameters(), 0.001))
{

Stopwatch totalSW = new Stopwatch();
totalSW.Start();

for (var epoch = 1; epoch <= epochs; epoch++) {
for (var epoch = 1; epoch <= epochs; epoch++)
{

Stopwatch epchSW = new Stopwatch();
epchSW.Start();

Train(model, optimizer, nll_loss(), train.Data(), epoch, _trainBatchSize, train.Size);
Test(model, nll_loss(), test.Data(), test.Size);
GC.Collect();

epchSW.Stop();
Console.WriteLine($"Elapsed time for this epoch: {epchSW.Elapsed.TotalSeconds} s.");
Expand Down Expand Up @@ -160,35 +164,33 @@ private static void Train(

Console.WriteLine($"Epoch: {epoch}...");

foreach (var (data, target) in dataLoader) {
foreach (var (data, target) in dataLoader)
{

optimizer.zero_grad();
using (var d = torch.NewDisposeScope())
{
optimizer.zero_grad();

using var prediction = model.forward(data);
using var lsm = log_softmax(prediction, 1);
using (var output = loss(lsm, target)) {
var prediction = model.forward(data);
var lsm = log_softmax(prediction, 1);
var output = loss(lsm, target);

output.backward();

optimizer.step();

total += target.shape[0];

using (var predicted = prediction.argmax(1))
using (var eq = predicted.eq(target))
using (var sum = eq.sum()) {
correct += sum.ToInt64();
}
correct += prediction.argmax(1).eq(target).ToInt64();

if (batchId % _logInterval == 0) {
if (batchId % _logInterval == 0)
{
var count = Math.Min(batchId * batchSize, size);
Console.WriteLine($"\rTrain: epoch {epoch} [{count} / {size}] Loss: {output.ToSingle().ToString("0.000000")} | Accuracy: { ((float)correct / total).ToString("0.000000") }");
}

batchId++;
}

GC.Collect();
}
}

Expand All @@ -204,23 +206,20 @@ private static void Test(
long correct = 0;
int batchCount = 0;

foreach (var (data, target) in dataLoader) {
foreach (var (data, target) in dataLoader)
{

using var prediction = model.forward(data);
using var lsm = log_softmax(prediction, 1);
using (var output = loss(lsm, target)) {
using (var d = torch.NewDisposeScope())
{
var prediction = model.forward(data);
var lsm = log_softmax(prediction, 1);
var output = loss(lsm, target);

testLoss += output.ToSingle();
batchCount += 1;

using (var predicted = prediction.argmax(1))
using (var eq = predicted.eq(target))
using (var sum = eq.sum()) {
correct += sum.ToInt64();
}
correct += prediction.argmax(1).eq(target).ToInt64();
}

GC.Collect();
}

Console.WriteLine($"\rTest set: Average loss {(testLoss / batchCount).ToString("0.0000")} | Accuracy {((float)correct / size).ToString("0.0000")}");
Expand Down
2 changes: 1 addition & 1 deletion src/CSharp/CSharpExamples/CSharpExamples.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="TorchSharp-cpu" Version="0.95.3" />
<PackageReference Include="TorchSharp-cpu" Version="0.95.4" />
</ItemGroup>

<ItemGroup>
Expand Down
61 changes: 35 additions & 26 deletions src/CSharp/CSharpExamples/MNIST.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ internal static void Run(int epochs, int timeout, string dataset)
{
_epochs = epochs;

if (string.IsNullOrEmpty(dataset)) {
if (string.IsNullOrEmpty(dataset))
{
dataset = "mnist";
}

Expand All @@ -67,15 +68,17 @@ internal static void Run(int epochs, int timeout, string dataset)
var sourceDir = datasetPath;
var targetDir = Path.Combine(datasetPath, "test_data");

if (!Directory.Exists(targetDir)) {
if (!Directory.Exists(targetDir))
{
Directory.CreateDirectory(targetDir);
Decompress.DecompressGZipFile(Path.Combine(sourceDir, "train-images-idx3-ubyte.gz"), targetDir);
Decompress.DecompressGZipFile(Path.Combine(sourceDir, "train-labels-idx1-ubyte.gz"), targetDir);
Decompress.DecompressGZipFile(Path.Combine(sourceDir, "t10k-images-idx3-ubyte.gz"), targetDir);
Decompress.DecompressGZipFile(Path.Combine(sourceDir, "t10k-labels-idx1-ubyte.gz"), targetDir);
}

if (device.type == DeviceType.CUDA) {
if (device.type == DeviceType.CUDA)
{
_trainBatchSize *= 4;
_testBatchSize *= 4;
}
Expand All @@ -90,7 +93,8 @@ internal static void Run(int epochs, int timeout, string dataset)
Console.WriteLine();

using (MNISTReader train = new MNISTReader(targetDir, "train", _trainBatchSize, device: device, shuffle: true, transform: normImage),
test = new MNISTReader(targetDir, "t10k", _testBatchSize, device: device, transform: normImage)) {
test = new MNISTReader(targetDir, "t10k", _testBatchSize, device: device, transform: normImage))
{

TrainingLoop(dataset, timeout, device, model, train, test);
}
Expand All @@ -105,7 +109,8 @@ internal static void TrainingLoop(string dataset, int timeout, Device device, Mo
Stopwatch totalTime = new Stopwatch();
totalTime.Start();

for (var epoch = 1; epoch <= _epochs; epoch++) {
for (var epoch = 1; epoch <= _epochs; epoch++)
{

Train(model, optimizer, nll_loss(reduction: Reduction.Mean), device, train, epoch, train.BatchSize, train.Size);
Test(model, nll_loss(reduction: nn.Reduction.Sum), device, test, test.Size);
Expand Down Expand Up @@ -137,23 +142,28 @@ private static void Train(
int batchId = 1;

Console.WriteLine($"Epoch: {epoch}...");
foreach (var (data, target) in dataLoader) {
optimizer.zero_grad();

var prediction = model.forward(data);
var output = loss(prediction, target);
foreach (var (data, target) in dataLoader)
{
using (var d = torch.NewDisposeScope())
{
optimizer.zero_grad();

output.backward();
var prediction = model.forward(data);
var output = loss(prediction, target);

optimizer.step();
output.backward();

if (batchId % _logInterval == 0) {
Console.WriteLine($"\rTrain: epoch {epoch} [{batchId * batchSize} / {size}] Loss: {output.ToSingle():F4}");
}
optimizer.step();

if (batchId % _logInterval == 0)
{
Console.WriteLine($"\rTrain: epoch {epoch} [{batchId * batchSize} / {size}] Loss: {output.ToSingle():F4}");
}

batchId++;
batchId++;

GC.Collect();
}
}
}

Expand All @@ -169,17 +179,16 @@ private static void Test(
double testLoss = 0;
int correct = 0;

foreach (var (data, target) in dataLoader) {
var prediction = model.forward(data);
var output = loss(prediction, target);
testLoss += output.ToSingle();
foreach (var (data, target) in dataLoader)
{
using (var d = torch.NewDisposeScope())
{
var prediction = model.forward(data);
var output = loss(prediction, target);
testLoss += output.ToSingle();

var pred = prediction.argmax(1);
correct += pred.eq(target).sum().ToInt32();

pred.Dispose();

GC.Collect();
correct += prediction.argmax(1).eq(target).sum().ToInt32();
}
}

Console.WriteLine($"Size: {size}, Total: {size}");
Expand Down
Loading