def DebugTrainNet(self, TaskSpec, OptionList):
        LogHistory = TaskSpec["LogHistory"]
        OperatorList = TaskSpec["OperatorList"]
        NetworkDecor = TaskSpec["NetworkDecor"]
        VertexNum = TaskSpec["OperatorNum"]
        InputNum = TaskSpec["InputNum"]
        OutputNum = TaskSpec["OutputNum"]
        BatchSize = TaskSpec["BatchSize"]
        Epochs = TaskSpec["Epochs"]
        ConcatOperator = TaskSpec["ConcatOperator"]
        InputOperator = TaskSpec["InputOperator"]
        TrajectoryLength = TaskSpec["TrajectoryLength"]
        RewardGamma = TaskSpec["RewardGamma"]

        TaskInput = TaskSpec["TaskInput"]
        TaskLabel = TaskSpec["TaskLabel"]

        SetBatchSize(BatchSize)

        self.TaskGraph = tf.Graph()
        self.TaskSess = tf.Session(graph=self.TaskGraph,
                                   config=self.SessConfig)

        Gph = Graph(VertexNum=VertexNum,
                    OperatorList=OperatorList,
                    InputNum=InputNum,
                    OutputNum=OutputNum,
                    ConcatOperator=ConcatOperator,
                    InputOperator=InputOperator)
        with self.TaskGraph.as_default():
            self.InitializeTaskGraph(Data=TaskInput, Label=TaskLabel)
            for Option in OptionList:
                Gph.ApplyOption(Option)
            self.BuildTaskGraph(Graph=Gph, OutputDecor=NetworkDecor, ID=0)
            for i in Gph.InternalTensor:
                if i is None:
                    continue
                print(i, type(i).Name, i.GetTensor().shape)
            #return
            Loss, Acc = self.TrainTaskNet(Step=Epochs)
        print(Loss, Acc)
    def StartTrial(self, TaskSpec):
        LogHistory = TaskSpec["LogHistory"]
        OperatorList = TaskSpec["OperatorList"]
        NetworkDecor = TaskSpec["NetworkDecor"]
        VertexNum = TaskSpec["OperatorNum"]
        InputNum = TaskSpec["InputNum"]
        OutputNum = TaskSpec["OutputNum"]
        BatchSize = TaskSpec["BatchSize"]
        Epochs = TaskSpec["Epochs"]
        ConcatOperator = TaskSpec["ConcatOperator"]
        InputOperator = TaskSpec["InputOperator"]
        TrajectoryLength = TaskSpec["TrajectoryLength"]
        RewardGamma = TaskSpec["RewardGamma"]

        TaskInput = TaskSpec["TaskInput"]
        TaskLabel = TaskSpec["TaskLabel"]
        self.HisNet = []
        self.HisNetPerf = []

        self.Log("Operator List " + str(OperatorList))

        #ImageOperators
        SetBatchSize(BatchSize)
        self.BatchSize = BatchSize

        with self.QGraph.as_default():
            self.ConstructQFunc3D(ImageSize=VertexNum,
                                  BitDepth=len(OperatorList),
                                  BatchSize=BatchSize)
            #print([i.op_def.name for i in self.QGraph.get_operations()])
            QNetVar = tf.global_variables(
            )  #[op for op in tf.GraphKeys.GLOBAL_VARIABLES if isinstance(op,tf.Variable) and  not tf.is_variable_initialized(op)]
            #print([i.name for i in QNetVar])
            self.QNetsess.run(tf.initialize_variables(
                QNetVar))  #tf.global_variables_initializer())

        Initial_Explore_Rate = 0.5
        Explore_Rate_Decay = 0.001
        QNet_Format = "3D_NoNull"
        for i in range(Epochs):
            if Epochs % 100 == 0:
                self.TaskGraph = tf.Graph()
                self.TaskSess = tf.Session(graph=self.TaskGraph,
                                           config=self.SessConfig)
                with self.TaskGraph.as_default():
                    self.InitializeTaskGraph(Data=TaskInput, Label=TaskLabel)

            Gph = Graph(VertexNum=VertexNum,
                        OperatorList=OperatorList,
                        InputNum=InputNum,
                        OutputNum=OutputNum,
                        ConcatOperator=ConcatOperator,
                        InputOperator=InputOperator)
            Gph.InitializeCheckOptionInput([self.TaskNextData])
            if Initial_Explore_Rate > 0:
                Initial_Explore_Rate -= Explore_Rate_Decay
            TrajectoryStep = 0
            HisNetTemp = []
            HisPerfTemp = []
            self.InitializedVar = []
            for j in range(TrajectoryLength):
                OptionList = Gph.ConnectOptions()
                ValidOptionList = []

                for Option in OptionList:
                    if Gph.CheckOption(Option):
                        ValidOptionList.append(Option)

                RandDie = random.random()

                if RandDie > Initial_Explore_Rate:
                    ChooseType = "QLearning"
                else:
                    ChooseType = "Random"

                if ChooseType == 'QLearning':
                    QNetInputList = []
                    for Option in ValidOptionList:
                        Gph.ApplyOption(Option)
                        QNetInput = Gph.UnifiedTransform(QNet_Format)
                        QNetInputList.append(QNetInput)
                        Gph.RevokeOption(Option)

                    QNetInput = np.array(QNetInputList)

                    QValuesClip = self.PredictQNet(QNetInput)

                    PossQValues = np.exp(QValuesClip)
                    _Sum = np.sum(PossQValues)
                    ExpDist = PossQValues / _Sum
                    ChosenOption = self.MakeChoice(Distribution=ExpDist,
                                                   ChoiceList=ValidOptionList)
                elif ChooseType == 'Random':
                    ChosenOption = ValidOptionList[random.randint(
                        0,
                        len(ValidOptionList) - 1)]

                self.Log("ChosenOption " + str(ChosenOption))
                Gph.ApplyOption(ChosenOption)

                Step = 100
                #print(i,j)

                with self.TaskGraph.as_default():
                    self.BuildTaskGraph(Graph=Gph,
                                        OutputDecor=NetworkDecor,
                                        ID=i)
                Loss, Acc = self.TrainTaskNet(Step=Epochs)

                HisItem = {
                    "Traj": j,
                    "OptionList": Gph.ConnectOptions(),
                    "TrainStep": Step,
                    "Loss": Loss,
                    "Acc": Acc,
                    "UnifiedNet": Gph.UnifiedTransform(QNet_Format)
                }
                if LogHistory == True:
                    pass
                    #self.Log(HisItem)
                HisNetTemp.append(HisItem["UnifiedNet"])
                HisPerfTemp.append(HisItem["Acc"])
                TrajectoryStep += 1
            self.HisNet.extend(HisNetTemp)
            for i in range(TrajectoryStep - 1):
                print("HisNet", HisPerfTemp[i])
                HisPerfTemp[TrajectoryStep - i -
                            2][0] += RewardGamma * HisPerfTemp[TrajectoryStep -
                                                               i - 1][0]
            self.HisNetPerf.extend(HisPerfTemp)
            QStep = Epochs
            self.TrainQNet(self.QNetOutput, self.HisNet, self.HisNetPerf,
                           QStep)
Beispiel #3
0
    "ConcatOperator": ConcatOperatorDense,
    "InputOperator": ImageInput,
    "TrajectoryLength": OperatorLimit - 4,
    "RewardGamma": 0.9
}

if Mode == "Train":

    logging.getLogger().setLevel(logging.DEBUG)
    now = datetime.datetime.now()
    logging.basicConfig(
        level=logging.INFO,
        format=
        '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
        datefmt='%a, %d %b %Y %H:%M:%S',
        filename='%s_%s.log' % ("MNISTTask", now.strftime("%Y-%m-%d %H-%M")),
        filemode='w')

    RL_Exp.StartTrial(TaskSpec)
elif Mode == "TestBuildGraph":
    OptionList = [[1, 1, 1, 0], [11, 1, 1, 1], [13, 1, 1, 2], [2, 1, 1, 3],
                  [12, 1, 1, 4], [13, 1, 1, 5], [6, 1, 1, 6]]
    RL_Exp.DebugTrainNet(TaskSpec, OptionList)
elif Mode == "TestUnifiedTrans":
    g = Graph(10, Op_List, 1, 1, ConcatOperatorDense, InputOperator=ImageInput)
    OptionList = [[1, 1, 1, 0], [11, 1, 1, 1], [13, 1, 1, 2], [2, 1, 1, 3],
                  [12, 1, 1, 4], [13, 1, 1, 5], [6, 1, 1, 6]]
    np.set_printoptions(threshold=np.inf)
    for Option in OptionList:
        g.ApplyOption(Option)
        print(np.array(g.UnifiedTransform("3D_NoNull").astype(np.int8)))