"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
