有人应该添加”net#”作为标签。我正在尝试通过使用以下教程,将我的Azure机器学习工作室中的神经网络改造成卷积神经网络:
https://gallery.cortanaintelligence.com/Experiment/Neural-Network-Convolution-and-pooling-deep-net-2
我的网络和教程之间的区别在于,我正在进行35个特征和1个标签的回归分析,而他们进行的是28×28个特征和10个标签的分类任务。
我从基本和第二个示例开始,并使它们工作如下:
input Data [35];hidden H1 [100] from Data all;hidden H2 [100] from H1 all;output Result [1] linear from H2 all;
现在我对卷积的转换有些误解。在教程和这里的文档中:https://learn.microsoft.com/en-us/azure/machine-learning/machine-learning-azure-ml-netsharp-reference-guide 并未提及如何计算隐藏层的节点元组值。教程中说:
hidden C1 [5, 12, 12] from Picture convolve { InputShape = [28, 28]; KernelShape = [ 5, 5]; Stride = [ 2, 2]; MapCount = 5; }hidden C2 [50, 4, 4] from C1 convolve { InputShape = [ 5, 12, 12]; KernelShape = [ 1, 5, 5]; Stride = [ 1, 2, 2]; Sharing = [ F, T, T]; MapCount = 10; }
看起来[5, 12, 12]和[50,4,4]以及KernelShape、Stride和MapCount这些值似乎凭空出现。我如何知道哪些值对我来说是有效的?我尝试使用相同的值,但它不起作用,我感觉因为他有[28,28]的输入而我有[35],我需要使用两个整数而不是三个的元组。
我刚刚尝试了一些与教程相关的随机值:
const { T = true; F = false; }input Data [35];hidden C1 [7, 23] from Data convolve { InputShape = [35]; KernelShape = [7]; Stride = [2]; MapCount = 7; }hidden C2 [200, 6] from C1 convolve { InputShape = [ 7, 23]; KernelShape = [ 1, 7]; Stride = [ 1, 2]; Sharing = [ F, T]; MapCount = 14; }hidden H3 [100] from C2 all;output Result [1] linear from H3 all;
目前似乎无法调试,因为Azure机器学习工作室唯一给出的错误代码是:
Exception":{"ErrorId":"LibraryException","ErrorCode":"1000","ExceptionType":"ModuleException","Message":"Error 1000: TLC library exception: Exception of type 'Microsoft.Numerics.AFxLibraryException' was thrown.","Exception":{"Library":"TLC","ExceptionType":"LibraryException","Message":"Exception of type 'Microsoft.Numerics.AFxLibraryException' was thrown."}}}Error: Error 1000: TLC library exception: Exception of type 'Microsoft.Numerics.AFxLibraryException' was thrown. Process exited with error code -2
感谢帮助!
回答:
对于35列长度的输入,使用给定的内核和步长,正确的网络定义如下:
const { T = true; F = false; }input Data [35];hidden C1 [7, 15] from Data convolve { InputShape = [35]; KernelShape = [7]; Stride = [2]; MapCount = 7; }hidden C2 [14, 7, 5] from C1 convolve { InputShape = [ 7, 15]; KernelShape = [ 1, 7]; Stride = [ 1, 2]; Sharing = [ F, T]; MapCount = 14; }hidden H3 [100] from C2 all;output Result [1] linear from H3 all;
首先,C1 = [7,15]。第一个维度简单地是MapCount。对于第二个维度,内核形状定义了用于扫描输入列的“窗口”的长度,步长定义了每次移动的距离。因此,内核窗口将覆盖列1-7、3-9、5-11、…、29-35,当你计算窗口时,第二个维度为15。
接下来,C2 = [14,7,5]。第一个维度再次是MapCount。对于第二个和第三个维度,1乘7的内核“窗口”必须覆盖7乘15的输入大小,使用沿相应维度的1和2的步长。
请注意,如果你想平展输出,你可以指定C2隐藏层的形状为[98,5]甚至[490]。