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)
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)