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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
hummel
Inlägg: 2267
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

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

Inlägg av hummel »

Kompilerar den här koden?
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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.
Shimonu
Inlägg: 295
Blev medlem: 21 oktober 2015, 22:44:33

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

Inlägg av Shimonu »

Kod: Markera allt

histograms + 256*i
Här räknar du ut en adress som du sen avreferar med *-operatorn.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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.
davidi
Inlägg: 577
Blev medlem: 13 oktober 2011, 16:45:38
Ort: Ekerö

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

Inlägg 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.
hummel
Inlägg: 2267
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

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

Inlägg 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.
Shimonu
Inlägg: 295
Blev medlem: 21 oktober 2015, 22:44:33

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

Inlägg 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?
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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;
}
Senast redigerad av DanielM 8 mars 2020, 23:49:26, redigerad totalt 4 gånger.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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.
bearing
Inlägg: 11250
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

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

Inlägg 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
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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.
bearing
Inlägg: 11250
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

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

Inlägg 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?
Användarvisningsbild
rvl
Inlägg: 5782
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

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

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45272
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg 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?
Användarvisningsbild
hawkan
Inlägg: 2621
Blev medlem: 14 augusti 2011, 10:27:40

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

Inlägg 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.
Skriv svar