31 from daal
import step1Local, step2Master
32 from daal.algorithms.neural_networks
import initializers
33 from daal.algorithms.neural_networks
import layers
34 from daal.algorithms
import optimization_solver
35 from daal.algorithms.neural_networks
import prediction, training
36 from daal.data_management
import NumericTable, HomogenNumericTable, readOnly, SubtensorDescriptor, HomogenTensor
38 utils_folder = os.path.realpath(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
39 if utils_folder
not in sys.path:
40 sys.path.insert(0, utils_folder)
41 from utils
import printTensors, readTensorFromCSV
44 trainDatasetFileNames = [
45 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_dense_1.csv"),
46 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_dense_2.csv"),
47 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_dense_3.csv"),
48 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_dense_4.csv")
50 trainGroundTruthFileNames = [
51 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_ground_truth_1.csv"),
52 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_ground_truth_2.csv"),
53 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_ground_truth_3.csv"),
54 os.path.join(
"..",
"data",
"distributed",
"neural_network_train_ground_truth_4.csv")
57 testDatasetFile = os.path.join(
"..",
"data",
"batch",
"neural_network_test.csv")
58 testGroundTruthFile = os.path.join(
"..",
"data",
"batch",
"neural_network_test_ground_truth.csv")
62 batchSizeLocal = int(batchSize / nNodes)
69 fullyConnectedLayer1 = layers.fullyconnected.Batch(20)
70 fullyConnectedLayer1.parameter.weightsInitializer = initializers.uniform.Batch(-0.001, 0.001)
71 fullyConnectedLayer1.parameter.biasesInitializer = initializers.uniform.Batch(0, 0.5)
74 fullyConnectedLayer2 = layers.fullyconnected.Batch(m2)
75 fullyConnectedLayer2.parameter.weightsInitializer = initializers.uniform.Batch(0.5, 1)
76 fullyConnectedLayer2.parameter.biasesInitializer = initializers.uniform.Batch(0.5, 1)
79 fullyConnectedLayer3 = layers.fullyconnected.Batch(2)
80 fullyConnectedLayer3.parameter.weightsInitializer = initializers.uniform.Batch(-0.005, 0.005)
81 fullyConnectedLayer3.parameter.biasesInitializer = initializers.uniform.Batch(0, 1)
84 softmaxCrossEntropyLayer = layers.loss.softmax_cross.Batch()
87 topology = training.Topology()
90 fc1 = topology.add(fullyConnectedLayer1)
91 fc2 = topology.add(fullyConnectedLayer2)
92 fc3 = topology.add(fullyConnectedLayer3)
93 sm = topology.add(softmaxCrossEntropyLayer)
94 topology.get(fc1).addNext(fc2)
95 topology.get(fc2).addNext(fc3)
96 topology.get(fc3).addNext(sm)
101 def getNextSubtensor(inputTensor, startPos, nElements):
102 dims = inputTensor.getDimensions()
105 subtensorBlock = SubtensorDescriptor(ntype=np.float32)
106 inputTensor.getSubtensor([], startPos, nElements, readOnly, subtensorBlock)
107 subtensorData = np.array(subtensorBlock.getArray(), dtype=np.float32)
108 inputTensor.releaseSubtensor(subtensorBlock)
110 return HomogenTensor(subtensorData, ntype=np.float32)
113 def initializeNetwork():
114 trainingData = [
None] * nNodes
115 trainingGroundTruth = [
None] * nNodes
117 for node
in range(nNodes):
118 trainingData[node] = readTensorFromCSV(trainDatasetFileNames[node])
119 trainingGroundTruth[node] = readTensorFromCSV(trainGroundTruthFileNames[node],
True)
121 sampleSize = trainingData[0].getDimensions()
122 sampleSize[0] = batchSizeLocal
125 sgdAlgorithm = optimization_solver.sgd.Batch(fptype=np.float32)
126 sgdAlgorithm.parameter.batchSize = batchSizeLocal
129 topologyMaster = configureNet()
130 net = training.Distributed(step2Master, sgdAlgorithm)
131 net.parameter.batchSize = batchSizeLocal
134 net.initialize(sampleSize, topologyMaster)
136 topology = [
None] * nNodes
137 netLocal = [
None] * nNodes
138 for node
in range(nNodes):
140 topology[node] = configureNet()
143 trainingModel = training.Model()
144 trainingModel.initialize_Float32(sampleSize, topology[node])
146 netLocal[node] = training.Distributed(step1Local)
147 netLocal[node].input.setStep1LocalInput(training.inputModel, trainingModel)
150 netLocal[node].parameter.batchSize = batchSizeLocal
152 return (net, netLocal, trainingData, trainingGroundTruth)
155 def trainModel(net, netLocal, trainingData, trainingGroundTruth):
157 sgdAlgorithm = optimization_solver.sgd.Batch(fptype=np.float32)
161 sgdAlgorithm.parameter.learningRateSequence = HomogenNumericTable(1, 1, NumericTable.doAllocate, learningRate)
164 net.parameter.optimizationSolver = sgdAlgorithm
167 nSamples = trainingData[0].getDimensions()[0]
168 for i
in range(0, nSamples - batchSizeLocal + 1, batchSizeLocal):
170 for node
in range(nNodes):
172 netLocal[node].input.setInput(training.data, getNextSubtensor(trainingData[node], i, batchSizeLocal))
173 netLocal[node].input.setInput(training.groundTruth, getNextSubtensor(trainingGroundTruth[node], i, batchSizeLocal))
176 pres = netLocal[node].compute()
179 net.input.add(training.partialResults, node, pres)
183 wb = net.getPartialResult().get(training.resultFromMaster).get(training.model).getWeightsAndBiases()
186 for node
in range(nNodes):
187 netLocal[node].input.getStep1LocalInput(training.inputModel).setWeightsAndBiases(wb)
190 res = net.finalizeCompute()
193 return res.get(training.model).getPredictionModel_Float32()
196 def testModel(predictionModel):
198 predictionData = readTensorFromCSV(testDatasetFile)
201 net = prediction.Batch()
204 net.parameter.batchSize = predictionData.getDimensionSize(0)
207 net.input.setModelInput(prediction.model, predictionModel)
208 net.input.setTensorInput(prediction.data, predictionData)
214 def printResults(testGroundTruthFile, predictionResult):
216 predictionGroundTruth = readTensorFromCSV(testGroundTruthFile)
218 printTensors(predictionGroundTruth, predictionResult.getResult(prediction.prediction),
219 "Ground truth",
"Neural network predictions: each class probability",
220 "Neural network classification results (first 20 observations):", 20)
224 init = initializeNetwork()
225 predictionModel = trainModel(*init)
226 predictionResult = testModel(predictionModel)
227 printResults(testGroundTruthFile, predictionResult)
230 if __name__ ==
"__main__":