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...