Commit 7bb6a3da authored by Carlos Alfredo Yeverino Rodriguez's avatar Carlos Alfredo Yeverino Rodriguez
Browse files

Updated convolution and pooling layer templates

parent c995f497
......@@ -165,31 +165,22 @@ public class ArchitectureElementData {
}
@Nullable
public List<Integer> getPadding(){
public Integer getPadding(){
return getPadding((LayerSymbol) getElement());
}
@Nullable
public List<Integer> getPadding(LayerSymbol layer){
List<Integer> kernel = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get();
List<Integer> stride = layer.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get();
ArchTypeSymbol inputType = layer.getInputTypes().get(0);
ArchTypeSymbol outputType = layer.getOutputTypes().get(0);
int heightWithPad = kernel.get(0) + stride.get(0)*(outputType.getHeight() - 1);
int widthWithPad = kernel.get(1) + stride.get(1)*(outputType.getWidth() - 1);
int heightPad = Math.max(0, heightWithPad - inputType.getHeight());
int widthPad = Math.max(0, widthWithPad - inputType.getWidth());
int topPad = (int)Math.ceil(heightPad / 2.0);
int bottomPad = (int)Math.floor(heightPad / 2.0);
int leftPad = (int)Math.ceil(widthPad / 2.0);
int rightPad = (int)Math.floor(widthPad / 2.0);
if (topPad == 0 && bottomPad == 0 && leftPad == 0 && rightPad == 0){
return null;
public Integer getPadding(LayerSymbol layer){
String padding_type = ((LayerSymbol) getElement()).getStringValue(AllPredefinedLayers.PADDING_NAME).get();
Integer pad=0;
if (padding_type.equals(AllPredefinedLayers.PADDING_VALID)){
pad = 0;
}
else if (padding_type.equals(AllPredefinedLayers.PADDING_SAME)){
pad = 1;
}
return Arrays.asList(0,0,0,0,topPad,bottomPad,leftPad,rightPad);
return pad;
}
}
......@@ -3,8 +3,14 @@
<#assign strideWidth = element.stride[1]>
<#assign kernelHeight = element.kernel[0]>
<#assign kernelWidth = element.kernel[1]>
<#if element.padding??> <#-- Check wheather padding null is. -->
<#-- TODO: check how to adapt CNNArchLang argument pad_width=${element.padding[0]} -->
<#if element.padding??>
<#if element.padding == 0>
<#assign padParameter = ""><#--Don't add anything since "valid" is the default padding of Caffe2-->
<#elseif element.padding == 1>
<#assign padParameter = ", pad=1">
</#if>
<#else>
<#assign padParameter = ", pad=1">
</#if>
<#if strideHeight == strideWidth>
<#assign strideParameter = "stride=${strideHeight}">
......@@ -16,6 +22,5 @@
<#else>
<#assign kernelParameter = "kernel=[${kernelHeight},${kernelWidth}]">
</#if>
${element.name} = brew.conv(model, ${input}, '${element.name}', dim_in=${element.element.inputTypes[0].channels?c}, dim_out=${element.channels?c}, ${kernelParameter}, ${strideParameter})
<#-- TODO: check how to adapt CNNArchLang argument no_bias=${element.noBias?string("True","False")} -->
${element.name} = brew.conv(model, ${input}, '${element.name}', dim_in=${element.element.inputTypes[0].channels?c}, dim_out=${element.channels?c}, ${kernelParameter}, ${strideParameter}${padParameter})
<#include "OutputShape.ftl">
\ No newline at end of file
......@@ -4,7 +4,13 @@
<#assign kernelHeight = element.kernel[0]>
<#assign kernelWidth = element.kernel[1]>
<#if element.padding??>
<#-- TODO: check how to adapt CNNArchLang argument pad_width=${element.padding[0]} -->
<#if element.padding == 0>
<#assign padParameter = ""><#--Don't add anything since "valid" is the default padding of Caffe2-->
<#elseif element.padding == 1>
<#assign padParameter = ", pad=1">
</#if>
<#else>
<#assign padParameter = ", pad=1">
</#if>
<#if strideHeight == strideWidth>
<#assign strideParameter = "stride=${strideHeight}">
......@@ -19,6 +25,6 @@
<#if element.poolType == "max">
${element.name} = brew.max_pool(model, ${input}, '${element.name}', ${kernelParameter}, ${strideParameter})
<#elseif element.poolType == "avg">
${element.name} = brew.average_pool(model, ${input}, '${element.name}', ${kernelParameter}, ${strideParameter})
${element.name} = brew.average_pool(model, ${input}, '${element.name}', ${kernelParameter}, ${strideParameter}${padParameter})
</#if>
<#include "OutputShape.ftl">
\ No newline at end of file
......@@ -64,18 +64,18 @@ class CNNCreator_CifarClassifierNetwork:
data = data
# data, output shape: {[3,32,32]}
conv2_1_ = brew.conv(model, data, 'conv2_1_', dim_in=3, dim_out=8, kernel=3, stride=1)
conv2_1_ = brew.conv(model, data, 'conv2_1_', dim_in=3, dim_out=8, kernel=3, stride=1, pad=1)
# conv2_1_, output shape: {[8,32,32]}
batchnorm2_1_ = mx.symbol.BatchNorm(data=conv2_1_,
fix_gamma=True,
name="batchnorm2_1_")
relu2_1_ = brew.relu(model, batchnorm2_1_, batchnorm2_1_)
conv3_1_ = brew.conv(model, relu2_1_, 'conv3_1_', dim_in=8, dim_out=8, kernel=3, stride=1)
conv3_1_ = brew.conv(model, relu2_1_, 'conv3_1_', dim_in=8, dim_out=8, kernel=3, stride=1, pad=1)
# conv3_1_, output shape: {[8,32,32]}
batchnorm3_1_ = mx.symbol.BatchNorm(data=conv3_1_,
fix_gamma=True,
name="batchnorm3_1_")
conv2_2_ = brew.conv(model, data, 'conv2_2_', dim_in=3, dim_out=8, kernel=1, stride=1)
conv2_2_ = brew.conv(model, data, 'conv2_2_', dim_in=3, dim_out=8, kernel=1, stride=1, pad=1)
# conv2_2_, output shape: {[8,32,32]}
batchnorm2_2_ = mx.symbol.BatchNorm(data=conv2_2_,
fix_gamma=True,
......@@ -83,18 +83,18 @@ class CNNCreator_CifarClassifierNetwork:
add4_ = batchnorm3_1_ + batchnorm2_2_
# add4_, output shape: {[8,32,32]}
relu4_ = brew.relu(model, add4_, add4_)
conv5_1_ = brew.conv(model, relu4_, 'conv5_1_', dim_in=8, dim_out=16, kernel=3, stride=2)
conv5_1_ = brew.conv(model, relu4_, 'conv5_1_', dim_in=8, dim_out=16, kernel=3, stride=2, pad=1)
# conv5_1_, output shape: {[16,16,16]}
batchnorm5_1_ = mx.symbol.BatchNorm(data=conv5_1_,
fix_gamma=True,
name="batchnorm5_1_")
relu5_1_ = brew.relu(model, batchnorm5_1_, batchnorm5_1_)
conv6_1_ = brew.conv(model, relu5_1_, 'conv6_1_', dim_in=16, dim_out=16, kernel=3, stride=1)
conv6_1_ = brew.conv(model, relu5_1_, 'conv6_1_', dim_in=16, dim_out=16, kernel=3, stride=1, pad=1)
# conv6_1_, output shape: {[16,16,16]}
batchnorm6_1_ = mx.symbol.BatchNorm(data=conv6_1_,
fix_gamma=True,
name="batchnorm6_1_")
conv5_2_ = brew.conv(model, relu4_, 'conv5_2_', dim_in=8, dim_out=16, kernel=1, stride=2)
conv5_2_ = brew.conv(model, relu4_, 'conv5_2_', dim_in=8, dim_out=16, kernel=1, stride=2, pad=1)
# conv5_2_, output shape: {[16,16,16]}
batchnorm5_2_ = mx.symbol.BatchNorm(data=conv5_2_,
fix_gamma=True,
......@@ -102,13 +102,13 @@ class CNNCreator_CifarClassifierNetwork:
add7_ = batchnorm6_1_ + batchnorm5_2_
# add7_, output shape: {[16,16,16]}
relu7_ = brew.relu(model, add7_, add7_)
conv8_1_ = brew.conv(model, relu7_, 'conv8_1_', dim_in=16, dim_out=16, kernel=3, stride=1)
conv8_1_ = brew.conv(model, relu7_, 'conv8_1_', dim_in=16, dim_out=16, kernel=3, stride=1, pad=1)
# conv8_1_, output shape: {[16,16,16]}
batchnorm8_1_ = mx.symbol.BatchNorm(data=conv8_1_,
fix_gamma=True,
name="batchnorm8_1_")
relu8_1_ = brew.relu(model, batchnorm8_1_, batchnorm8_1_)
conv9_1_ = brew.conv(model, relu8_1_, 'conv9_1_', dim_in=16, dim_out=16, kernel=3, stride=1)
conv9_1_ = brew.conv(model, relu8_1_, 'conv9_1_', dim_in=16, dim_out=16, kernel=3, stride=1, pad=1)
# conv9_1_, output shape: {[16,16,16]}
batchnorm9_1_ = mx.symbol.BatchNorm(data=conv9_1_,
fix_gamma=True,
......@@ -116,13 +116,13 @@ class CNNCreator_CifarClassifierNetwork:
add10_ = batchnorm9_1_ + relu7_
# add10_, output shape: {[16,16,16]}
relu10_ = brew.relu(model, add10_, add10_)
conv11_1_ = brew.conv(model, relu10_, 'conv11_1_', dim_in=16, dim_out=16, kernel=3, stride=1)
conv11_1_ = brew.conv(model, relu10_, 'conv11_1_', dim_in=16, dim_out=16, kernel=3, stride=1, pad=1)
# conv11_1_, output shape: {[16,16,16]}
batchnorm11_1_ = mx.symbol.BatchNorm(data=conv11_1_,
fix_gamma=True,
name="batchnorm11_1_")
relu11_1_ = brew.relu(model, batchnorm11_1_, batchnorm11_1_)
conv12_1_ = brew.conv(model, relu11_1_, 'conv12_1_', dim_in=16, dim_out=16, kernel=3, stride=1)
conv12_1_ = brew.conv(model, relu11_1_, 'conv12_1_', dim_in=16, dim_out=16, kernel=3, stride=1, pad=1)
# conv12_1_, output shape: {[16,16,16]}
batchnorm12_1_ = mx.symbol.BatchNorm(data=conv12_1_,
fix_gamma=True,
......@@ -130,18 +130,18 @@ class CNNCreator_CifarClassifierNetwork:
add13_ = batchnorm12_1_ + relu10_
# add13_, output shape: {[16,16,16]}
relu13_ = brew.relu(model, add13_, add13_)
conv14_1_ = brew.conv(model, relu13_, 'conv14_1_', dim_in=16, dim_out=32, kernel=3, stride=2)
conv14_1_ = brew.conv(model, relu13_, 'conv14_1_', dim_in=16, dim_out=32, kernel=3, stride=2, pad=1)
# conv14_1_, output shape: {[32,8,8]}
batchnorm14_1_ = mx.symbol.BatchNorm(data=conv14_1_,
fix_gamma=True,
name="batchnorm14_1_")
relu14_1_ = brew.relu(model, batchnorm14_1_, batchnorm14_1_)
conv15_1_ = brew.conv(model, relu14_1_, 'conv15_1_', dim_in=32, dim_out=32, kernel=3, stride=1)
conv15_1_ = brew.conv(model, relu14_1_, 'conv15_1_', dim_in=32, dim_out=32, kernel=3, stride=1, pad=1)
# conv15_1_, output shape: {[32,8,8]}
batchnorm15_1_ = mx.symbol.BatchNorm(data=conv15_1_,
fix_gamma=True,
name="batchnorm15_1_")
conv14_2_ = brew.conv(model, relu13_, 'conv14_2_', dim_in=16, dim_out=32, kernel=1, stride=2)
conv14_2_ = brew.conv(model, relu13_, 'conv14_2_', dim_in=16, dim_out=32, kernel=1, stride=2, pad=1)
# conv14_2_, output shape: {[32,8,8]}
batchnorm14_2_ = mx.symbol.BatchNorm(data=conv14_2_,
fix_gamma=True,
......@@ -149,13 +149,13 @@ class CNNCreator_CifarClassifierNetwork:
add16_ = batchnorm15_1_ + batchnorm14_2_
# add16_, output shape: {[32,8,8]}
relu16_ = brew.relu(model, add16_, add16_)
conv17_1_ = brew.conv(model, relu16_, 'conv17_1_', dim_in=32, dim_out=32, kernel=3, stride=1)
conv17_1_ = brew.conv(model, relu16_, 'conv17_1_', dim_in=32, dim_out=32, kernel=3, stride=1, pad=1)
# conv17_1_, output shape: {[32,8,8]}
batchnorm17_1_ = mx.symbol.BatchNorm(data=conv17_1_,
fix_gamma=True,
name="batchnorm17_1_")
relu17_1_ = brew.relu(model, batchnorm17_1_, batchnorm17_1_)
conv18_1_ = brew.conv(model, relu17_1_, 'conv18_1_', dim_in=32, dim_out=32, kernel=3, stride=1)
conv18_1_ = brew.conv(model, relu17_1_, 'conv18_1_', dim_in=32, dim_out=32, kernel=3, stride=1, pad=1)
# conv18_1_, output shape: {[32,8,8]}
batchnorm18_1_ = mx.symbol.BatchNorm(data=conv18_1_,
fix_gamma=True,
......@@ -163,13 +163,13 @@ class CNNCreator_CifarClassifierNetwork:
add19_ = batchnorm18_1_ + relu16_
# add19_, output shape: {[32,8,8]}
relu19_ = brew.relu(model, add19_, add19_)
conv20_1_ = brew.conv(model, relu19_, 'conv20_1_', dim_in=32, dim_out=32, kernel=3, stride=1)
conv20_1_ = brew.conv(model, relu19_, 'conv20_1_', dim_in=32, dim_out=32, kernel=3, stride=1, pad=1)
# conv20_1_, output shape: {[32,8,8]}
batchnorm20_1_ = mx.symbol.BatchNorm(data=conv20_1_,
fix_gamma=True,
name="batchnorm20_1_")
relu20_1_ = brew.relu(model, batchnorm20_1_, batchnorm20_1_)
conv21_1_ = brew.conv(model, relu20_1_, 'conv21_1_', dim_in=32, dim_out=32, kernel=3, stride=1)
conv21_1_ = brew.conv(model, relu20_1_, 'conv21_1_', dim_in=32, dim_out=32, kernel=3, stride=1, pad=1)
# conv21_1_, output shape: {[32,8,8]}
batchnorm21_1_ = mx.symbol.BatchNorm(data=conv21_1_,
fix_gamma=True,
......@@ -177,18 +177,18 @@ class CNNCreator_CifarClassifierNetwork:
add22_ = batchnorm21_1_ + relu19_
# add22_, output shape: {[32,8,8]}
relu22_ = brew.relu(model, add22_, add22_)
conv23_1_ = brew.conv(model, relu22_, 'conv23_1_', dim_in=32, dim_out=64, kernel=3, stride=2)
conv23_1_ = brew.conv(model, relu22_, 'conv23_1_', dim_in=32, dim_out=64, kernel=3, stride=2, pad=1)
# conv23_1_, output shape: {[64,4,4]}
batchnorm23_1_ = mx.symbol.BatchNorm(data=conv23_1_,
fix_gamma=True,
name="batchnorm23_1_")
relu23_1_ = brew.relu(model, batchnorm23_1_, batchnorm23_1_)
conv24_1_ = brew.conv(model, relu23_1_, 'conv24_1_', dim_in=64, dim_out=64, kernel=3, stride=1)
conv24_1_ = brew.conv(model, relu23_1_, 'conv24_1_', dim_in=64, dim_out=64, kernel=3, stride=1, pad=1)
# conv24_1_, output shape: {[64,4,4]}
batchnorm24_1_ = mx.symbol.BatchNorm(data=conv24_1_,
fix_gamma=True,
name="batchnorm24_1_")
conv23_2_ = brew.conv(model, relu22_, 'conv23_2_', dim_in=32, dim_out=64, kernel=1, stride=2)
conv23_2_ = brew.conv(model, relu22_, 'conv23_2_', dim_in=32, dim_out=64, kernel=1, stride=2, pad=1)
# conv23_2_, output shape: {[64,4,4]}
batchnorm23_2_ = mx.symbol.BatchNorm(data=conv23_2_,
fix_gamma=True,
......@@ -196,13 +196,13 @@ class CNNCreator_CifarClassifierNetwork:
add25_ = batchnorm24_1_ + batchnorm23_2_
# add25_, output shape: {[64,4,4]}
relu25_ = brew.relu(model, add25_, add25_)
conv26_1_ = brew.conv(model, relu25_, 'conv26_1_', dim_in=64, dim_out=64, kernel=3, stride=1)
conv26_1_ = brew.conv(model, relu25_, 'conv26_1_', dim_in=64, dim_out=64, kernel=3, stride=1, pad=1)
# conv26_1_, output shape: {[64,4,4]}
batchnorm26_1_ = mx.symbol.BatchNorm(data=conv26_1_,
fix_gamma=True,
name="batchnorm26_1_")
relu26_1_ = brew.relu(model, batchnorm26_1_, batchnorm26_1_)
conv27_1_ = brew.conv(model, relu26_1_, 'conv27_1_', dim_in=64, dim_out=64, kernel=3, stride=1)
conv27_1_ = brew.conv(model, relu26_1_, 'conv27_1_', dim_in=64, dim_out=64, kernel=3, stride=1, pad=1)
# conv27_1_, output shape: {[64,4,4]}
batchnorm27_1_ = mx.symbol.BatchNorm(data=conv27_1_,
fix_gamma=True,
......@@ -210,13 +210,13 @@ class CNNCreator_CifarClassifierNetwork:
add28_ = batchnorm27_1_ + relu25_
# add28_, output shape: {[64,4,4]}
relu28_ = brew.relu(model, add28_, add28_)
conv29_1_ = brew.conv(model, relu28_, 'conv29_1_', dim_in=64, dim_out=64, kernel=3, stride=1)
conv29_1_ = brew.conv(model, relu28_, 'conv29_1_', dim_in=64, dim_out=64, kernel=3, stride=1, pad=1)
# conv29_1_, output shape: {[64,4,4]}
batchnorm29_1_ = mx.symbol.BatchNorm(data=conv29_1_,
fix_gamma=True,
name="batchnorm29_1_")
relu29_1_ = brew.relu(model, batchnorm29_1_, batchnorm29_1_)
conv30_1_ = brew.conv(model, relu29_1_, 'conv30_1_', dim_in=64, dim_out=64, kernel=3, stride=1)
conv30_1_ = brew.conv(model, relu29_1_, 'conv30_1_', dim_in=64, dim_out=64, kernel=3, stride=1, pad=1)
# conv30_1_, output shape: {[64,4,4]}
batchnorm30_1_ = mx.symbol.BatchNorm(data=conv30_1_,
fix_gamma=True,
......
......@@ -64,51 +64,51 @@ class CNNCreator_VGG16:
data = data
# data, output shape: {[3,224,224]}
conv1_ = brew.conv(model, data, 'conv1_', dim_in=3, dim_out=64, kernel=3, stride=1)
conv1_ = brew.conv(model, data, 'conv1_', dim_in=3, dim_out=64, kernel=3, stride=1, pad=1)
# conv1_, output shape: {[64,224,224]}
relu1_ = brew.relu(model, conv1_, conv1_)
conv2_ = brew.conv(model, relu1_, 'conv2_', dim_in=64, dim_out=64, kernel=3, stride=1)
conv2_ = brew.conv(model, relu1_, 'conv2_', dim_in=64, dim_out=64, kernel=3, stride=1, pad=1)
# conv2_, output shape: {[64,224,224]}
relu2_ = brew.relu(model, conv2_, conv2_)
pool2_ = brew.max_pool(model, relu2_, 'pool2_', kernel=2, stride=2)
# pool2_, output shape: {[64,112,112]}
conv3_ = brew.conv(model, pool2_, 'conv3_', dim_in=64, dim_out=128, kernel=3, stride=1)
conv3_ = brew.conv(model, pool2_, 'conv3_', dim_in=64, dim_out=128, kernel=3, stride=1, pad=1)
# conv3_, output shape: {[128,112,112]}
relu3_ = brew.relu(model, conv3_, conv3_)
conv4_ = brew.conv(model, relu3_, 'conv4_', dim_in=128, dim_out=128, kernel=3, stride=1)
conv4_ = brew.conv(model, relu3_, 'conv4_', dim_in=128, dim_out=128, kernel=3, stride=1, pad=1)
# conv4_, output shape: {[128,112,112]}
relu4_ = brew.relu(model, conv4_, conv4_)
pool4_ = brew.max_pool(model, relu4_, 'pool4_', kernel=2, stride=2)
# pool4_, output shape: {[128,56,56]}
conv5_ = brew.conv(model, pool4_, 'conv5_', dim_in=128, dim_out=256, kernel=3, stride=1)
conv5_ = brew.conv(model, pool4_, 'conv5_', dim_in=128, dim_out=256, kernel=3, stride=1, pad=1)
# conv5_, output shape: {[256,56,56]}
relu5_ = brew.relu(model, conv5_, conv5_)
conv6_ = brew.conv(model, relu5_, 'conv6_', dim_in=256, dim_out=256, kernel=3, stride=1)
conv6_ = brew.conv(model, relu5_, 'conv6_', dim_in=256, dim_out=256, kernel=3, stride=1, pad=1)
# conv6_, output shape: {[256,56,56]}
relu6_ = brew.relu(model, conv6_, conv6_)
conv7_ = brew.conv(model, relu6_, 'conv7_', dim_in=256, dim_out=256, kernel=3, stride=1)
conv7_ = brew.conv(model, relu6_, 'conv7_', dim_in=256, dim_out=256, kernel=3, stride=1, pad=1)
# conv7_, output shape: {[256,56,56]}
relu7_ = brew.relu(model, conv7_, conv7_)
pool7_ = brew.max_pool(model, relu7_, 'pool7_', kernel=2, stride=2)
# pool7_, output shape: {[256,28,28]}
conv8_ = brew.conv(model, pool7_, 'conv8_', dim_in=256, dim_out=512, kernel=3, stride=1)
conv8_ = brew.conv(model, pool7_, 'conv8_', dim_in=256, dim_out=512, kernel=3, stride=1, pad=1)
# conv8_, output shape: {[512,28,28]}
relu8_ = brew.relu(model, conv8_, conv8_)
conv9_ = brew.conv(model, relu8_, 'conv9_', dim_in=512, dim_out=512, kernel=3, stride=1)
conv9_ = brew.conv(model, relu8_, 'conv9_', dim_in=512, dim_out=512, kernel=3, stride=1, pad=1)
# conv9_, output shape: {[512,28,28]}
relu9_ = brew.relu(model, conv9_, conv9_)
conv10_ = brew.conv(model, relu9_, 'conv10_', dim_in=512, dim_out=512, kernel=3, stride=1)
conv10_ = brew.conv(model, relu9_, 'conv10_', dim_in=512, dim_out=512, kernel=3, stride=1, pad=1)
# conv10_, output shape: {[512,28,28]}
relu10_ = brew.relu(model, conv10_, conv10_)
pool10_ = brew.max_pool(model, relu10_, 'pool10_', kernel=2, stride=2)
# pool10_, output shape: {[512,14,14]}
conv11_ = brew.conv(model, pool10_, 'conv11_', dim_in=512, dim_out=512, kernel=3, stride=1)
conv11_ = brew.conv(model, pool10_, 'conv11_', dim_in=512, dim_out=512, kernel=3, stride=1, pad=1)
# conv11_, output shape: {[512,14,14]}
relu11_ = brew.relu(model, conv11_, conv11_)
conv12_ = brew.conv(model, relu11_, 'conv12_', dim_in=512, dim_out=512, kernel=3, stride=1)
conv12_ = brew.conv(model, relu11_, 'conv12_', dim_in=512, dim_out=512, kernel=3, stride=1, pad=1)
# conv12_, output shape: {[512,14,14]}
relu12_ = brew.relu(model, conv12_, conv12_)
conv13_ = brew.conv(model, relu12_, 'conv13_', dim_in=512, dim_out=512, kernel=3, stride=1)
conv13_ = brew.conv(model, relu12_, 'conv13_', dim_in=512, dim_out=512, kernel=3, stride=1, pad=1)
# conv13_, output shape: {[512,14,14]}
relu13_ = brew.relu(model, conv13_, conv13_)
pool13_ = brew.max_pool(model, relu13_, 'pool13_', kernel=2, stride=2)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment