예제 #1
0
def task_cv_single(t, modeLearn: ModeLearn, f:ActivFunct, theta:dict, errorFunct:ActivFunct, miniBatchDim = None):
    (trSet, vlSet) = t
    nn = NeuralNetwork(trSet, f, theta)
    nn.learn(modeLearn, errorFunct, miniBatchDim)

    vecErr = np.array([nn.getError(vlSet, i, 1/len(vlSet), errorFunct) for i in range(nn.hyp['OutputUnits'])])
    return norm(vecErr,2)
예제 #2
0
def k_fold_CV_single(k: int,
                     dataSet,
                     f: ActivFunct,
                     theta,
                     errorFunct=None,
                     modeLearn: ModeLearn = ModeLearn.BATCH,
                     miniBatchDim=None,
                     errorVlFunct=None,
                     hiddenF: ActivFunct = None):
    if k <= 0:
        raise ValueError("Wrong value of num. folders inserted")

    cp = dataSet.copy()

    #Rimescolo il data set.
    rnd.shuffle(cp)

    #Costruisco la sottolista dei dati divisibile esattamente per k.
    h = len(cp) - len(cp) % k
    dataSetExact = cp[0:h]

    #Creo la lista dei folders.
    folderDim = int(len(dataSetExact) / k)
    folders = [cp[i * folderDim:(i + 1) * folderDim] for i in range(k)]

    #Inserisco gli elementi di avanzo.
    for i in range(len(cp) - h):
        folders[i].append(cp[i + h])

    errore = list()

    #per stampare l'errore sul traininig set e sul validation set
    trErrorPlot = list()
    vlErrorPlot = list()

    for i in range(len(folders)):
        lcopy = folders.copy()
        del (lcopy[i])

        vlSet = folders[i]
        trSet = list()
        for j in range(len(lcopy)):
            trSet += lcopy[j]
        nn = NeuralNetwork(trSet, f, theta, Hiddenf=hiddenF)
        (trErr, vlErr, trAcc, vlAcc) = nn.learn(modeLearn,
                                                errorFunct,
                                                miniBatchDim,
                                                vlSet,
                                                errorVlFunct=errorVlFunct)
        trErrorPlot.append(trErr)
        vlErrorPlot.append(vlErr)

        errore.append(nn.getError(vlSet, 1 / len(vlSet), errorVlFunct))

    err = sum(errore) / k

    #controllo che tutti gli errorPlot abbiano la stessa lunghezza
    maxLen = len(trErrorPlot[0])
    for i in range(1, len(trErrorPlot)):
        if len(trErrorPlot[i]) > maxLen:
            maxLen = len(trErrorPlot[i])

    for i in range(len(trErrorPlot)):
        if len(trErrorPlot[i]) < maxLen:
            for j in range(maxLen - len(trErrorPlot[i])):
                trErrorPlot[i].append(trErrorPlot[i][-1])
                vlErrorPlot[i].append(vlErrorPlot[i][-1])

    trErrorArray = np.array(trErrorPlot[0])
    vlErrorArray = np.array(vlErrorPlot[0])

    for i in range(1, len(trErrorPlot)):
        trErrorArray = trErrorArray + np.array(trErrorPlot[i])
    trErrorArray = trErrorArray / k

    for i in range(1, len(vlErrorPlot)):
        vlErrorArray = vlErrorArray + np.array(vlErrorPlot[i])
    vlErrorArray = vlErrorArray / k

    return (err, trErrorArray, vlErrorArray)