|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import tensorlayer as T
- from dragon.vm.tensorlayer.layers import Dense
- from dragon.vm.tensorlayer.models import Model
- import dragon.vm.tensorlayer as tl
-
- import dragon as dg
- import argparse
- import numpy as np
-
- X_train, y_train, X_val, y_val, X_test, y_test = T.files.load_mnist_dataset(shape=(-1, 784))
-
-
- class MLP(Model):
-
- def __init__(self):
- super(MLP, self).__init__()
- self.dense1 = Dense(n_units=800, act=tl.act.relu, in_channels=784)
- self.dense2 = Dense(n_units=800, act=tl.act.relu, in_channels=800)
- self.dense3 = Dense(n_units=10, act=tl.act.relu, in_channels=800)
-
- def forward(self, x):
- z = self.dense1(x)
- z = self.dense2(z)
- out = self.dense3(z)
- return out
-
-
- class Classifier(object):
- """The base classifier class."""
-
- # TensorSpec for graph execution
- image_spec = dg.Tensor([None, 3, 32, 32], 'float32')
- label_spec = dg.Tensor([None], 'int64')
-
- def __init__(self, optimizer):
- super(Classifier, self).__init__()
- self.net = MLP()
- self.optimizer = optimizer
- self.params = self.net.trainable_weights
-
- def step(self, image, label):
- with dg.GradientTape() as tape:
- logit = self.net(image)
- # logit = dg.cast(logit, 'float64')
- logit = dg.cast(dg.math.argmax(logit, -1), 'int32')
- # label = dg.cast(label, 'float32')
- # print("logit :\n", logit, label)
- # loss = dg.losses.smooth_l1_loss([logit, label])
- # loss = tl.losses.sparse_softmax_crossentropy(logit, label)
- loss = dg.math.sum(
- (logit - label) * (logit - label)
- ) # dg.losses.sparse_softmax_cross_entropy([logit, label])
- accuracy = dg.math.mean(dg.math.equal([logit, label]).astype('float32'))
- grads = tape.gradient(loss, self.params)
- self.optimizer.apply_gradients(zip(self.params, grads))
- return loss, accuracy, self.optimizer
-
-
- if __name__ == '__main__':
- dg.autograph.set_execution('EAGER_MODE')
- # Define the model
- model = Classifier(dg.optimizers.SGD(base_lr=0.001, momentum=0.9, weight_decay=1e-4))
- # Main loop
- batch_size = 200
- for i in range(50):
- for X_batch, y_batch in T.iterate.minibatches(X_train, y_train, batch_size, shuffle=True):
- image = dg.EagerTensor(X_batch, copy=False)
- label = dg.EagerTensor(y_batch, copy=False, dtype='float32')
- loss, accuracy, _ = model.step(image, label)
- if i % 20 == 0:
- dg.logging.info(
- 'Iteration %d, lr = %s, loss = %.5f, accuracy = %.3f' %
- (i, str(model.optimizer.base_lr), loss, accuracy)
- )
|