1. 四维图像卷积输入
from keras.layers import Dense,Activation,Dropout,Conv2D,MaxPool2D,MaxPooling2D,Flatten
from keras.utils import np_utils
from PIL import Image
import numpy as np
import glob,codecs
from keras import backend as K
K.set_image_data_format('channels_last')
nb_classes = 2
length_sample = 0
def T_Model():
model = Sequential()
model.add(Conv2D(32, kernel_size=(5, 5), input_shape=(512, 64, 1), activation='relu', padding='same'))
model.add(MaxPool2D())
model.add(Dropout(0.3))
model.add(Conv2D(64, kernel_size=(5, 5), activation='relu', padding='same'))
model.add(MaxPool2D())
model.add(Dropout(0.3))
model.add(Conv2D(128, kernel_size=(5, 5), activation='relu', padding='same'))
model.add(MaxPool2D())
model.add(Dropout(0.5))
model.add(Conv2D(256, kernel_size=(5, 5), activation='relu', padding='same'))
model.add(MaxPool2D())
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))
return model
def load_data():
X_train = []
y_train = []
paths = glob.glob("./data/dataline/train30/*.jpg")
i = 1
for img_path in paths:
print img_path
i = i + 1
try:
img = Image.open(img_path).convert('L')
img = img.resize((512, 64), Image.ANTIALIAS)
X_train.append(np.asarray(img).reshape(512,64,1))
with codecs.open(img_path.replace(".jpg",'.txt'),'r','utf-8') as fp:
content = fp.read()
if content == "1":
y_train.append(1)
else:
y_train.append(0)
except IOError:
print('Corrupted image for %s' % img_path)
pass
length_sample = len(X_train)
print y_train
return X_train,y_train,length_sample
def load_test():
x_test = []
y_test = []
paths = glob.glob("./data/dataline/train30/*.txt")
for txt_path in paths:
try:
with codecs.open(txt_path, 'r', 'utf-8') as fp:
content = fp.read()
if content == "1":
y_test.append(1)
else:
y_test.append(0)
img = Image.open(txt_path.replace('.txt','.jpg')).convert('L')
img = img.resize((512, 64), Image.ANTIALIAS)
x_test.append(np.asarray(img).reshape(512,64,1))
except IOError:
print('Corrupted image for %s' % txt_path)
pass
print y_test
length_sample = len(x_test)
return x_test,y_test,length_sample
def main():
x_train, y_train,length_sample = load_data()
print len(x_train)
indix = range(length_sample)
np.random.shuffle(indix)
x_train = np.array(x_train).astype('float32')
y_train = np_utils.to_categorical(y_train,nb_classes)
model = T_Model()
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train[indix], y_train[indix], epochs=20, batch_size=1, verbose=1)
model.save("recognize_.h5")
x_test, y_test, length_sample_test = load_test()
x_test = np.array(x_test).astype('float32')
y_test = np_utils.to_categorical(y_test, nb_classes)
print y_test
model = load_model("recognize_.h5")
a,b = model.evaluate(x_test,y_test,batch_size=1)
print "\nacc:%f\nloss:%f"%(b,a)
if __name__ == "__main__":
main()
说明: 目录./data/dataline/train30/下包含两类图像,图像文件和名称保持一致,图像扩展名为.jpg,文本扩展名为.txt,文本内容分别为0和1.
2.input_dim与Lambda含义
from keras import backend as K
from keras.models import Sequential, Model
from keras.layers import Dense
import numpy as np
from keras.layers import Lambda
def get_submean_model():
model = Sequential()
model.add(Dense(5,input_dim=7))
def sub_mean(x):
x -= K.mean(x,axis=1,keepdims=True)
print x
return x
model.add(Lambda(sub_mean,output_shape=lambda aa:aa))
model.compile(optimizer='rmsprop',loss='mse')
return model
model = get_submean_model()
res=model.predict(np.random.random((3,7)))
说明:Dense层的input_dim的维数和np.random.random((3,7))产生的二维数组第二维相同
3 keras工程验证码识别
#-*-coding:utf-8-*-
from captcha.image import ImageCaptcha
import matplotlib.pyplot as plt
import numpy as np
import random
from keras.models import *
from keras.layers import *
import string
characters = string.digits + string.ascii_uppercase + string.ascii_lowercase
width, height, n_len, n_class = 170, 80, 4, len(characters)
def gen(batch_size=32):
X = np.zeros((batch_size, height, width, 3), dtype=np.uint8)
y = [np.zeros((batch_size, n_class), dtype=np.uint8) for i in range(n_len)]
generator = ImageCaptcha(width=width, height=height)
while True:
for i in range(batch_size):
random_str = ''.join([random.choice(characters) for j in range(4)])
X[i] = generator.generate_image(random_str)
for j, ch in enumerate(random_str):
y[j][i, :] = 0
y[j][i, characters.find(ch)] = 1
yield X, y
def decode(y):
y = np.argmax(np.array(y), axis=2)[:,0]
return ''.join([characters[x] for x in y])
input_tensor = Input((height, width, 3))
x = input_tensor
for i in range(4):
x = Conv2D(32*2**i, 3, 3, activation='relu')(x)
x = Conv2D(32*2**i, 3, 3, activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
x = Flatten()(x)
x = Dropout(0.25)(x)
x = [Dense(n_class, activation='softmax', name='c%d'%(i+1))(x) for i in range(4)]
model = Model(input=input_tensor, output=x)
model.compile(loss='categorical_crossentropy',optimizer='adadelta', metrics=['accuracy'])
###这里构造一个callback的数组,当作参数传给fit
tb_cb = keras.callbacks.TensorBoard(log_dir='logs', write_graph=True, write_images=False,
embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)
es_cb = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0.09, patience=5, verbose=1, mode='auto')
cbks = [];
cbks.append(tb_cb);
cbks.append(es_cb);
model.fit_generator(gen(), samples_per_epoch=512, nb_epoch=1,callbacks=cbks,nb_worker=1,validation_data=gen(), validation_steps=32)
说明:np.argmax(np.array(y), axis=2)打印的值为:
[[41]
[3 ]
[48]
[26]]