Seq to Seq識別驗證碼

2021-09-05 11:37:43 字數 3607 閱讀 3162

import tensorflow as tf

import os

import matplotlib.image as implt

import numpy as np

batch_size = 100

h = 60

w = 120

class sample:

def __init__(self):

#定義乙個資料集,用於存放訓練樣本和標籤

self.datasets =

"""獲取訓練樣本和標籤

"""for filename in os.listdir('d:\code'):#遍歷每乙個資料

# 獲取訓練樣本,os.path.join('d:\code',filename)是將兩個字串拼接在一起形成乙個新的字串作為路徑

x = implt.imread(os.path.join('d:\code',filename))

y = filename.split('.')[0]#將檔名作為標籤,對整個檔名進行分割獲取真正的標籤

y = self.to_onehot(y)#將標籤轉化為onehot形式

def to_onehot(self,y):

z = np.zeros([4,10])#建立乙個4行10列的全零陣列構造出onehot形式

#遍歷標籤中的每乙個字元

for i in range(4):

index = int(y[i])#將字元轉化為整形

z[i][index] = 1#將對應位置1

return z#返回onehot形式的標籤

def get_batch(self,n):

xs = #用於存放拿到的隨機樣本

ys = #用於存放拿到的隨機樣本的標籤

for i in range(n):

index = np.random.randint(0,len(self.datasets))#生成用於隨機抽取樣本的索引

return xs,ys

class net:

def __init__(self):

self.x = tf.placeholder(dtype=tf.float32,shape=[batch_size,h,w,3])

self.y = tf.placeholder(dtype=tf.float32,shape=[batch_size,4,10])

self.encode = encoder()#編碼器

self.decode = decoder()#解碼器

def forward(self):

y = self.encode.forward(self.x)#獲取編碼後的結果

self.output = self.decode.forward(y)#獲取解碼後的結果

def backward(self):

self.loss = tf.reduce_mean((self.y-self.output)**2)

self.optimizer = tf.train.adamoptimizer().minimize(self.loss)

class encoder:

def __init__(self):

self.w = tf.variable(tf.truncated_normal(dtype=tf.float32,shape=[h*3,128],stddev=0.1))

self.b = tf.variable(tf.zeros([128]))

def forward(self,x):

x = tf.transpose(x,[0,2,1,3])#因為lstm需要nwhc的形式,所以要把nhwc換一下

x = tf.reshape(x,[batch_size*w,h*3])

y = tf.nn.relu(tf.matmul(x,self.w)+self.b)

y = tf.reshape(y,[batch_size,w,128])

with tf.variable_scope('encode'):#設定變數在以下範圍內是共享的

cell = tf.contrib.rnn.basiclstmcell(128)#建立128個lstm細胞

init_state = cell.zero_state(batch_size,dtype=tf.float32)#初始化細胞狀態

output,final_state = tf.nn.dynamic_rnn(cell,y,initial_state=init_state,time_major=false)#拿到輸出和最終的狀態

return output[:,-1,:]#返回[100,128]這樣的資料

class decoder:

def __init__(self):

self.w = tf.variable(tf.truncated_normal(dtype=tf.float32,shape=[128,10],stddev=0.1))

self.b = tf.variable(tf.zeros([10]))

def forward(self,y):#目的是將[100,128]變成[100,4,10]

#先增加乙個維度變成[100,1,128]

y = tf.expand_dims(y,axis=1)

#再把第二維度擴充套件一下變成[100,4,128]

y = tf.tile(y,[1,4,1])#第0維和第2維不變,第1維擴充套件4倍

with tf.variable_scope('decode'):

cell = tf.contrib.rnn.basiclstmcell(128)

init_state = cell.zero_state(batch_size,dtype=tf.float32)

output,final_state = tf.nn.dynamic_rnn(cell,y,initial_state=init_state,time_major=false)

#output的維度是[100,4,128],將它變形為[100*4,128]

output = tf.reshape(output,[batch_size*4,128])

output = tf.nn.softmax(tf.matmul(output,self.w)+self.b)#[100*4,10]

#將形狀變回來

output = tf.reshape(output,[batch_size,4,10])

return output

if __name__ == '__main__':

sample = sample()

net = net()

net.forward()

net.backward()

init = tf.global_variables_initializer()

with tf.session() as sess:

sess.run(init)

for i in range(120):

x,y = sample.get_batch(batch_size)

loss,_ = sess.run([net.loss,net.optimizer],feed_dict=)

print(loss)

驗證碼 簡單驗證碼識別

這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 興之所至之所以說簡單,我覺得是這樣的 抽了五張驗證碼扔進ps,50 透明度,長這樣 只有數字為內容 每張圖的數字都在固定位置 沒有太大的干擾因素 數字字型,形態完...

驗證碼識別

驗證碼識別過程好比人大腦的乙個識別過程 首先,我們的眼睛接收,並將這張的資訊輸送給大腦 然後,我們的大腦接收到這個資訊以後,對這個資訊作出處理 最後,將中的有效資訊提取出來再將其和大腦中儲存的資訊進行對應對比,確定對比結果。模擬驗證碼識別,大腦接受的處理過程就相當於電腦對的預處理,大腦對進行對比和確...

驗證碼識別

import tensorflow as tf 定義乙個初始化權重的函式 def weight variables shape w tf.variable tf.random normal shape shape,mean 0.0,stddev 1.0 return w 定義乙個初始化偏置的函式 d...