CNNベースの検証コード識別ニューラルネットワーク実現
一、前言
1、CNNって何?
2、TensorFlow進級
二、実戦
1、検証コード生成
2、重み、オフセットおよびツール関数の定義
3、CNN三層ニューラルネットワーク定義
4、最適化と偏差
5、トレーニング
三、その他
詳細コードは私のgithubで見つけることができます.https://github.com/lpty/tensorflow_tutorial
1、CNNって何?
2、TensorFlow進級
二、実戦
1、検証コード生成
import random
import numpy as np
from PIL import Image
from captcha.image import ImageCaptcha
NUMBER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
LOW_CASE = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z']
UP_CASE = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z']
CAPTCHA_LIST = NUMBER + LOW_CASE + UP_CASE
CAPTCHA_LEN = 4
CAPTCHA_HEIGHT = 60
CAPTCHA_WIDTH = 160
def random_captcha_text(char_set=CAPTCHA_LIST, captcha_size=CAPTCHA_LEN):
'''
:param char_set:
:param captcha_size:
:return:
'''
captcha_text = [random.choice(char_set) for _ in range(captcha_size)]
return ''.join(captcha_text)
def gen_captcha_text_and_image(width=CAPTCHA_WIDTH, height=CAPTCHA_HEIGHT,save=None):
'''
:param width:
:param height:
:param save:
:return: np
'''
image = ImageCaptcha(width=width, height=height)
#
captcha_text = random_captcha_text()
captcha = image.generate(captcha_text)
#
if save: image.write(captcha_text, captcha_text + '.jpg')
captcha_image = Image.open(captcha)
# np
captcha_image = np.array(captcha_image)
return captcha_text, captcha_image
captchaパッケージに基づいた簡単な検証コードジェネレータは、手を練習するのに役立ちます.コードを直接見ればいいです.2、重み、オフセットおよびツール関数の定義
def weight_variable(shape, w_alpha=0.01):
'''
,
:param shape:
:param w_alpha:
:return:
'''
initial = w_alpha * tf.random_normal(shape)
return tf.Variable(initial)
def bias_variable(shape, b_alpha=0.1):
'''
,
:param shape:
:param b_alpha:
:return:
'''
initial = b_alpha * tf.random_normal(shape)
return tf.Variable(initial)
def conv2d(x, w):
'''
, 1, ‘SAME’ ,
:param x:
:param w:
:return:
'''
return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')
def max_pool_2x2(x):
'''
max pooling, , 2x2pool, 1/2
:param x:
:return:
'''
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
3、CNN三層ニューラルネットワーク定義
def cnn_graph(x, keep_prob, size, captcha_list=CAPTCHA_LIST, captcha_len=CAPTCHA_LEN):
'''
:param x:
:param keep_prob:
:param size:
:param captcha_list:
:param captcha_len:
:return:
'''
# reshape 4
image_height, image_width = size
x_image = tf.reshape(x, shape=[-1, image_height, image_width, 1])
# layer 1
# filter 3x3x1, 32 , 32 filter
w_conv1 = weight_variable([3, 3, 1, 32])
b_conv1 = bias_variable([32])
# rulu
h_conv1 = tf.nn.relu(tf.nn.bias_add(conv2d(x_image, w_conv1), b_conv1))
#
h_pool1 = max_pool_2x2(h_conv1)
# dropout
h_drop1 = tf.nn.dropout(h_pool1, keep_prob)
# layer 2
w_conv2 = weight_variable([3, 3, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(tf.nn.bias_add(conv2d(h_drop1, w_conv2), b_conv2))
h_pool2 = max_pool_2x2(h_conv2)
h_drop2 = tf.nn.dropout(h_pool2, keep_prob)
# layer 3
w_conv3 = weight_variable([3, 3, 64, 64])
b_conv3 = bias_variable([64])
h_conv3 = tf.nn.relu(tf.nn.bias_add(conv2d(h_drop2, w_conv3), b_conv3))
h_pool3 = max_pool_2x2(h_conv3)
h_drop3 = tf.nn.dropout(h_pool3, keep_prob)
# full connect layer
image_height = int(h_drop3.shape[1])
image_width = int(h_drop3.shape[2])
w_fc = weight_variable([image_height*image_width*64, 1024])
b_fc = bias_variable([1024])
h_drop3_re = tf.reshape(h_drop3, [-1, image_height*image_width*64])
h_fc = tf.nn.relu(tf.add(tf.matmul(h_drop3_re, w_fc), b_fc))
h_drop_fc = tf.nn.dropout(h_fc, keep_prob)
# out layer
w_out = weight_variable([1024, len(captcha_list)*captcha_len])
b_out = bias_variable([len(captcha_list)*captcha_len])
y_conv = tf.add(tf.matmul(h_drop_fc, w_out), b_out)
return y_conv
4、最適化と偏差
def optimize_graph(y, y_conv):
'''
:param y:
:param y_conv:
:return:
'''
# loss logits sigmod
# sigmod_cross ,
# softmax_cross ,
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=y_conv, labels=y))
# loss
optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
return optimizer
def accuracy_graph(y, y_conv, width=len(CAPTCHA_LIST), height=CAPTCHA_LEN):
'''
:param y:
:param y_conv:
:param width:
:param height:
:return:
'''
#
#
predict = tf.reshape(y_conv, [-1, height, width])
max_predict_idx = tf.argmax(predict, 2)
#
label = tf.reshape(y, [-1, height, width])
max_label_idx = tf.argmax(label, 2)
correct_p = tf.equal(max_predict_idx, max_label_idx)
accuracy = tf.reduce_mean(tf.cast(correct_p, tf.float32))
return accuracy
5、トレーニング
def train(height=CAPTCHA_HEIGHT, width=CAPTCHA_WIDTH, y_size=len(CAPTCHA_LIST)*CAPTCHA_LEN):
'''
cnn
:param height:
:param width:
:param y_size:
:return:
'''
# cnn 2 , 2 ,
# 2 , 3 , 2 , 2
# np.pad(image,((2,3),(2,2)), 'constant', constant_values=(255,))
acc_rate = 0.95
#
x = tf.placeholder(tf.float32, [None, height * width])
y = tf.placeholder(tf.float32, [None, y_size])
#
keep_prob = tf.placeholder(tf.float32)
# cnn
y_conv = cnn_graph(x, keep_prob, (height, width))
#
optimizer = optimize_graph(y, y_conv)
#
accuracy = accuracy_graph(y, y_conv)
# .
saver = tf.train.Saver()
sess = tf.Session()
sess.run(tf.global_variables_initializer())
step = 0
while 1:
batch_x, batch_y = next_batch(64)
sess.run(optimizer, feed_dict={x: batch_x, y: batch_y, keep_prob: 0.75})
#
if step % 100 == 0:
batch_x_test, batch_y_test = next_batch(100)
acc = sess.run(accuracy, feed_dict={x: batch_x_test, y: batch_y_test, keep_prob: 1.0})
print(datetime.now().strftime('%c'), ' step:', step, ' accuracy:', acc)
# ,
if acc > acc_rate:
model_path = os.getcwd() + os.sep + str(acc_rate) + "captcha.model"
saver.save(sess, model_path, global_step=step)
acc_rate += 0.01
if acc_rate > 0.99: break
step += 1
sess.close()
ここでは精度が95%に達するとモデルを保存し、実際の訓練は30分以上で98%の精度に達することができる.三、その他
詳細コードは私のgithubで見つけることができます.https://github.com/lpty/tensorflow_tutorial