Sida 6 av 8

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 8 mars 2020, 22:42:29
av hummel
Kompilerar den här koden?

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 8 mars 2020, 22:49:45
av DanielM
Shimonu skrev:Okej, låt oss säga att det var sant. Varför räknar du ut adressen för varje element istället för att göra vanlig indexering? Är det också snabbare?
Adressen?
hummel skrev:Kompilerar den här koden?
Bara att testa.

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 8 mars 2020, 23:01:58
av Shimonu

Kod: Markera allt

histograms + 256*i
Här räknar du ut en adress som du sen avreferar med *-operatorn.

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 8 mars 2020, 23:09:55
av DanielM
Jag har för mig att skriva array är exakt samma som *(array + i).
Jag ser många gör så här.

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 8 mars 2020, 23:12:25
av davidi
DanielM skrev:Det är bara 1 rad :)
Jag gör så istället för att ha en for-loop. Har man en for-loop så tar det tid. Men gör man exakt allt på en enda rad så går det snabbt.
Har du verifierat att det verkligen är så? Det är fullt möjligt att kompilatorn genererar ett liknande resultat, t o m effektivare, även av en for-loop. Försök optimera när du märker att det verkligen behövs, när programmet går märkbart långsamt. Och bli inte förvånad om det är en helt annan del av programmet som tar tid än vad du trodde.

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 8 mars 2020, 23:13:02
av hummel
DanielM skrev:
Shimonu skrev:
hummel skrev:Kompilerar den här koden?
Bara att testa.
Förra gången funkade det inte på första eller andra eller om det var först på tredje försöket att kompilera koden.
Därför jag frågar om du verifierat att din uppladdade kod i alla fall fungerar att kompilera.

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 8 mars 2020, 23:15:10
av Shimonu
DanielM skrev:Jag har för mig att skriva array är exakt samma som *(array + i).
Jag ser många gör så här.


Ena sättet är väl klart enklare och mer läsbart än det andra?

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 8 mars 2020, 23:16:43
av DanielM
Japp! Algoritmen fungerar! :bravo:

Valgrind säger dessutom: :tumupp:

Kod: Markera allt

// This is just a function to print out the trained histogram
void print_uint8_t(uint8_t* A, int row, int column) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < column; j++) {
			printf("%d ", *(A++));
		}
		printf("\n");
	}
	printf("\n");
}

// Images
uint8_t A[15*15] = {14,4,12,5,12,6,6,7,10,3,5,3,10,15,3,4,3,10,10,9,2,15,6,15,5,15,3,9,13,10,4,3,11,7,4,5,3,12,8,2,14,14,7,13,14,6,14,14,13,11,13,3,7,2,2,15,4,11,5,7,11,12,7,15,15,13,13,7,11,9,12,10,8,12,9,6,9,14,3,2,2,3,12,10,15,7,13,1,1,2,6,4,3,10,9,3,9,6,10,5,6,11,4,11,11,8,12,9,7,13,5,10,5,14,1,2,14,4,8,9,13,3,1,3,12,5,2,12,6,6,13,2,6,6,14,15,7,1,8,12,15,3,5,1,2,4,9,11,2,12,7,11,15,5,9,1,1,3,4,12,2,10,5,15,10,3,6,6,12,6,9,13,1,11,12,5,3,9,15,15,3,15,3,4,10,5,5,10,11,2,12,6,2,3,15,3,15,11,3,14,2,3,14,11,13,1,12,10,2,13,4,13,6,7,4,14,11,4,10,2,3,9,11,14,8};
uint8_t B[15*15] = {14,3,2,4,4,13,3,8,2,15,13,7,5,2,12,6,3,12,2,8,9,9,7,3,2,14,5,7,2,7,4,7,8,14,12,8,2,5,6,14,5,14,12,3,7,12,5,11,6,13,3,5,3,7,2,14,10,7,6,12,6,1,3,5,6,14,7,2,3,7,5,9,3,4,13,7,13,2,15,4,12,14,14,3,7,11,12,14,6,14,10,9,4,2,12,11,6,11,6,7,6,8,10,8,1,7,13,13,7,3,5,8,5,14,6,2,4,3,10,12,10,14,2,4,15,2,7,5,6,4,15,3,8,8,15,5,13,13,15,14,15,9,11,11,11,9,10,7,3,3,2,4,5,15,9,4,15,1,8,14,5,13,4,5,13,11,9,13,8,5,2,13,5,15,13,2,5,12,9,11,11,15,6,1,5,12,11,8,13,3,11,7,12,2,6,3,1,1,9,5,7,2,1,13,7,6,15,13,12,8,6,3,15,11,7,6,12,6,9,13,9,12,13,5,3};
uint8_t C[15*15] = {2,6,13,8,5,2,6,1,2,12,11,10,15,3,15,2,3,9,4,14,4,15,7,15,2,2,2,15,7,8,6,15,8,7,1,4,14,3,14,15,4,4,9,14,6,15,15,1,8,7,11,14,14,6,10,5,12,1,12,4,13,13,15,12,14,2,7,15,9,1,2,7,4,5,10,7,14,9,15,15,7,1,12,10,9,4,7,2,3,13,14,12,8,13,3,3,10,1,10,2,7,15,2,11,13,13,3,6,7,6,13,11,10,11,14,1,1,13,15,15,15,13,4,4,9,10,9,15,9,8,12,5,3,12,8,2,3,4,11,11,8,8,1,5,9,9,14,4,9,3,15,12,14,5,3,7,9,11,7,14,8,14,11,11,7,4,14,14,10,10,5,14,4,13,4,3,9,6,7,8,11,1,5,10,12,7,10,11,5,7,5,2,1,10,6,6,3,7,9,6,8,4,10,2,9,1,12,6,2,8,9,8,3,2,3,12,1,12,2,2,10,11,10,12,9};
uint8_t D[15*15] = {5,7,5,2,11,9,15,15,7,2,14,9,13,3,8,6,3,3,12,3,11,12,9,2,4,10,5,5,14,15,1,11,3,5,10,4,2,9,13,9,11,10,15,9,5,2,7,10,5,9,7,4,14,11,1,7,15,10,12,3,8,12,14,14,12,14,10,11,13,7,11,6,4,9,8,4,3,11,6,4,8,7,2,14,3,2,14,15,5,4,15,1,15,15,4,5,5,7,14,12,11,13,14,13,14,12,2,12,13,3,13,3,2,12,4,11,8,12,12,10,14,11,12,12,5,6,15,6,6,11,14,7,2,13,11,10,15,5,15,12,5,6,9,1,2,5,13,2,6,9,11,4,2,15,12,1,1,11,15,8,9,12,1,8,9,2,15,4,12,8,1,7,7,12,11,10,11,12,13,15,15,14,11,6,10,1,13,2,4,11,2,3,8,14,7,2,10,13,6,12,5,9,9,5,15,10,6,2,11,3,10,15,11,8,13,9,10,9,8,9,6,4,9,12,5};
uint8_t E[15*15] = {15,1,13,6,9,8,15,13,15,7,13,10,5,4,10,9,10,4,4,5,6,8,5,13,6,12,13,12,2,1,11,13,11,10,15,15,8,11,10,2,6,9,1,6,1,15,6,6,11,8,15,14,4,9,4,10,10,13,13,5,6,13,12,4,9,14,4,3,14,11,2,9,2,3,3,14,13,2,6,5,12,4,1,2,5,8,1,14,6,7,5,6,3,14,7,13,4,13,6,11,10,1,4,6,9,12,6,6,6,15,7,6,14,13,8,15,11,15,14,13,6,4,7,5,3,8,14,7,13,8,2,1,10,13,7,8,2,7,15,9,10,7,11,15,7,5,15,13,14,3,5,9,11,6,3,12,15,4,13,7,13,11,9,1,9,2,12,4,10,11,6,3,14,4,13,1,3,13,14,6,9,15,1,6,8,10,14,2,13,2,15,10,1,4,4,3,5,8,5,1,15,14,2,15,7,4,13,10,1,7,10,3,12,14,14,14,3,3,8,1,2,15,4,15,3};
uint8_t F[15*15] = {7,15,9,6,10,4,11,8,4,14,9,10,8,14,13,10,3,7,1,4,3,12,2,15,11,14,2,14,8,4,1,7,15,14,12,5,6,14,11,14,2,5,2,4,14,15,9,4,5,5,14,12,6,1,12,7,6,14,3,11,13,1,3,1,10,13,9,1,5,5,11,2,3,12,8,14,15,1,1,1,9,14,9,14,9,10,9,1,2,12,11,4,6,13,10,3,13,7,12,8,14,5,2,13,11,6,3,10,12,6,13,4,4,2,14,13,9,14,9,9,8,15,2,12,14,6,1,7,14,12,4,12,2,8,11,11,10,13,15,9,9,8,11,4,15,14,10,13,11,9,1,12,15,2,9,1,6,2,15,4,1,14,1,14,8,10,5,6,15,6,13,13,4,4,4,12,1,7,3,12,5,12,9,15,7,15,6,3,9,10,7,10,2,11,1,6,15,4,5,3,2,7,14,4,12,11,11,8,12,1,15,10,7,10,2,4,14,4,1,10,1,2,14,9,8};
uint8_t G[15*15] = {15,5,15,11,5,15,8,2,8,13,5,13,1,7,6,15,1,4,1,10,7,2,1,4,6,4,1,11,6,8,2,5,6,2,1,6,13,6,5,12,15,15,8,6,10,2,8,1,14,3,11,12,3,7,9,3,1,7,11,4,13,10,13,10,10,3,8,1,2,3,5,14,15,14,4,1,2,11,14,9,13,14,15,1,5,11,10,15,6,15,2,13,1,14,6,6,5,7,6,15,13,6,3,14,13,11,12,1,4,9,2,8,14,4,4,2,4,12,4,13,14,10,7,10,5,5,2,11,12,6,14,15,7,8,8,7,14,7,15,1,14,5,3,11,1,10,5,5,15,2,8,13,7,10,5,5,10,14,13,6,10,2,10,8,1,13,3,10,8,15,2,8,3,12,12,11,8,5,3,11,4,11,2,4,10,5,7,6,15,1,10,5,1,12,10,5,12,13,2,2,2,9,14,12,15,7,11,12,7,3,3,3,12,15,2,1,13,13,15,14,8,4,8,6,1};
uint8_t H[15*15] = {6,9,14,11,7,13,11,8,10,7,4,8,9,12,3,11,3,9,15,1,11,2,4,8,7,2,1,1,5,5,12,6,6,14,6,4,7,10,15,14,5,13,4,9,3,6,7,1,10,6,15,8,10,5,9,7,8,1,10,11,6,2,2,1,3,8,14,7,2,14,8,6,3,5,12,11,6,15,13,3,8,11,2,15,15,10,5,13,5,11,15,10,4,5,6,1,6,12,9,15,15,7,4,2,4,13,2,9,5,8,3,6,11,1,7,7,2,9,1,11,15,3,3,15,14,8,3,7,5,2,13,5,6,9,8,8,13,15,5,1,12,2,15,5,7,13,1,3,8,14,11,6,10,14,6,1,15,2,14,8,15,7,11,15,11,5,12,9,1,14,14,8,3,1,6,10,2,8,6,3,9,11,9,7,1,1,6,7,3,14,4,12,13,3,10,5,15,13,1,5,13,10,1,9,14,15,1,1,12,3,5,3,10,5,10,11,15,4,6,10,8,3,3,4,11};
uint8_t I[15*15] = {2,8,10,10,14,11,14,13,14,2,15,5,3,5,11,14,8,7,3,6,7,11,9,5,5,12,5,9,9,6,13,3,6,8,6,6,6,1,11,12,10,6,6,2,5,15,3,14,9,2,4,10,3,8,15,2,11,7,8,11,9,10,10,15,1,2,5,12,14,11,2,4,2,7,11,9,15,1,5,14,8,2,6,5,14,8,10,5,4,14,9,7,3,11,4,8,5,4,15,5,9,9,1,2,7,8,2,3,8,5,2,2,13,4,15,11,4,14,1,1,8,3,2,6,15,11,13,1,3,6,3,3,2,7,13,8,3,14,2,15,3,14,13,4,2,11,13,6,15,9,13,6,9,9,13,11,9,14,1,6,10,15,1,3,8,2,7,5,6,2,4,4,3,7,5,13,10,4,2,6,11,3,4,2,10,1,8,13,5,5,12,4,4,13,13,8,13,9,3,11,8,1,10,5,10,13,13,1,2,2,12,14,15,8,1,14,4,3,15,6,15,2,15,9,3};
uint8_t J[15*15] = {1,5,10,14,12,9,6,11,4,13,3,5,6,13,10,9,8,2,4,6,13,6,12,5,4,12,14,8,3,11,1,7,3,3,6,1,9,7,12,4,1,6,8,7,12,11,2,15,9,14,7,4,8,14,8,11,9,3,11,9,15,3,3,15,4,5,7,10,13,6,12,5,3,10,10,5,7,1,8,15,8,2,8,3,8,3,12,2,4,12,5,11,13,8,4,1,6,3,11,15,5,12,9,12,3,13,9,8,7,2,3,14,1,1,3,13,2,14,8,12,10,7,9,13,2,8,1,5,9,14,1,1,9,12,15,9,13,1,13,10,10,2,14,10,9,6,10,8,2,13,1,7,4,10,8,14,14,8,5,10,2,7,11,3,6,14,6,13,6,11,12,11,7,15,14,2,11,5,2,3,13,2,11,11,5,14,12,8,4,2,4,5,2,13,1,8,12,10,6,2,12,11,3,11,5,1,7,12,1,3,1,6,6,2,15,10,7,11,5,14,6,13,8,10,10};

// Histogram holder
uint8_t histograms[10*256]; // 10 because we have 10 pictures to train

int main() {
	clock_t start, end;
	float cpu_time_used;
	start = clock();

	// Train first the pictures
	uint16_t status = lbph(A, 15, 15, histograms, 1, true); // Save at first row
	status = lbph(B, 15, 15, histograms, 2, true);
	status = lbph(C, 15, 15, histograms, 3, true);
	status = lbph(D, 15, 15, histograms, 4, true);
	status = lbph(E, 15, 15, histograms, 5, true);
	status = lbph(F, 15, 15, histograms, 6, true);
	status = lbph(G, 15, 15, histograms, 7, true);
	status = lbph(H, 15, 15, histograms, 8, true);
	status = lbph(I, 15, 15, histograms, 9, true);
	status = lbph(J, 15, 15, histograms, 10, true); // Save at last row

	// Print the histograms
	print_uint8_t(histograms, 10, 256);

	// Now do an image classification
	uint16_t index = lbph(J, 15, 15, histograms, 10, false) - 2;
	printf("The image is index: %d, and status is: %d\n", index, status);

	end = clock();
	cpu_time_used = ((float) (end - start)) / CLOCKS_PER_SEC;
	printf("\nTotal speed  was %f\n", cpu_time_used);
	return EXIT_SUCCESS;
}

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 8 mars 2020, 23:18:08
av DanielM
Shimonu skrev:
DanielM skrev:Jag har för mig att skriva array är exakt samma som *(array + i).
Jag ser många gör så här.


Ena sättet är väl klart enklare och mer läsbart än det andra?


Jag håller med, när jag var ny i C. Då ville jag helst till och med köra 2D arrayer. Men sedan dess har det blivit en vanesak att skriva arrayer på det mera ortodoxa sättet. En array är ju bara en adress med andra ord.

Jag brukar dock använda [ ] för vanliga interna arrayer. Mest bara för att separera argument-arrayer från internt deklarerade arrayer.

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 9 mars 2020, 00:01:19
av bearing
// Notice that this is only one line of code. Super fast way to do this
Ha Ha Ha

Precis som Shimonu måste jag påpeka att det där sannolikt är fel.

http://www.ioccc.org/1998/banks.c

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 9 mars 2020, 00:07:21
av DanielM
Så det är bättre med en for-loop?
Jag har själv använt for-loopar till sådant och det drog bara upp tiden.

Edit:

Nu kom jag på även ett bättre sätt.
Jag behöver inte ta abs på alla element. Jag kan summera först och sedan ta abs. Då sparar jag ännu mera tid.

Uppdaterar imorgon.

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 9 mars 2020, 00:31:43
av bearing
Det beror på hur man skriver koden i for-loopen.

Jag skrev ett exempel till dig för länge sedan där jag gjorde om din loop från att innehålla typ:

Kod: Markera allt

integral += *(pekare + faktor*i);
Till:

Kod: Markera allt

integral += *pekare;
pekare += faktor;
Det senare brukar gå fortare.

Sen undrar jag varför du ens behöver använda abs() om resultatet blir samma om du summerar utan abs() på varje faktor?
Om det ger samma resultat indikerar det att alla faktorer är positiva (eller alla negativa), och i så fall behövs inte abs() alls, eller?

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 9 mars 2020, 00:32:54
av rvl
Jag behöver inte ta abs på alla element. Jag kan summera först och sedan ta abs. Då sparar jag ännu mera tid.
Tänk en gång till.

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 9 mars 2020, 00:53:10
av TomasL
DanielM skrev:Det är bara 1 rad :)
Jag gör så istället för att ha en for-loop. Har man en for-loop så tar det tid. Men gör man exakt allt på en enda rad så går det snabbt.
Har du tittat på den genererade assemblern?

Re: Maskinellt lärande i inbyggda system - Vem är på?

Postat: 9 mars 2020, 09:30:26
av hawkan
Hehe det ÄR 256 rader. Möjligen är det ett statement, nä vad det kallas på svenska slinter från minnet nu.
Men du kommer att få mer kommentarer om din kodningsstil än kring ditt egentliga problem när du gör som du gör.
Och att det är snabbare med 256 rader är inte säkert alls. Men du ser vart det drar iväg så jag stoppar här
och hoppas du kommer framåt med dit egentliga problemlösande.