新聞中心
java導(dǎo)入mnist后怎樣識別一個(gè)數(shù)字
其實(shí)就是python怎么讀取binnary file
創(chuàng)新互聯(lián)專注于宜章網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供宜章營銷型網(wǎng)站建設(shè),宜章網(wǎng)站制作、宜章網(wǎng)頁設(shè)計(jì)、宜章網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造宜章網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供宜章網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
mnist的結(jié)構(gòu)如下,選取train-images
TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
也就是之前我們要讀取4個(gè) 32 bit integer
試過很多方法,覺得最方便的,至少對我來說還是使用
struct.unpack_from()
filename = 'train-images.idx3-ubyte'
binfile = open(filename , 'rb')
buf = binfile.read()
先使用二進(jìn)制方式把文件都讀進(jìn)來
index = 0
magic, numImages , numRows , numColumns = struct.unpack_from('IIII' , buf , index)
index += struct.calcsize('IIII')
然后使用struc.unpack_from
'IIII'是說使用大端法讀取4個(gè)unsinged int32
然后讀取一個(gè)圖片測試是否讀取成功
im = struct.unpack_from('784B' ,buf, index)
index += struct.calcsize('784B')
im = np.array(im)
im = im.reshape(28,28)
fig = plt.figure()
plotwindow = fig.add_subplot(111)
plt.imshow(im , cmap='gray')
plt.show()
'784B'的意思就是用大端法讀取784個(gè)unsigned byte
完整代碼如下
import numpy as np
import struct
import matplotlib.pyplot as plt
filename = 'train-images.idx3-ubyte'
binfile = open(filename , 'rb')
buf = binfile.read()
index = 0
magic, numImages , numRows , numColumns = struct.unpack_from('IIII' , buf , index)
index += struct.calcsize('IIII')
im = struct.unpack_from('784B' ,buf, index)
index += struct.calcsize('784B')
im = np.array(im)
im = im.reshape(28,28)
fig = plt.figure()
plotwindow = fig.add_subplot(111)
plt.imshow(im , cmap='gray')
plt.show()
只是為了測試是否成功所以只讀了一張圖片
怎么用java實(shí)現(xiàn)圖片里面的數(shù)字識別
圖片是由點(diǎn)組成(或者是別的方法),記錄點(diǎn)的位置、顏色,控制點(diǎn)就行了。至于ocr,有難度,首先要制作文字的變化范圍及整個(gè)字各部分的聯(lián)系,這還是簡單的。然后,圖像分解就行了。額,我不會編程,稍微會點(diǎn)c++,所以這個(gè)回答就是假設(shè)如果我做這種程序的思路。
用java語言寫一個(gè)判斷一個(gè)整數(shù)是否為質(zhì)數(shù)的程序(要求利用三種方法逐步優(yōu)化實(shí)現(xiàn))
我寫了幾種方法,并逐步優(yōu)化,并且對每一種方法進(jìn)行了1000000次的調(diào)用測試每種方法的速度,僅供參考:
import?java.math.BigInteger;
public?class?Test_04?{
/**
*?最笨重的一種方法,用該整數(shù)分別除以比它小的數(shù),看是否能被整除
*/
public?boolean?isPrimeNum_1(int?num)?{
//?識別小于2的數(shù)
if?(num??2)?{
return?false;
}
for?(int?i?=?2;?i??num;?i++)?{
if?(num?%?i?==?0)?{
return?false;
}
}
return?true;
}
/**
*?優(yōu)化第一種方法br
*?1、偶數(shù)不可能是質(zhì)數(shù)br
*?2、對于大于2的數(shù),如果一個(gè)數(shù)a大于數(shù)b的一半,那么b不可能被a整除
*/
public?boolean?isPrimeNum_2(int?num)?{
//?2特殊處理
if?(num?==?2)?{
return?true;
}
//?識別小于2的數(shù)和偶數(shù)
if?(num??2?||?num?%?2?==?0)?{
return?false;
}
int?max?=?num?/?2;
for?(int?i?=?3;?i??max;?i?+=?2)?{
if?(num?%?i?==?0)?{
return?false;
}
}
return?true;
}
/**
*?在第二種方法上再次優(yōu)化,利用數(shù)字的性質(zhì):br
*?一個(gè)數(shù)不是素?cái)?shù)就是合數(shù),那么一定可以由兩個(gè)自然數(shù)相乘得到,其中一個(gè)大于或等于它的平方根,br
*?一個(gè)小于或等于它的平方根,并且成對出現(xiàn)。br
*?這樣就可以把計(jì)算量大幅度減少
*/
public?boolean?isPrimeNum_3(int?num)?{
if?(num?==?2)?{
return?true;//?2特殊處理
}
if?(num??2?||?num?%?2?==?0)?{
return?false;//?識別小于2的數(shù)和偶數(shù)
}
double?sqrt?=?Math.sqrt(num);
for?(int?i?=?3;?i?=?sqrt;?i?+=?2)?{
if?(num?%?i?==?0)?{
return?false;
}
}
return?true;
}
/**
*?Java中的BigInteger中已經(jīng)寫好了一個(gè)判斷是否為質(zhì)數(shù)的方法,直接用就可以了
*/
public?boolean?isPrimeNum_4(int?num)?{
BigInteger?integer?=?BigInteger.valueOf(num);
return?integer.isProbablePrime(1);
}
public?static?void?main(String[]?args)?{
Test_04?test_04?=?new?Test_04();
int?num?=?991;
System.out.println(test_04.isPrimeNum_1(num));
long?startTime?=?System.currentTimeMillis();
for?(int?i?=?0;?i??1000000;?i++)?{
test_04.isPrimeNum_1(num);
}
long?endTime?=?System.currentTimeMillis();
System.out.println("第一種方法運(yùn)行時(shí)間:"?+?(endTime?-?startTime)?+?"ms");
System.out.println(test_04.isPrimeNum_2(num));
startTime?=?System.currentTimeMillis();
for?(int?i?=?0;?i??1000000;?i++)?{
test_04.isPrimeNum_2(num);
}
endTime?=?System.currentTimeMillis();
System.out.println("第二種方法運(yùn)行時(shí)間:"?+?(endTime?-?startTime)?+?"ms");
System.out.println(test_04.isPrimeNum_3(num));
startTime?=?System.currentTimeMillis();
for?(int?i?=?0;?i??1000000;?i++)?{
test_04.isPrimeNum_3(num);
}
endTime?=?System.currentTimeMillis();
System.out.println("第三種方法運(yùn)行時(shí)間:"?+?(endTime?-?startTime)?+?"ms");
System.out.println(test_04.isPrimeNum_4(num));
startTime?=?System.currentTimeMillis();
for?(int?i?=?0;?i??1000000;?i++)?{
test_04.isPrimeNum_4(num);
}
endTime?=?System.currentTimeMillis();
System.out.println("第四種方法運(yùn)行時(shí)間:"?+?(endTime?-?startTime)?+?"ms");
}
}
輸出結(jié)果:
true
第一種方法運(yùn)行時(shí)間:2732ms
true
第二種方法運(yùn)行時(shí)間:671ms
true
第三種方法運(yùn)行時(shí)間:68ms
true
第四種方法運(yùn)行時(shí)間:1064ms
分享名稱:數(shù)字識別代碼java java 數(shù)字識別
網(wǎng)站URL:http://fisionsoft.com.cn/article/ddjddec.html