batch_size = 100 # Provide a folder to store data for log, model, image, etc. VisualDL's visualization will be # based on this folder. logdir = "./tmp" # Initialize a logger instance. Parameter 'sync_cycle' means write a log every 10 operations on # memory. logger = LogWriter(logdir, sync_cycle=10) # mark the components with 'train' label. with logger.mode("train"): # scalar0 is used to record scalar metrics while MXNet is training. We will record accuracy. # In the visualization, we can see the accuracy is increasing as more training steps happen. scalar0 = logger.scalar("scalars/scalar0") image0 = logger.image("images/image0", 1) histogram0 = logger.histogram("histogram/histogram0", num_buckets=100) # Record training steps cnt_step = 0 # MXNet provides many callback interface. Here we define our own callback method and it is called # after every batch. # https://mxnet.incubator.apache.org/api/python/callback/callback.html def add_scalar(): def _callback(param): with logger.mode("train"): global cnt_step # Here the value is the accuracy we want to record # https://mxnet.incubator.apache.org/_modules/mxnet/callback.html
fig, ax = plt.subplots() plt.imshow(np.transpose(npimg, (1, 2, 0))) # we can either show the image or save it locally # plt.show() fig.savefig('out' + str(np.random.randint(0, 10000)) + '.pdf') logdir = "./workspace" logger = LogWriter(logdir, sync_cycle=100) # mark the components with 'train' label. with logger.mode("train"): # create a scalar component called 'scalars/' scalar_pytorch_train_loss = logger.scalar( "scalars/scalar_pytorch_train_loss") image1 = logger.image("images/image1", 1) image2 = logger.image("images/image2", 1) histogram0 = logger.histogram("histogram/histogram0", num_buckets=100) # get some random training images dataiter = iter(trainloader) images, labels = dataiter.next() # show images imshow(torchvision.utils.make_grid(images)) # print labels print(' '.join('%5s' % classes[labels[j]] for j in range(4))) # Define a Convolution Neural Network class Net(nn.Module):
class StorageTest(unittest.TestCase): def setUp(self): self.dir = "./tmp/storage_test" self.writer = LogWriter(self.dir, sync_cycle=1).as_mode("train") def test_scalar(self): print('test write') scalar = self.writer.scalar("model/scalar/min") # scalar.set_caption("model/scalar/min") for i in range(10): scalar.add_record(i, float(i)) print('test read') self.reader = LogReader(self.dir) with self.reader.mode("train") as reader: scalar = reader.scalar("model/scalar/min") self.assertEqual(scalar.caption(), "train") records = scalar.records() ids = scalar.ids() self.assertTrue( np.equal(records, [float(i) for i in range(10 - 1)]).all()) self.assertTrue(np.equal(ids, [float(i) for i in range(10)]).all()) print('records', records) print('ids', ids) def test_image(self): tag = "layer1/layer2/image0" image_writer = self.writer.image(tag, 10, 1) num_passes = 10 num_samples = 100 shape = [10, 10, 3] for pass_ in range(num_passes): image_writer.start_sampling() for ins in range(num_samples): data = np.random.random(shape) * 256 data = np.ndarray.flatten(data) image_writer.add_sample(shape, list(data)) image_writer.finish_sampling() self.reader = LogReader(self.dir) with self.reader.mode("train") as reader: image_reader = reader.image(tag) self.assertEqual(image_reader.caption(), tag) self.assertEqual(image_reader.num_records(), num_passes) image_record = image_reader.record(0, 1) self.assertTrue(np.equal(image_record.shape(), shape).all()) data = image_record.data() self.assertEqual(len(data), np.prod(shape)) image_tags = reader.tags("image") self.assertTrue(image_tags) self.assertEqual(len(image_tags), 1) def test_check_image(self): ''' check whether the storage will keep image data consistent ''' print('check image') tag = "layer1/check/image1" image_writer = self.writer.image(tag, 10) image = Image.open("./dog.jpg") shape = [image.size[1], image.size[0], 3] origin_data = np.array(image.getdata()).flatten() self.reader = LogReader(self.dir) with self.reader.mode("train") as reader: image_writer.start_sampling() image_writer.add_sample(shape, list(origin_data)) image_writer.finish_sampling() # read and check whether the original image will be displayed image_reader = reader.image(tag) image_record = image_reader.record(0, 0) data = image_record.data() shape = image_record.shape() PIL_image_shape = (shape[0] * shape[1], shape[2]) data = np.array(data, dtype='uint8').reshape(PIL_image_shape) print('origin', origin_data.flatten()) print('data', data.flatten()) image = Image.fromarray(data.reshape(shape)) # manully check the image and found that nothing wrong with the image storage. # image.show() def test_with_syntax(self): with self.writer.mode("train") as writer: scalar = writer.scalar("model/scalar/average") for i in range(10): scalar.add_record(i, float(i)) self.reader = LogReader(self.dir) with self.reader.mode("train") as reader: scalar = reader.scalar("model/scalar/average") self.assertEqual(scalar.caption(), "train") def test_modes(self): store = LogWriter(self.dir, sync_cycle=1) scalars = [] for i in range(10): with store.mode("mode-%d" % i) as writer: scalar = writer.scalar("add/scalar0") scalars.append(scalar) for scalar in scalars[:-1]: for i in range(10): scalar.add_record(i, float(i))
model.add(Dense(num_classes, activation='softmax')) model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) # create VisualDL logger logdir = "/workspace" logger = LogWriter(logdir, sync_cycle=100) # mark the components with 'train' label. with logger.mode("train"): # create a scalar component called 'scalars/' scalar_keras_train_loss = logger.scalar( "scalars/scalar_keras_mnist_train_loss") image_input = logger.image("images/input", 1) image0 = logger.image("images/image0", 1) image1 = logger.image("images/image1", 1) histogram0 = logger.histogram("histogram/histogram0", num_buckets=50) histogram1 = logger.histogram("histogram/histogram1", num_buckets=50) train_step = 0 class LossHistory(keras.callbacks.Callback): def on_batch_end(self, batch, logs={}): global train_step # Scalar scalar_keras_train_loss.add_record(train_step, logs.get('loss'))