⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 neuquant.java

📁 用JAVA 编写的 NeuQuant Neural-Net量子化运算公式
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    	double bestd = Float.MAX_VALUE;    	double bestbiasd = bestd;    	int bestpos = -1;    	int bestbiaspos = bestpos;            	for (int i=specials; i<netsize; i++) {    		double [] n = network[i];    		double dist = n[0] - b;   if (dist<0) dist = -dist;    		double a = n[1] - g;   if (a<0) a = -a;    		dist += a;    		a = n[2] - r;   if (a<0) a = -a;    		dist += a;    		if (dist<bestd) {bestd=dist; bestpos=i;}    		double biasdist = dist - bias [i];    		if (biasdist<bestbiasd) {bestbiasd=biasdist; bestbiaspos=i;}    		freq [i] -= beta * freq [i];    		bias [i] += betagamma * freq [i];    	}    	freq[bestpos] += beta;    	bias[bestpos] -= betagamma;    	return bestbiaspos;    }        private int specialFind (double b, double g, double r) {    	for (int i=0; i<specials; i++) {    		double [] n = network[i];    		if (n[0] == b && n[1] == g && n[2] == r) return i;    	}    	return -1;    }        private void learn() {        int biasRadius = initBiasRadius;    	int alphadec = 30 + ((samplefac-1)/3);    	int lengthcount = pixels.length;    	int samplepixels = lengthcount / samplefac;    	int delta = samplepixels / ncycles;    	int alpha = initalpha;	    int i = 0;    	int rad = biasRadius >> radiusbiasshift;    	if (rad <= 1) rad = 0;	    	System.err.println("beginning 1D learning: samplepixels=" + samplepixels + "  rad=" + rad);        int step = 0;        int pos = 0;            	if ((lengthcount%prime1) != 0) step = prime1;    	else {    		if ((lengthcount%prime2) !=0) step = prime2;    		else {    			if ((lengthcount%prime3) !=0) step = prime3;    			else step = prime4;    		}    	}	    	i = 0;    	while (i < samplepixels) {    	    int p = pixels [pos];	        int red   = (p >> 16) & 0xff;	        int green = (p >>  8) & 0xff;	        int blue  = (p      ) & 0xff;    		double b = blue;    		double g = green;    		double r = red;    		if (i == 0) {   // remember background colour    			network [bgColour] [0] = b;    			network [bgColour] [1] = g;    			network [bgColour] [2] = r;    		}    		int j = specialFind (b, g, r);    		j = j < 0 ? contest (b, g, r) : j;			if (j >= specials) {   // don't learn for specials            	double a = (1.0 * alpha) / initalpha;    			altersingle (a, j, b, g, r);    			if (rad > 0) alterneigh (a, rad, j, b, g, r);   // alter neighbours    		}    		pos += step;    		while (pos >= lengthcount) pos -= lengthcount;	            		i++;    		if (i%delta == 0) {	    			alpha -= alpha / alphadec;    			biasRadius -= biasRadius / radiusdec;    			rad = biasRadius >> radiusbiasshift;    			if (rad <= 1) rad = 0;    		}    	}    	System.err.println("finished 1D learning: final alpha=" + (1.0 * alpha)/initalpha + "!");    }    private void fix() {        for (int i=0; i<netsize; i++) {            for (int j=0; j<3; j++) {                int x = (int) (0.5 + network[i][j]);                if (x < 0) x = 0;                if (x > 255) x = 255;                colormap[i][j] = x;            }            colormap[i][3] = i;        }    }    private void inxbuild() {        // Insertion sort of network and building of netindex[0..255]    	int previouscol = 0;    	int startpos = 0;    	for (int i=0; i<netsize; i++) {    		int[] p = colormap[i];    		int[] q = null;    		int smallpos = i;    		int smallval = p[1];			// index on g    		// find smallest in i..netsize-1    		for (int j=i+1; j<netsize; j++) {    			q = colormap[j];    			if (q[1] < smallval) {		// index on g    				smallpos = j;    				smallval = q[1];	// index on g    			}    		}    		q = colormap[smallpos];    		// swap p (i) and q (smallpos) entries    		if (i != smallpos) {    			int j = q[0];   q[0] = p[0];   p[0] = j;    			j = q[1];   q[1] = p[1];   p[1] = j;    			j = q[2];   q[2] = p[2];   p[2] = j;    			j = q[3];   q[3] = p[3];   p[3] = j;    		}    		// smallval entry is now in position i    		if (smallval != previouscol) {    			netindex[previouscol] = (startpos+i)>>1;    			for (int j=previouscol+1; j<smallval; j++) netindex[j] = i;    			previouscol = smallval;    			startpos = i;    		}    	}    	netindex[previouscol] = (startpos+maxnetpos)>>1;    	for (int j=previouscol+1; j<256; j++) netindex[j] = maxnetpos; // really 256    }    public int convert (int pixel) {        int alfa = (pixel >> 24) & 0xff;	    int r   = (pixel >> 16) & 0xff;	    int g = (pixel >>  8) & 0xff;	    int b  = (pixel      ) & 0xff;	    int i = inxsearch(b, g, r);	    int bb = colormap[i][0];	    int gg = colormap[i][1];	    int rr = colormap[i][2];	    return (alfa << 24) | (rr << 16) | (gg << 8) | (bb);    }    public int lookup (int pixel) {	    int r   = (pixel >> 16) & 0xff;	    int g = (pixel >>  8) & 0xff;	    int b  = (pixel      ) & 0xff;	    int i = inxsearch(b, g, r);	    return i;    }    public int lookup (Color c) {	    int r   = c.getRed ();	    int g = c.getGreen ();	    int b  = c.getBlue ();	    int i = inxsearch(b, g, r);	    return i;    }    public int lookup (boolean rgb, int x, int g, int y) {	    int i = rgb ? inxsearch (y, g, x) : inxsearch (x, g, y);	    return i;    }    private int not_used_slow_inxsearch(int b, int g, int r) {        // Search for BGR values 0..255 and return colour index    	int bestd = 1000;		// biggest possible dist is 256*3    	int best = -1;    	for (int i = 0; i<netsize; i++) { 			int [] p = colormap[i];			int dist = p[1] - g;			if (dist<0) dist = -dist;			int a = p[0] - b;   if (a<0) a = -a;			dist += a;			a = p[2] - r;   if (a<0) a = -a;			dist += a;			if (dist<bestd) {bestd=dist; best=i;}		}		return best;    }        protected int inxsearch(int b, int g, int r) {        // Search for BGR values 0..255 and return colour index    	int bestd = 1000;		// biggest possible dist is 256*3    	int best = -1;    	int i = netindex[g];	// index on g    	int j = i-1;		// start at netindex[g] and work outwards    	while ((i<netsize) || (j>=0)) {    		if (i<netsize) {    			int [] p = colormap[i];    			int dist = p[1] - g;		// inx key    			if (dist >= bestd) i = netsize;	// stop iter    			else {    				if (dist<0) dist = -dist;    				int a = p[0] - b;   if (a<0) a = -a;    				dist += a;    				if (dist<bestd) {    					a = p[2] - r;   if (a<0) a = -a;    					dist += a;    					if (dist<bestd) {bestd=dist; best=i;}    				}    				i++;    			}    		}    		if (j>=0) {    			int [] p = colormap[j];    			int dist = g - p[1]; // inx key - reverse dif    			if (dist >= bestd) j = -1; // stop iter    			else {    				if (dist<0) dist = -dist;    				int a = p[0] - b;   if (a<0) a = -a;    				dist += a;    				if (dist<bestd) {    					a = p[2] - r;   if (a<0) a = -a;    					dist += a;    					if (dist<bestd) {bestd=dist; best=j;}    				}    				j--;    			}    		}    	}    	return best;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -