# RegrSimple_CIFAR10.cntk shows how to train a regression model on CIFAR-10 image data. # It uses a very simple network and a composite reader using both the ImageReader # and CNTKTextFormatReader and defines the RMSE (root mean square error) as the # loss function. The value that the network learns to predict are simply the # average rgb values of an image normalized to [0, 1]. command = TrainConvNet:Write:Test makeMode = false ; traceLevel = 1 ; deviceId = "auto" rootDir = ".." ; dataDir = "$rootDir$/DataSets/CIFAR-10" ; outputDir = "Output" ; modelDir = "$outputDir$/Models" modelPath = "$ModelDir$/RegrSimple_CIFAR10.cmf" # Training action for a convolutional network TrainConvNet = { action = "train" BrainScriptNetworkBuilder = [ imageShape = 32:32:3 featScale = Constant(1/256) labelDim = 3 model (features) = { featNorm = Scale(features, featScale) h1 = LinearLayer {100, init="gaussian", initValueScale=1.5} (featNorm) ol = LinearLayer {labelDim, init="gaussian", initValueScale=1.5} (h1) }.ol # inputs features = Input {imageShape} regrLabels = Input {labelDim} # apply model to features ol = model (features) # define regression loss diff = regrLabels - ol sqerr = ReduceSum (diff.*diff, axis=1) rmse = Sqrt (sqerr / labelDim) featureNodes = (features) labelNodes = (regrLabels) criterionNodes = (rmse) evaluationNodes = (rmse) OutputNodes = (ol) ] SGD = { epochSize = 0 maxEpochs = 2 minibatchSize = 128 learningRatesPerSample = 0.0005 momentumAsTimeConstant = 1024 firstMBsToShowResult = 5 ; numMBsToShowResult = 50 } # The reader is a composite reader that uses the ImageReader to read images # and the CNTKTextFormatReader to read the regression ground truth labels. # It does so by defining an array of deserializers (using {...} : {...} below) # and assigning the inputs as defined in the network above (cf. features and regrLabels). reader = { verbosity = 0 ; randomize = true deserializers = ({ type = "ImageDeserializer" ; module = "ImageReader" file = "$dataDir$/train_map.txt" input = { features = { transforms = ( { type = "Scale" ; width = 32 ; height = 32 ; channels = 3 ; interpolations = "linear" } : { type = "Transpose" } )} ignored = { labelDim = 10 } } } : { type = "CNTKTextFormatDeserializer" ; module = "CNTKTextFormatReader" file = "$dataDir$/train_regrLabels.txt" input = { regrLabels = { dim = 3 ; format = "dense" } } }) } } # Write action Write = { action = "write" minibatchSize = 1 outputNodeNames = (ol, regrLabels, rmse) outputPath = "$OutputDir$/RegrSimple_CIFAR10" reader = { verbosity = 0 ; randomize = false deserializers = ({ type = "ImageDeserializer" ; module = "ImageReader" file = "$dataDir$/test_map.txt" input = { features = { transforms = ( { type = "Scale" ; width = 32 ; height = 32 ; channels = 3 ; interpolations = "linear" } : { type = "Transpose" } )} ignored = { labelDim = 10 } } } : { type = "CNTKTextFormatDeserializer" ; module = "CNTKTextFormatReader" file = "$dataDir$/test_regrLabels.txt" input = { regrLabels = { dim = 3 ; format = "dense" } } }) } } # Test action Test = { action = "test" minibatchSize = 512 outputNodeNames = (ol, regrLabels, rmse) outputPath = "$OutputDir$/RegrSimple_CIFAR10" reader = { verbosity = 0 ; randomize = false deserializers = ({ type = "ImageDeserializer" ; module = "ImageReader" file = "$dataDir$/test_map.txt" input = { features = { transforms = ( { type = "Scale" ; width = 32 ; height = 32 ; channels = 3 ; interpolations = "linear" } : { type = "Transpose" } )} ignored = { labelDim = 10 } } } : { type = "CNTKTextFormatDeserializer" ; module = "CNTKTextFormatReader" file = "$dataDir$/test_regrLabels.txt" input = { regrLabels = { dim = 3 ; format = "dense" } } }) } }