33 from daal
import step1Local, step2Master
34 from daal.algorithms.neural_networks
import initializers
35 from daal.algorithms.neural_networks
import layers
36 from daal.algorithms
import optimization_solver
37 from daal.algorithms.neural_networks
import prediction, training
38 from daal.data_management
import NumericTable, HomogenNumericTable, readOnly, SubtensorDescriptor, HomogenTensor
40 utils_folder = os.path.realpath(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
41 if utils_folder
not in sys.path:
42 sys.path.insert(0, utils_folder)
43 from utils
import printTensors, readTensorFromCSV
46 trainDatasetFileNames = [
47 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_dense_1.csv"),
48 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_dense_2.csv"),
49 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_dense_3.csv"),
50 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_dense_4.csv")
52 trainGroundTruthFileNames = [
53 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_ground_truth_1.csv"),
54 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_ground_truth_2.csv"),
55 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_ground_truth_3.csv"),
56 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_ground_truth_4.csv")
59 testDatasetFile = os.path.join(
"..",
"data",
"batch",
"neural_network_test.csv")
60 testGroundTruthFile = os.path.join(
"..",
"data",
"batch",
"neural_network_test_ground_truth.csv")
64 batchSizeLocal = int(batchSize / nNodes)
71 fullyConnectedLayer1 = layers.fullyconnected.Batch(20)
72 fullyConnectedLayer1.parameter.weightsInitializer = initializers.uniform.Batch(-0.001, 0.001)
73 fullyConnectedLayer1.parameter.biasesInitializer = initializers.uniform.Batch(0, 0.5)
76 fullyConnectedLayer2 = layers.fullyconnected.Batch(m2)
77 fullyConnectedLayer2.parameter.weightsInitializer = initializers.uniform.Batch(0.5, 1)
78 fullyConnectedLayer2.parameter.biasesInitializer = initializers.uniform.Batch(0.5, 1)
81 fullyConnectedLayer3 = layers.fullyconnected.Batch(2)
82 fullyConnectedLayer3.parameter.weightsInitializer = initializers.uniform.Batch(-0.005, 0.005)
83 fullyConnectedLayer3.parameter.biasesInitializer = initializers.uniform.Batch(0, 1)
86 softmaxCrossEntropyLayer = layers.loss.softmax_cross.Batch()
89 topology = training.Topology()
92 fc1 = topology.add(fullyConnectedLayer1)
93 fc2 = topology.add(fullyConnectedLayer2)
94 fc3 = topology.add(fullyConnectedLayer3)
95 sm = topology.add(softmaxCrossEntropyLayer)
96 topology.get(fc1).addNext(fc2)
97 topology.get(fc2).addNext(fc3)
98 topology.get(fc3).addNext(sm)
103 def getNextSubtensor(inputTensor, startPos, nElements):
104 dims = inputTensor.getDimensions()
107 subtensorBlock = SubtensorDescriptor(ntype=np.float32)
108 inputTensor.getSubtensor([], startPos, nElements, readOnly, subtensorBlock)
109 subtensorData = np.array(subtensorBlock.getArray(), dtype=np.float32)
110 inputTensor.releaseSubtensor(subtensorBlock)
112 return HomogenTensor(subtensorData, ntype=np.float32)
115 def initializeNetwork():
116 trainingData = [
None] * nNodes
117 trainingGroundTruth = [
None] * nNodes
119 for node
in range(nNodes):
120 trainingData[node] = readTensorFromCSV(trainDatasetFileNames[node])
121 trainingGroundTruth[node] = readTensorFromCSV(trainGroundTruthFileNames[node],
True)
123 sampleSize = trainingData[0].getDimensions()
124 sampleSize[0] = batchSizeLocal
127 sgdAlgorithm = optimization_solver.sgd.Batch(fptype=np.float32)
128 sgdAlgorithm.parameter.batchSize = batchSizeLocal
131 topologyMaster = configureNet()
132 net = training.Distributed(step2Master, sgdAlgorithm)
133 net.parameter.batchSize = batchSizeLocal
136 net.initialize(sampleSize, topologyMaster)
138 topology = [
None] * nNodes
139 netLocal = [
None] * nNodes
140 for node
in range(nNodes):
142 topology[node] = configureNet()
145 trainingModel = training.Model()
146 trainingModel.initialize_Float32(sampleSize, topology[node])
148 netLocal[node] = training.Distributed(step1Local)
149 netLocal[node].input.setStep1LocalInput(training.inputModel, trainingModel)
152 netLocal[node].parameter.batchSize = batchSizeLocal
154 return (net, netLocal, trainingData, trainingGroundTruth)
157 def trainModel(net, netLocal, trainingData, trainingGroundTruth):
159 sgdAlgorithm = optimization_solver.sgd.Batch(fptype=np.float32)
163 sgdAlgorithm.parameter.learningRateSequence = HomogenNumericTable(1, 1, NumericTable.doAllocate, learningRate)
166 net.parameter.optimizationSolver = sgdAlgorithm
169 nSamples = trainingData[0].getDimensions()[0]
170 for i
in range(0, nSamples - batchSizeLocal + 1, batchSizeLocal):
172 for node
in range(nNodes):
174 netLocal[node].input.setInput(training.data, getNextSubtensor(trainingData[node], i, batchSizeLocal))
175 netLocal[node].input.setInput(training.groundTruth, getNextSubtensor(trainingGroundTruth[node], i, batchSizeLocal))
178 pres = netLocal[node].compute()
181 net.input.add(training.partialResults, node, pres)
185 wb = net.getPartialResult().get(training.resultFromMaster).get(training.model).getWeightsAndBiases()
188 for node
in range(nNodes):
189 netLocal[node].input.getStep1LocalInput(training.inputModel).setWeightsAndBiases(wb)
192 res = net.finalizeCompute()
195 return res.get(training.model).getPredictionModel_Float32()
198 def testModel(predictionModel):
200 predictionData = readTensorFromCSV(testDatasetFile)
203 net = prediction.Batch()
206 net.parameter.batchSize = predictionData.getDimensionSize(0)
209 net.input.setModelInput(prediction.model, predictionModel)
210 net.input.setTensorInput(prediction.data, predictionData)
216 def printResults(testGroundTruthFile, predictionResult):
218 predictionGroundTruth = readTensorFromCSV(testGroundTruthFile)
220 printTensors(predictionGroundTruth, predictionResult.getResult(prediction.prediction),
221 "Ground truth",
"Neural network predictions: each class probability",
222 "Neural network classification results (first 20 observations):", 20)
226 init = initializeNetwork()
227 predictionModel = trainModel(*init)
228 predictionResult = testModel(predictionModel)
229 printResults(testGroundTruthFile, predictionResult)
232 if __name__ ==
"__main__":