CNN은 손으로 쓴 숫자를 식별한다

5152 단어
인터넷의 강좌를 보면 대부분이 훈련만 마치고 끝난다. 나는 많은 사람들이 나처럼 훈련 결과에 따라 우리 자신의 사진을 어떻게 테스트하는지 관심을 가지는지 생각한다. 이 부분은 정말 보기 드물다.그리고 코드가 많이 해석되지 않아서 이것은 우호적이지 않다. 왜냐하면 보는 사람은 모두 신출내기이기 때문에 해석이 매우 무겁다.이 글을 마치면 간단한 CNN 네트워크를 위해 코드를 쓰는 법을 배울 수 있다.데이터 읽기, 데이터 훈련, 모델 저장, 테스트 결과를 포함한다.20분 정도 걸려요.제1부분: 코드 먼저 올리기

라이브러리 가져오기


from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf import numpy as np from PIL import Image

데이터 원본, 여기 있는minstData는 코드와 같은 디렉터리에 있는 폴더입니다.이 파일의 데이터를 읽습니다


먼저 mnist 데이터를 다운로드하여minstData라는 디렉터리에 놓아야 한다. mnist 데이터는 인터넷에서 다운로드해야 한다. 왜냐하면 국내가 벽에 걸려 있기 때문이다.


mnist = input_data.read_data_sets("minstData", one_hot=True)

mnist의 트레이닝 이미지 읽기, 트레이닝에 대응하는 라벨, 테스트 이미지, 테스트 라벨 읽기


trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels

입력 데이터의 구조를 훈련하고 28줄 28열의 행렬, 즉 그림의 픽셀 크기를 정의한다.


trX = trX.reshape(-1, 28, 28, 1)

동훈련의 입력 구조


teX = teX.reshape(-1, 28, 28, 1)

입력, 출력, 데이터 구덩이를 정의한다(데이터 모양을 먼저 정의하고 구체적인 데이터를 먹인다)


x = tf.placeholder(tf.float32, [None, 28, 28, 1])

이 10 은 숫자 의 결과 가 0 에서 9 까지 총 10 의 상황 이기 때문 이다


y = tf.placeholder(tf.float32, [None, 10])

가중치 정의 함수


def init_Weight(shape): # 입력한 데이터 형태에 따라 대응하는 가중치 return tf를 무작위로 생성합니다.Variable(tf.random_normal(shape, stddev=0.01))

여기서 초기화 권중은 2개의 3이 권적 확인 3*3의 수조를 대표한다.


1층의 무거운 입력은 1입니다. 훈련 그림의 색깔은 흑백이고 통로가 하나이기 때문입니다.


왜 32인지, 이것은 사실 상관없다. 32는 32개의 3*3의 수조가 입력된 데이터 볼륨을 대표한다


쌓이다각 볼륨은 하나의 속성을 얻는 것을 의미한다. 32, 즉 32가지 그림의 특성을 얻는 것이다. 물론 그의 수량, 예를 들어 20


뒤에 왜 자권적핵의 수량이 2배로 변합니까?이게 진짜 구덩이인지 알려줄게.왜냐하면


연못이 녹으면 그림이 작아져요. 으으으으, 저도 왜 그런지 모르겠어요. 일종의 규정인 것 같아요.


32도 OK지만 앞뒤 수량에 맞게 주의해야 한다.


12844는 왜일까요?128은 권적핵의 수량을 대표하고 44는 이것을 위해 그의 그림 크기가 2828--1414-77--4*4로 연못화된 크기가 2이다


w = init_Weight([3, 3, 1, 32]) w2 = init_Weight([3, 3, 32, 64]) w3 = init_Weight([3, 3, 64, 128]) w4 = init_Weight([128 * 4 * 4, 625]) # 전체 연결 레이어wo = initWeight([625, 10])

CNN 네트워크 모델을 정의했습니다.


def mode(X, w, w2, w3, w4, wo, p keep conv, p hide conv): #28--1414, 풀화, "SAME"는 볼륨이 원래 크기를 유지합니다.l1a = tf.nn.relu(tf.nn.conv2d(X, w, strides=[1, 1, 1, 1], padding="SAME")) l1 = tf.nn.max_pool(l1a, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") l1 = tf.nn.dropout(l1, p_keep_conv)
l2a = tf.nn.relu(tf.nn.conv2d(l1, w2, strides=[1, 1, 1, 1], padding="SAME"))
l2 = tf.nn.max_pool(l2a, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
l2 = tf.nn.dropout(l2, p_keep_conv)

l3a = tf.nn.relu(tf.nn.conv2d(l2, w3, strides=[1, 1, 1, 1], padding="SAME"))
l3 = tf.nn.max_pool(l3a, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
l3 = tf.reshape(l3, [-1, w4.get_shape().as_list()[0]])
l3 = tf.nn.dropout(l3, p_keep_conv)

#     
l4 = tf.nn.relu(tf.matmul(l3, w4))
l4 = tf.nn.dropout(l4, p_hide_conv)

#    
lo = tf.matmul(l4, wo)
return lo

저장된 뉴런 수


p_keep_conv = tf.placeholder(tf.float32)

숨겨진 뉴런 수


p_hide_conv = tf.placeholder(tf.float32)

훈련 결과를 얻다


py_x = mode(x, w, w2, w3, w4, wo, p_keep_conv, p_hide_conv)

손실 함수 정의


coss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=py_x, labels=y))

훈련


train_op = tf.train.RMSPropOptimizer(0.01, 0.9).minimize(coss) predict_op = tf.argmax(py_x, 1)
batch_size = 128 test_size = 256

저장된 객체 가져오기


save=tf.train.Saver()
시작. 여기 A.
with tf.Session() as sess: # 모든 객체 tf. 초기화global_variables_initializer().run() for i in range(100): training_batch = zip(range(0, len(trX), batch_size), range(batch_size, len(trX) + 1, batch_size)) for start, end in training_batch: sess.run(train_op, feed_dict={x: trX[start:end], y: trY[start:end], p_keep_conv: 0.8, p_hide_conv: 0.5}) test_indices = np.arange(len(teX)) np.random.shuffle(test_indices) test_indices = test_indices[0:test_size] print(i, np.mean(np.argmax(teY[test_indices], axis=1) == sess.run(predict op,feed dict={x:teX[test indices],p keep conv: 1.0,p hide conv: 1.0}))))#모델은 jiangf라는 디렉터리에 저장되고save를 직접 만들어야 합니다.save(sess,"jiangf/test.ckpt")

끝. 여기 A 로 표기.


-----------위에 있는 것은 모형을 훈련하고 보존하는 것--------------------


--------저장된 모형을 읽고 자신의 그림을 식별------------


자신과 나의 그림을 식별하고 내가 표시한 A구역 주석을 먼저 표시한다. 이미 훈련이 끝났으니 이제 훈련할 필요가 없다.


주석을 달면 아래에서 우리의 그림을 식별하기 시작한다


with tf.Session() as sess2: #저장된 모델 save를 복원합니다.restore(sess2, "jiangf/test.ckpt") #pic 디렉터리에 미리 저장된 이미지 읽기path = "pic/train6.bmp"keep_prob = tf.placeholder(tf.float32, [1, 10]) img = Image.open(image_path).convert('L') # 회색조(L) imgarray=np.array(img).reshape([-1,28,28,1]) print(img_array) y = sess2.run(predict op, feed dict={x: img array, p keep conv: 1.0, p hide conv: 1.0}) print('Predict digit', y) # 출력 결과.

다 보신 걸 축하드립니다. 감사합니다.

좋은 웹페이지 즐겨찾기