comments Jeffrey Mark Siskind (24 Apr 2020 18:59 UTC)
Re: comments Jeffrey Mark Siskind (24 Apr 2020 19:53 UTC)
Re: comments Bradley Lucier (17 May 2020 21:40 UTC)
Re: comments Jeffrey Mark Siskind (24 Apr 2020 19:54 UTC)
Re: comments John Cowan (24 Apr 2020 21:13 UTC)
Re: comments Bradley Lucier (25 Apr 2020 23:34 UTC)
Re: comments Bradley Lucier (26 Apr 2020 00:09 UTC)
Re: comments John Cowan (26 Apr 2020 03:46 UTC)
Re: comments Bradley Lucier (28 Apr 2020 20:03 UTC)
Re: comments Bradley Lucier (26 Apr 2020 22:11 UTC)

Re: comments Jeffrey Mark Siskind 24 Apr 2020 19:53 UTC

The current Scorch API:

Creation

  (torch-byte-tensor number-list)
  (torch-char-tensor number-list)
  (torch-short-tensor number-list)
  (torch-int-tensor number-list)
  (torch-long-tensor number-list)
  (torch-float-tensor number-list)
  (torch-double-tensor number-list)
  (torch-cuda-byte-tensor number-list)
  (torch-cuda-char-tensor number-list)
  (torch-cuda-short-tensor number-list)
  (torch-cuda-int-tensor number-list)
  (torch-cuda-long-tensor number-list)
  ;; This should be called torch-cuda-float-tensor but is not for compatibility
  ;; with the Torch naming conventions.
  (torch-cuda-tensor number-list)
  (torch-cuda-double-tensor number-list)

  (torch-fill-byte dimensions number)
  (torch-fill-char dimensions number)
  (torch-fill-short dimensions number)
  (torch-fill-int dimensions number)
  (torch-fill-long dimensions number)
  (torch-fill-float dimensions number)
  (torch-fill-double dimensions number)
  (torch-fill-cuda-byte dimensions number)
  (torch-fill-cuda-char dimensions number)
  (torch-fill-cuda-short dimensions number)
  (torch-fill-cuda-int dimensions number)
  (torch-fill-cuda-long dimensions number)
  ;; This should be called torch-fill-cuda-float but is not for compatibility
  ;; with the Torch naming conventions.
  (torch-fill-cuda dimensions number)
  (torch-fill-cuda-double dimensions number)

  (torch-randn-float dimensions)
  (torch-randn-double dimensions)
  ;; This should be called torch-randn-cuda-float but is not for compatibility
  ;; with the Torch naming conventions.
  (torch-randn-cuda dimensions)
  (torch-randn-cuda-double dimensions)

  (torch-normal-float dimensions mean stdv)
  (torch-normal-double dimensions mean stdv)
  ;; This should be called torch-normal-cuda-float but is not for compatibility
  ;; with the Torch naming conventions.
  (torch-normal-cuda dimensions mean stdv)
  (torch-normal-cuda-double dimensions mean stdv)

Type predicates

  (byte-tensor? thing)
  (char-tensor? thing)
  (short-tensor? thing)
  (int-tensor? thing)
  (long-tensor? thing)
  (float-tensor? thing)
  (double-tensor? thing)
  (cuda-byte-tensor? thing)
  (cuda-char-tensor? thing)
  (cuda-short-tensor? thing)
  (cuda-int-tensor? thing)
  (cuda-long-tensor? thing)
  ;; This should be called cuda-float-tensor? but is not for compatibility
  ;; with the Torch naming conventions.
  (cuda-tensor? thing)
  (cuda-double-tensor? thing)

RNG

  (start-generator [seed])
  (stop-generator)

CUDA

   (start-cuda [GPU-or-list-of-GPUs])
   (stop-cuda)

Accessors

  (torch-size tensor)
  (tensor->list 1D-tensor)
  ;; Our standard library provides
  (nested-list->float-tensor l)
  (nested-list->double-tensor l)
  ;; This should be called nested-list->cuda-float-tensor but is not for
  ;; compatibility with the Torch naming conventions.
  (nested-list->cuda-tensor l)
  (nested-list->cuda-double-tensor l)
  (tensor->nested-list t)

Coercion

  (torch-byte tensor)
  (torch-char tensor)
  (torch-short tensor)
  (torch-int tensor)
  (torch-long tensor)
  (torch-float tensor)
  (torch-double tensor)
  (torch-cuda-byte tensor)
  (torch-cuda-char tensor)
  (torch-cuda-short tensor)
  (torch-cuda-int tensor)
  (torch-cuda-long tensor)
  ;; This should be called torch-cuda-float but is not for compatibility
  ;; with the Torch naming conventions.
  (torch-cuda tensor)
  (torch-cuda-double tensor)

Some Scheme primitives that are overloaded pointwise to tensors:

  +
  -
  *
  /
  max
  min
  sqrt
  exp
  log
  sin
  cos
  atan
  =
  <
  >
  <=
  >=
  zero?
  positive?
  negative?

Some torch primitives:

  (torch-view tensor number-list)
  (torch-transpose tensor)
  (torch-dot tensor tensor)
  (torch-sumall tensor)
  (torch-addmv tensor tensor)
  (torch-addmm tensor tensor)
  (torch-addr tensor tensor)

Some less-clean parts of the API.

  ;; Initially, we had a very general mechanism to do convolutions of any
  ;; dimension. And we divided the API into parts that did padding, chopping
  ;; (its inverse), decimation, and interpolation separate from convolution.
  ;; But now we use cuDNN which combines it all together and is hardwired to
  ;; particular numbers of dimensions.
  (pad tensor number-list)
  (chop tensor number-list)
  (decimate tensor number-list)
  (interpolate tensor number-list)
  (interpolate-to-size tensor number-list)
  (ReLU tensor)
  (convolve2d ...)
  ;; Batch normalization is statefull.
  (batch-normalization ...)
  (batch-normalization-validation ...)
  (initialize-batch-normalization ...)
  (convolve-add-tied ...)
  (max-pool2d ...)
  (avg-pool2d ...)
  ;; This was an attempt to separate dropout into a part that was
  ;; deterministic and a part that was not.
  (get-dropout-masks ...)
  (get-dropout-planewise-masks ...)
  (index-of-max ...)
  (cross-entropy-loss ...)
  ;; We have hardcoded stuff to allow training on ImageNet.
  (reduce-ten-crop ...)
  (setup-weight-streamer ...)
  (stream-weights ...)
  (make-data-loader ..)
  (get-next-batch ...)
  (read-image-as-float-tensor ...)
  (resize-image ...)
  (center-crop-image ...)
  ;; These serialize and unserialze tensors.
  (save-weights ...)
  (load-weights ...)
  (setup-cache-allocator ...)
  (update-parameters ...)

We adopt a convention where neural network layers are defined in a curried
fashion:

(define (((layer hyperparameters ...) weights ...) inputs ...) ...)

With this, one can build a typical conventional network with function
composition.

Using this API, we have been able to implement and train Resnet-152 on
ImageNet (using GPUs). We also have been able to tensorize two different ray
tracers that also render using the GPU.

    Jeff (http://engineering.purdue.edu/~qobi)