2021A立方冬令营 一 . 验证码生成(p2)

2.模型可视化

plt.show()最近发现部分ide停不下来了
如遇挂不住的情况应将plt.show()==>plt.show(block=True)

前排提示,本期捧读严重

from keras.utils import plot_model
from IPython import display

# pip install pydot-ng
# sudo apt-get install graphviz
plot_model(model, to_file="model.png", show_shapes=True)
#采用p1保存的模型

display.Image('model.png')
#估计是看生成模型逻辑图,反正我是卡死了0.0
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=1)
#把X(上文的保存验证码图片)y(上文保存验证码图片对应的字符)分别分成20%,80%两份,保持对应关系,80%作为测试集,20%作为训练集,随机状态是1
#前文提到X,y数组前两维表示图片的像素坐标,最后一维表示图片的通道索引
from keras.utils import to_categorical

X_train = np.array(X_train)
X_test = np.array(X_test)
#应该是把他俩转化成array类型吧
y_train = list(to_categorical(y_train, num_classes=n_class).transpose(1, 0, 2))
y_test = list(to_categorical(y_test, num_classes=n_class).transpose(1, 0, 2))
#应该是把他俩转化成list形吧   #进行onehot编码 y_为int数组,num_classes为标签类别数      #转置(0,1,2)x,y,z--->(1,0,2) y,x,z

from keras.callbacks import ModelCheckpoint
from keras.optimizers import Adam

BATCH_SIZE = 32
#捧读
#进行梯度下降时每个batch包含的样本数
EPOCHS = 20
#同上
#训练的轮数

model_checkpoint = ModelCheckpoint(
    'model.h5', save_best_only=True, save_weights_only=True)
#保存的文件,剩下俩参数是找到最好的训练模型(需要的部分)
#作为keras的callback参数可以帮助我们实现在训练过程中的适当时机被调用。实现实时保存训练模型以及训练参数。


# https://blog.csdn.net/breeze5428/article/details/80875323
# filename:字符串,保存模型的路径,filepath可以是格式化的字符串,里面的占位符将会被epoch值和传入on_epoch_end的logs关键字所填入。
# 例如:
# filepath = "weights_{epoch:03d}-{val_loss:.4f}.h5"
# 则会生成对应epoch和验证集loss的多个文件。
#
# monitor:需要监视的值,通常为:val_acc 或 val_loss 或 acc 或 loss
#
# verbose:信息展示模式,0或1。为1表示输出epoch模型保存信息,默认为0表示不输出该信息,信息形如:
# Epoch 00001: val_acc improved from -inf to 0.49240, saving model to /xxx/checkpoint/model_001-0.3902.h5
#
# save_best_only:当设置为True时,将只保存在验证集上性能最好的模型
#
# mode:‘auto’,‘min’,‘max’之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当检测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。
#
# save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)
#
# period:CheckPoint之间的间隔的epoch数
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(1e-4),
              metrics=['accuracy'])
#分别配置优化器,损失函数,准确率

model.fit(X_train, y_train,
          batch_size=BATCH_SIZE,
          epochs=EPOCHS,
          validation_data=(X_test, y_test),
          shuffle=True,
          callbacks=[model_checkpoint])
#输入(验证码图片),输入的标签(对应的真实字符)每层多少个样本 测试集对应的样本和答案 是否乱序输入作为训练 前文提到的遇到想要的模型时保存的条件


# fit( x, y, batch_size=32, epochs=10, verbose=1, callbacks=None,
# validation_split=0.0, validation_data=None, shuffle=True,
# class_weight=None, sample_weight=None, initial_epoch=0)
# x:输入数据。如果模型只有一个输入,那么x的类型是numpy
# array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array
# y:标签,numpy array
# batch_size定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
# epochs:整ze:整数,指数,训练终止时的epoch值,训练将在达到该epoch值时停止,当没有设置initial_epoch时,它就是训练的总轮数,否则训练的总轮数为epochs - inital_epoch
# verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
# callbacks:list,其中的元素是keras.callbacks.Callback的对象。这个list中的回调函数将会在训练过程中的适当时机被调用,参考回调函数
# validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。注意,validation_split的划分在shuffle之前,因此如果你的数据本身是有序的,需要先手工打乱再指定validation_split,否则可能会出现验证集样本不均匀。
# validation_data:形式为(X,y)的tuple,是指定的验证集。此参数将覆盖validation_spilt。
# shuffle:布尔值或字符串,一般为布尔值,表示是否在训练过程中随机打乱输入样本的顺序。若为字符串“batch”,则是用来处理HDF5数据的特殊情况,它将在batch内部将数据打乱。
# class_weight:字典,将不同的类别映射为不同的权值,该参数用来在训练过程中调整损失函数(只能用于训练)
# sample_weight:权值的numpy
# array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为(samples,sequence_length)的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode=’temporal’。
# initial_epoch: 从该参数指定的epoch开始训练,在继续之前的训练时有用。
# fit函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况
# callbacks:模型会在每次迭代完一轮后,调用相应的函数。实现实时保存训练模型以及训练参数。

验证码识别器

def decode(y):
    acc = np.cumprod(np.max(y, axis=2)[0:])[-1]
    y = np.argmax(np.array(y), axis=2)[:, 0]
    # np.max(y, axis=2)[0:]取完每行最大值后是一个[4,1]数组,然后..好像啥都没干
    #[4][1][36]中,4代表四个字符,1,意义不明(说不定是灰度通道),36代表三十六个对应字符,里边的值对应着对应概率
    # 然后进行np.cumprod()[-1]==》就是取这四个数的乘积,就是总的概率啦
    # np.argmax(np.array(y), axis=2)[:, 0]==>返回值应该是[4,1]的数组,每一项对应的是36个数中的最大的序号,然后也给他正过来变成[4]数组(每个数组中的数字代表着该行中数字最大的项(onehot编码中代表取该数))
    #https://blog.csdn.net/sumaliqinghua/article/details/97045931

    # np.cumprod:返回一个一维的数组分别是[a1,a1*a2,。。。,a1*....an]
    # np.argmax:返回数组中最大的数(括号内为本人拙见,大佬手下留情)---》(onehot编码都是0,1,就是返回1所在的位置)的序号[1.3.2]就是(第)2-1=1(数组从0开始)
    # axis2:旨在从内部第2+1层执行np.cumprod操作(因为只在一层进行操作,返回值是一层,所以数组大小不变)
    #[-1]指取最后一维
    #[:,0]指取第二个维度里的全部

在这里插入图片描述
在这里插入图片描述

    title = ''.join([characters[x] for x in y])
    # 原本的字符是使用onehot编码(01数组),这应该是把1提出来然后翻译成对应的字符
    return '%s %.6f' % (title, acc)
    #返回解析好的字符和....让我再思考一晚上,明天填坑。。。

嫖一个图https://blog.csdn.net/sumaliqinghua/article/details/97045931
在这里插入图片描述


# In[ ]:


model.load_weights('model.h5')
# 1、keras.models.load_model() 读取网络、权重
# 2、keras.models.load_weights() 仅读取权重
# 详情https://blog.csdn.net/wanggao_1990/article/details/90446736

# In[ ]:


y_pred = model.predict(np.expand_dims(image, axis=0))
##输入测试数据,输出预测结果
#np.expand_dims:用于扩展数组的形状(外边再套一个括号)变成三维
#model.predict应该是开始生成(吧)返回一个和np.expand_dims(image, axis=0)一样的数据结构,二维数组图片多一维度(套一个括号)


#https://blog.csdn.net/weixin_46649052/article/details/110717737
# predict(
#     x, batch_size=None, verbose=0, steps=None, callbacks=None, max_queue_size=10,
#     workers=1, use_multiprocessing=False
# )
#
# 参数:
# x:输入样本,格式可以是
#  - Numpy数组(或类似array的数组)或数组列表(如果模型具有多个输入)。
#  - TensorFlow张量或张量列表(如果模型具有多个输入)。
#  - tf.data数据集。
#  - 生成器或keras.utils.Sequence实例
#
# batch_size:每个梯度更新的样本数。如果未指定,batch_size将默认为32
# verbose:模型
# steps:宣布预测回合完成之前的步骤总数(样本批次)。忽略默认值None
# callbacks:预测期间应用的回调函数列表
#
# max_queue_size=10:
# 仅用于generator或keras.utils.Sequence输入。
# 生成器队列的最大大小。
# 如果未指定,max_queue_size将默认为10
#
# workers=1:
# 仅用于generator或keras.utils.Sequence输入。
# 使用基于进程的线程时,要启动的最大进程数。
# 如果未指定,worker将默认为1。如果为0,将在主线程上执行生成器
#
# use_multiprocessing=False:
# 仅用于generator或keras.utils.Sequence输入。
# 如果为True,则使用基于进程的线程。
# 如果未指定,则use_multiprocessing将默认为False。

plt.imshow(image, cmap='gray')
plt.title('true: %s\npred: %s' % (label, decode(y_pred)))
#展示验证码图片,标题是模型识别图片出来的文字(对onehot编码后的y_pred模型进行decode)

“满纸荒唐言,一把辛酸泪,若非美匪徒,谁解其中味”
真希望我英语能好点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值