"Subarrays (u;.3 and u;._3) has been rewritten for virtual blocks. In
previous releases (x u;.3 y) when applied to rank-2 y was pretty fast,
but all other cases were slow, even when applying an x with 2 columns to
a y of rank 3. So, if you wanted to do an image operation on RGB
pixels, with shape hxwx3, you would wait. Now the operations are quick
enough to use - I get a 7x7 convolution on a 1000x1000 image in under a
second. One part of the change is incompatible with previous releases:
if x does not specify all axes of y, those axes are taken in full but do
not appear in the shape of the result. Previously the omitted axis was
put into the result-shape where it usually had to be removed."
I am convolving Channels x Depth x Width x Height tensors for my
rather primitive convnet implementation. I am rather confused by the sentence:
"if x does not specify all axes of y, those axes are taken in full but do
not appear in the shape of the result."
I have a 4-d tensor, which can be RGB channels, arbitrary depth, and image
width, height.
convolving with a filter (with some stride) of shape 2 3 $ stride, stride,
stride, depth, width, height
to produce a new 4-d tensor.
I assume this will need to be rewritten.
--------------------------------------------
On Fri, 4/20/18, Henry Rich <[email protected]> wrote:
Subject: [Jprogramming] Features of the new beta
To: [email protected]
Date: Friday, April 20, 2018, 5:16 AM
The new beta continues to
integrate virtual-block support, which lets
sections of nouns be used as arguments without
copying them. The main
beneficiary this
time is Rank - any u"n will execute u on virtual cells
of n. (, y), (x { y), and (x $ y) also
produce virtual results when
they can.
Subarrays (u;.3 and u;._3) has
been rewritten for virtual blocks. In
previous releases (x u;.3 y) when applied to
rank-2 y was pretty fast,
but all other
cases were slow, even when applying an x with 2 columns to
a y of rank 3. So, if you wanted to do an
image operation on RGB
pixels, with shape
hxwx3, you would wait. Now the operations are quick
enough to use - I get a 7x7 convolution on a
1000x1000 image in under a
second. One
part of the change is incompatible with previous releases:
if x does not specify all axes of y, those
axes are taken in full but do
not appear in
the shape of the result. Previously the omitted axis was
put into the result-shape where it usually
had to be removed.
One coding hint: assignments
cause virtual blocks to be realized (i. e.
copied to a new block of their own). If you
write
substr =. 1000 {.
3000 }. , 200 { bigarray
there will be no copying of data until you get
to the final assignment:
the other
operations use virtual blocks. But if you write
substr =. 1000 {. dropped =.
3000 }. raveled =. , selected =. 200 { bigarray
the data will be copied to a
new block for every assignment.
The cd verb,
which calls DLLs, has been changed so that it makes copies
of its arguments before passing them to the
DLL. Now that we have
virtual blocks,
it's just too dangerous to pass a pointer to a J noun,
because that noun might be part of another
noun. [If you really need to
do it,
there's a way, but you have to want it bad enough to
comb the
documentation].
This means that owners of
libraries that call DLLs need to make sure
they use only the boxed result of cd, and NOT
rely on a side-effect like
a change to a
name that was in the argument list to the DLL. The name
will be protected from change.
Henry Rich
---
This email has been checked
for viruses by AVG.
http://www.avg.com
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm