{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "524\n", "特啦同爱手使清弟时还睡近线却文政完么展便工在不办入强路安起理斥队何听农验它哦呢座口刚叔沙信內笑装往用更站社亲房跑啊章屋马直众立前都其造该瓜片论水夜习白感离下神送常当只认干发到思席研画领极指吗讲九越仗过受这已乐穿原才包丛满岸第千限今色种头被要活或转紧没后向气咯者跟想你吧学如问忙界解坚科一确非经张快顶由争目雪仔拿分小照般表牛命上北各他部之新孩令黑爬无级友睛脸关忽给动嘴南事写应光将情八晚成紫步所呀些飞息似车开边敢匆阵伯志禾四着够底处道衣说难七音伟仪儿通术面形停胜尤二谁题您赶热万深历导帮反收行传少生度侯员位斗会流五岁村因决但轿歌菜地找古再作物力总她样字围性准苦和怎人咱六候冲叶空加付提望外而熟共坐战连读吃点把是让心打于丘那间河整劳老建倒数治女本十接每高竺世身单山土城个敌明类士己失乎觉合门区轻究子定中我雨记体从至必甩半任告就得册民草姑产什报现青算钱太比大压见师国运石取们出怕像句唱知话家旧主眼自野去变化哪重花急火然哥并星别乡多书法月阶回相早意系以天很破的件业带跳仙机了林印声先代旁风渐长进许名晴块阳船也放几实年团此果最军史际脚革又公树呼婆切饭群两做全里平有庄等改未拉来根亮叫次百刻响海结三落走场识教且为义内条慢方寻真观看东日利答兴服枪掉量住好对可背细\n", "524\n" ] } ], "source": [ "from captcha.image import ImageCaptcha\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import random\n", "import glob\n", "import re\n", "from pylab import mpl\n", "mpl.rcParams['font.sans-serif'] = ['SimHei'] #中文显示问题\n", "\n", "%matplotlib inline\n", "%config InlineBackend.figure_format = 'retina'\n", "\n", "import string\n", "# characters = string.digits + string.ascii_uppercase # 验证码字符集合数字+英文\n", "with open('/data/captcha/chinese_characters.txt', encoding='utf-8') as f:\n", " characters = f.read().strip()\n", "print(len(characters))\n", "# characters = '四生乐句付仗斥令仔乎白仙甩他瓜们用丘仪失丛代印册匆禾' # 中文字符集合\n", "print(characters)\n", "print(len(set(characters)))\n", "width, height, n_len, n_class = 120, 40, 4, len(characters) + 1 #图片宽、高,验证码最大长度,分类类别:字符集+1个空值" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ " # 防止 tensorflow 占用所有显存\n", "import tensorflow as tf\n", "import tensorflow.keras.backend as K\n", "\n", "config = tf.ConfigProto()\n", "config.gpu_options.allow_growth=True #True \n", "sess = tf.Session(config=config)\n", "K.set_session(sess)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# 定义 CTC Loss\n", "import tensorflow.keras.backend as K\n", "\n", "def ctc_lambda_func(args):\n", " '''\n", " 定义ctc损失函数\n", " 参数:y_pred:预测值,labels:标签,input_length:lstm tiemstep,label_length:标签长度\n", " ''' \n", " y_pred, labels, input_length, label_length = args\n", " return K.ctc_batch_cost(labels, y_pred, input_length, label_length)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# 定义网络\n", "from tensorflow.keras.models import *\n", "from tensorflow.keras.layers import *\n", "\n", "input_tensor = Input((height, width, 3))\n", "x = input_tensor\n", "\n", "for i, n_cnn in enumerate([2, 2, 2, 2]): \n", " for j in range(n_cnn):\n", " x = Conv2D(32*2**min(i, 3), kernel_size=3, padding='same', kernel_initializer='he_uniform')(x) # 32*2**min(i, 3)\n", " x = BatchNormalization()(x)\n", " x = Activation('relu')(x)\n", " x = MaxPooling2D(2 if i < 3 else (2, 1))(x)\n", "\n", "x = Permute((2, 1, 3))(x)\n", "x = TimeDistributed(Flatten())(x)\n", "\n", "rnn_size = 64 # 128\n", "# x = Bidirectional(CuDNNGRU(rnn_size, return_sequences=True))(x)\n", "# x = Bidirectional(CuDNNGRU(rnn_size, return_sequences=True))(x)\n", "x = Bidirectional(GRU(rnn_size, return_sequences=True))(x)\n", "x = Bidirectional(GRU(rnn_size, return_sequences=True))(x)\n", "x = Dense(n_class, activation='softmax')(x)\n", "\n", "base_model = Model(inputs=input_tensor, outputs=x)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "labels = Input(name='the_labels', shape=[n_len], dtype='float32')\n", "input_length = Input(name='input_length', shape=[1], dtype='int64')\n", "label_length = Input(name='label_length', shape=[1], dtype='int64')\n", "loss_out = Lambda(ctc_lambda_func, output_shape=(1,), name='ctc')([x, labels, input_length, label_length])\n", "\n", "model = Model(inputs=[input_tensor, labels, input_length, label_length], outputs=loss_out)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# # 网络结构可视化\n", "# from tensorflow.keras.utils import plot_model\n", "# from IPython.display import Image\n", "\n", "# plot_model(model, to_file='ctc.png', show_shapes=True)\n", "# Image('ctc.png')\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "input_1 (InputLayer) (None, 40, 120, 3) 0 \n", "_________________________________________________________________\n", "conv2d (Conv2D) (None, 40, 120, 32) 896 \n", "_________________________________________________________________\n", "batch_normalization (BatchNo (None, 40, 120, 32) 128 \n", "_________________________________________________________________\n", "activation (Activation) (None, 40, 120, 32) 0 \n", "_________________________________________________________________\n", "conv2d_1 (Conv2D) (None, 40, 120, 32) 9248 \n", "_________________________________________________________________\n", "batch_normalization_1 (Batch (None, 40, 120, 32) 128 \n", "_________________________________________________________________\n", "activation_1 (Activation) (None, 40, 120, 32) 0 \n", "_________________________________________________________________\n", "max_pooling2d (MaxPooling2D) (None, 20, 60, 32) 0 \n", "_________________________________________________________________\n", "conv2d_2 (Conv2D) (None, 20, 60, 64) 18496 \n", "_________________________________________________________________\n", "batch_normalization_2 (Batch (None, 20, 60, 64) 256 \n", "_________________________________________________________________\n", "activation_2 (Activation) (None, 20, 60, 64) 0 \n", "_________________________________________________________________\n", "conv2d_3 (Conv2D) (None, 20, 60, 64) 36928 \n", "_________________________________________________________________\n", "batch_normalization_3 (Batch (None, 20, 60, 64) 256 \n", "_________________________________________________________________\n", "activation_3 (Activation) (None, 20, 60, 64) 0 \n", "_________________________________________________________________\n", "max_pooling2d_1 (MaxPooling2 (None, 10, 30, 64) 0 \n", "_________________________________________________________________\n", "conv2d_4 (Conv2D) (None, 10, 30, 128) 73856 \n", "_________________________________________________________________\n", "batch_normalization_4 (Batch (None, 10, 30, 128) 512 \n", "_________________________________________________________________\n", "activation_4 (Activation) (None, 10, 30, 128) 0 \n", "_________________________________________________________________\n", "conv2d_5 (Conv2D) (None, 10, 30, 128) 147584 \n", "_________________________________________________________________\n", "batch_normalization_5 (Batch (None, 10, 30, 128) 512 \n", "_________________________________________________________________\n", "activation_5 (Activation) (None, 10, 30, 128) 0 \n", "_________________________________________________________________\n", "max_pooling2d_2 (MaxPooling2 (None, 5, 15, 128) 0 \n", "_________________________________________________________________\n", "conv2d_6 (Conv2D) (None, 5, 15, 256) 295168 \n", "_________________________________________________________________\n", "batch_normalization_6 (Batch (None, 5, 15, 256) 1024 \n", "_________________________________________________________________\n", "activation_6 (Activation) (None, 5, 15, 256) 0 \n", "_________________________________________________________________\n", "conv2d_7 (Conv2D) (None, 5, 15, 256) 590080 \n", "_________________________________________________________________\n", "batch_normalization_7 (Batch (None, 5, 15, 256) 1024 \n", "_________________________________________________________________\n", "activation_7 (Activation) (None, 5, 15, 256) 0 \n", "_________________________________________________________________\n", "max_pooling2d_3 (MaxPooling2 (None, 2, 15, 256) 0 \n", "_________________________________________________________________\n", "permute (Permute) (None, 15, 2, 256) 0 \n", "_________________________________________________________________\n", "time_distributed (TimeDistri (None, 15, 512) 0 \n", "_________________________________________________________________\n", "bidirectional (Bidirectional (None, 15, 128) 221568 \n", "_________________________________________________________________\n", "bidirectional_1 (Bidirection (None, 15, 128) 74112 \n", "_________________________________________________________________\n", "dense (Dense) (None, 15, 525) 67725 \n", "=================================================================\n", "Total params: 1,539,501\n", "Trainable params: 1,537,581\n", "Non-trainable params: 1,920\n", "_________________________________________________________________\n" ] } ], "source": [ "base_model.summary()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "等伯今立 [478, 207, 114, 62] 等伯今立\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/python/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/matplotlib/font_manager.py:1241: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.\n", " (prop.get_family(), self.defaultFamily[fontext]))\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 201, "width": 1151 }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from PIL import Image, ImageFont, ImageDraw\n", "\n", "def random_color(start, end, opacity=None):\n", " '''\n", " 随机颜色函数,返回指定范围随机颜色值\n", " 参数:start:颜色最低值,end:颜色最高值\n", " '''\n", " red = random.randint(start, end)\n", " green = random.randint(start, end)\n", " blue = random.randint(start, end)\n", " if opacity is None:\n", " return (red, green, blue)\n", " return (red, green, blue, opacity)\n", "def random_xy(width,height): \n", " '''\n", " 随机位置函数,返回指定范围随机位置坐标\n", " 参数:width:图片宽,height:图片高\n", " '''\n", " x = random.randint(0, width)\n", " y = random.randint(0, height)\n", " return x, y\n", "\n", "table = []\n", "for i in range( 256 ):\n", " table.append( i * 1.97 )\n", " \n", "def create_captcha_image(chars, background, width=120, height=40):\n", " '''\n", " 生成验证码图片\n", " chars:要生成的字符串\n", " background:背景颜色\n", " '''\n", " image = Image.new('RGB', (width, height), color=background)\n", " draw = ImageDraw.Draw(image)\n", " def get_char_img(char,font,color,angle):\n", " '''\n", " 生成单个字符图片,随机颜色加随机旋转\n", " \n", " '''\n", " w, h = draw.textsize(char, font=font)\n", " im = Image.new('RGBA',(w,h), color=background)\n", " ImageDraw.Draw(im).text((0,0), char, font=font, fill=color)\n", " im = im.crop(im.getbbox())\n", " rot = im.rotate(angle,Image.BILINEAR,expand=1)\n", " bg = Image.new('RGBA',rot.size,background)\n", " im = Image.composite(rot, bg, rot)\n", " return im\n", " w_all = 0\n", " im_list = []\n", " w_list = []\n", " for c in chars:\n", " fonts = ['/usr/share/fonts/WindowsFonts/fonts/STXINGKA.TTF','/usr/share/fonts/WindowsFonts/fonts/simhei.ttf']\n", " font = ImageFont.truetype(font=random.choice(fonts), size=random.randint(18,20))\n", " char_img = get_char_img(char=c, font=font, color=random_color(0,90), angle=random.randint(0,0))\n", " w, h = char_img.size\n", " w_all += random.randint(0,5) \n", " w_list.append(w_all)\n", " im_list.append(char_img)\n", "# image.paste(char_img, (w_all,random.randint(0,image.size[1]-h)))\n", " w_all += w\n", " if w_all > width:\n", " image = Image.new('RGB', (w_all, height), color=background)\n", "\n", " for i in range(len(w_list)):\n", " image.paste(im_list[i], (w_list[i],random.randint(0,height-im_list[i].size[1])))\n", " return image.resize((width, height))\n", "\n", "def generate_image(random_str, width=120, height=40):\n", " '''\n", " 随机生成验证码,从四种字体随机抽取一种生成文字,加随机线干扰和点干扰\n", " 参数:random_str:要生成验证码的文字\n", " 返回:验证码图片\n", " ''' \n", "# image = Image.new(mode='RGB', size=(width, height), color=(255,255,255))\n", "# fonts = ['/usr/share/fonts/WindowsFonts/fonts/simsunb.ttf']\n", " fonts = ['/usr/share/fonts/WindowsFonts/fonts/ariali.ttf', '/usr/share/fonts/WindowsFonts/fonts/simhei.ttf',\n", " '/usr/share/fonts/WindowsFonts/fonts/simsunb.ttf', '/usr/share/fonts/WindowsFonts/fonts/calibri.ttf']\n", " font = ImageFont.truetype(font=random.choice(fonts), size=20)\n", " chars = random_str\n", " color = random_color(120,250)\n", " background = random_color(110,255)\n", " image = create_captcha_image(chars, background, width=width, height=height)\n", " draw = ImageDraw.Draw(image) \n", "# for _ in range(random.randint(5, 10)):\n", "# draw.line(xy=(random_xy(width,height),random_xy(width,height)),fill=random_color(80, 255))\n", " for _ in range(random.randint(100,150)):\n", " draw.point(xy=(random_xy(width,height)),fill=random_color(20, 250))\n", "# for _ in range(random.randint(50,80)):\n", "# x,y = random_xy(width,height)\n", "# draw.line(xy=(x,y,x+random.randint(-10,15),y+random.randint(-10,15)),fill=random_color(120, 255))\n", " \n", "# draw.text(xy=(random.randint(0,10),random.randint(0,2)),text= random_str, fill=text_fill, font=font)\n", "# len_t = len(random_str)\n", "# for i in range(len_t):\n", "# draw.text(xy=(random.randint(0,2)+i*int(width/len_t),random.randint(1,6)),text= random_str[i], \n", "# fill=random_color(0,180,opacity=80), font=font)\n", " \n", " return image.resize((120,40), Image.BILINEAR)\n", "\n", "random_str = ''.join([random.choice(characters) for j in range(random.randint(4,4))])\n", "label = [characters.find(x) for x in random_str]\n", "label_str = ''.join([characters[x] for x in label if x < len(characters)])\n", "print(random_str, label, label_str)\n", "img = generate_image(random_str, 100, 25) \n", "# img = generate_image('瓜用匆生')\n", "img2 = Image.open('Chinese/1da7be39-2189-11ea-b304-408d5cd36814_瓜用匆生.jpg')\n", "img2 = img2.resize((120,40), Image.BILINEAR)\n", "im = [img, img2]\n", "plt.figure(figsize=(20,10))\n", "for i in range(1,3): \n", " plt.subplot(2,2,i)\n", " plt.imshow(im[i-1])\n", "plt.show()\n", "\n", "# plt.imshow(img)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "用四匆匆\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 144, "width": 370 }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# 重组验证码\n", "def rebuild_img(path):\n", " '''\n", " 读取本地4-5位验证码图片进行裁剪分割为单个数字,从分割的字符随机抽取n个重组为新图片\n", " 参数:path:图片路径\n", " 返回:重组后图片\n", " '''\n", " label = path.split('_')[-1][:-4]\n", " if label.isalpha() and len(label) > 3:\n", " crop_n = len(label) \n", " img = Image.open(path)\n", " w, h = img.size\n", " fig_size = int(w/crop_n)\n", " fig_list = []\n", " new_label = []\n", " if crop_n == 4:\n", " for i in range(crop_n):\n", " fig_list.append(img.crop((i*fig_size+2, 2, (i+1)*fig_size-2, h-2 )))\n", " for i in range(crop_n):\n", " idx = random.randint(0,crop_n-1) # 修改为打乱顺序\n", " img.paste(fig_list[idx], (i*fig_size+2, 2, (i+1)*fig_size-2, h-2 ))\n", " new_label.append(label[idx])\n", " elif crop_n == 5: \n", " for i in range(crop_n):\n", " fig_list.append(img.crop((i*fig_size, 0, (i+1)*fig_size, h )))\n", " for i in range(crop_n):\n", " idx = random.randint(0,crop_n-1)\n", " img.paste(fig_list[idx], (i*fig_size, 0, (i+1)*fig_size, h ))\n", " new_label.append(label[idx])\n", " \n", " draw = ImageDraw.Draw(img) \n", " for _ in range(random.randint(0,50)): # 在重组的验证码图片上加噪声\n", " draw.point(xy=(random_xy(width,height)),fill=random_color(20, 250))\n", " \n", " return img.resize((120,40), Image.BILINEAR), ''.join(new_label)\n", "image, random_str = rebuild_img(random.choice(glob.glob('Chinese/*.jpg'))) \n", "print(random_str)\n", "plt.imshow(image)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "文件名:标签 字典大小 4092\n", "标签: 究旧当物\n" ] }, { "data": { "image/png": "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a3tzNZ+evrfkkeuCZcSJJ9I4O38byPUNAMqMIuIGUrxZaRQK+v/5nyBWsG0bzT2wdWsQKzGuQ9nZ3R/K5JAp7tnU9ADQ9JOf0PjQj388iE0fOZLm9tYx7nJz+Q+uuTwIDams7Ppy01xfdmyVGY0BNpJ9nWNstwJSiFw3YQLNjY0aReNbr7wyiI0wCpwbWSOQtbzhR08YGHczEREREZF+TINyEREREZGIaVAuIiIiIhIxDcpFRERERCKmQbmIiIiISMQGXfeV4pKSINbW0kJzs0g1dsE739nl17I6U2STdQAyv+NAX+pup4Zso7OEr62l8SHf/nYQO2BMe9+2YkUQa166lOauIVNQ5xvTVR88/3waPymNbREjx+zwq6+muaVGF6D8goIgZu2Pwdp9IxNUkONl77RpNLeeTAvet5NH966+Pg5Zp5VMPmZZZxELm27+aCqMLmPMU6sLso8AAAopSURBVAsXBrEWo0PGJHIsp9tlpdv72ujsVPDhD9N4YQYcA4VGh5NJ4PFMMPXUU4PY3vx8mruf3FP9vn00d+eUKTQ+4kuXBrF9S4z7YXs7jfcWPSkXEREREYmYBuUiIiIiIhHToFxEREREJGIalIuIiIiIRMx576Nehx7nnFtWObnilKtvvTjqVZF+7IZL+VTKP/szL/IRERGRwee+mx9B1abq17z3YdVqGvSkXEREREQkYhqUi4iIiIhETINyEREREZGIaVAuIiIiIhKxgVroeTArN2tIxbjSqFdF+rHKsgk0XlWzrY/XRERERDJV9Y5atLe2H/LeD+3OcgbqoHwLgFIAWwHMSIXXRrZCcqy07/o37b/+Tfuv/9K+69+0//qf4wDUeu8ndmchA3JQ3plzbhkAdLdNjfQ97bv+Tfuvf9P+67+07/o37b/BS58pFxERERGJmAblIiIiIiIR06BcRERERCRiGpSLiIiIiERMg3IRERERkYgN+O4rIiIiIiKZTk/KRUREREQipkG5iIiIiEjENCgXEREREYmYBuUiIiIiIhHToFxEREREJGIalIuIiIiIREyDchERERGRiA3YQblzbqxz7mfOud3OuRbn3Fbn3K3OuYqo122wc84Ndc59yDn3oHNuo3OuyTlX45x73jn3QeccPS6dc/Occw875w6lfmeFc+5m51xWX78H+XvOueuccz719SEj523OuadT+7reObfU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\n", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 144, "width": 370 }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def get_label_dic(label_file):\n", " '''通过文件名=标签 文件重构 名字:标签 字典'''\n", " from collections import defaultdict\n", " label_dic = defaultdict(str)\n", " with open(label_file, encoding='utf-8') as f:\n", " lines = f.readlines()\n", " for line in lines:\n", " result = line.split('=')[-1].strip()\n", " name = line.split('=')[0].strip()\n", " if len(result) != 4:\n", " continue\n", " else: \n", " label_dic[name] = result\n", " return label_dic\n", "\n", "label_dic = get_label_dic('/data/captcha/total_chinese/total_chinese.txt')\n", "print('文件名:标签 字典大小',len(label_dic))\n", "\n", "def smartSliceImg(img_path, label_dic, count=4, p_w=3):\n", " '''\n", " :param img:\n", " :param outDir:\n", " :param count: 图片中有多少个图片\n", " :param p_w: 对切割地方多少像素内进行判断\n", " :return:\n", " '''\n", " img = Image.open(img_path)\n", " w, h = img.size\n", " pixdata = img.load()\n", " eachWidth = int(w / count)\n", " beforeX = 1\n", " name = img_path.split('/')[-1][:-4]\n", " label = label_dic.get(name, None)\n", " if not label or re.search('[\\u4e00-\\u9fa5]', label)==None:\n", " print(label)\n", " return\n", "\n", " imgs = []\n", " for i in range(count):\n", " allBCount = []\n", " nextXOri = (i + 1) * eachWidth\n", "\n", " for x in range(nextXOri - p_w, nextXOri + p_w):\n", " if x >= w:\n", " x = w - 1\n", " if x < 0:\n", " x = 0\n", " b_count = 1\n", " for y in range(h):\n", "# if pixdata[x,y]==pixdata[x,2]:\n", " if pixdata[x,y][0]==pixdata[x,y][1]==pixdata[x,y][2]:\n", " b_count += 1\n", " allBCount.append({'x_pos': x, 'count': b_count})\n", " sort = sorted(allBCount, key=lambda e: e.get('count'), reverse=True)\n", "# print(allBCount)\n", "# print(sort)\n", " nextX = sort[0]['x_pos'] if sort[0]['x_pos']" ] }, "metadata": { "image/png": { "height": 144, "width": 370 }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# 测试生成器\n", "# import matplotlib\n", "# # matplotlib.use('qt4agg')\n", "# #指定默认字体\n", "# matplotlib.rcParams['font.sans-serif'] = ['SimHei']\n", "# matplotlib.rcParams['font.family']='sans-serif'\n", "# #解决负号'-'显示为方块的问题\n", "# matplotlib.rcParams['axes.unicode_minus'] = False\n", "\n", "data = CaptchaSequence(characters, batch_size=10, steps=1)\n", "[X_test, y_test, input_length, label_length], _ = data[0]\n", "idx =3\n", "plt.imshow(X_test[idx])\n", "print(''.join([characters[x] for x in y_test[idx]]))\n", "print(y_test[idx])\n", "# print(''.join([characters[x] for x in y_test[idx] if x < len(characters)]))\n", "# plt.title(''.join([characters[x] for x in y_test[idx] if x < len(characters)]))\n", "# print(input_length, label_length)\n", "# print(y_test)\n", "# print(X_test.shape)\n", "# print(n_class)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "于话重胜\n" ] } ], "source": [ "# # 从现有图片生成测试数据\n", "# def get_data(img_path):\n", "# img = Image.open(img_path)\n", "# # img = img.crop((0, height-25, width, height))\n", "# w, h = img.size\n", "# data = np.zeros((1,h, w, 3))\n", "# data[0] = np.array(img)/255.0\n", "# return data\n", "# img_path = '../FileInfo/ffc510f4-f977-11e9-b970-408d5cd36814_5802.jpg'\n", "\n", "# data = get_data(img_path)\n", "# print(data.shape)\n", "# plt.imshow(data[0])\n", "print(''.join([characters[x] for x in [307, 390, 401, 229]]))" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "# 准确率回调函数\n", "from tqdm import tqdm\n", "\n", "def evaluate(model, batch_size=128, steps=1):\n", " '''\n", " 准确率验证函数,每批次的验证码长度必须一致\n", " ''' \n", " batch_acc = 0\n", " valid_data = CaptchaSequence(characters, batch_size, steps)\n", " for i in range(len(valid_data)):\n", " [X_test, y_test, _, _], _ = valid_data[i]\n", " y_pred = base_model.predict(X_test)\n", " shape = y_pred.shape\n", " # out = K.get_value(K.ctc_decode(y_pred, input_length=np.ones(shape[0])*shape[1],)[0][0])[:, :4]\n", " out = K.get_value(K.ctc_decode(y_pred, input_length=np.ones(shape[0])*shape[1],)[0][0])[:, :]\n", " # print(y_test)\n", " # print(type(y_test))\n", " # print(y_test[y_test<10, axis=1])\n", " # print(out)\n", " if out.shape[1] >= 4:\n", " batch_acc += (y_test[:,:out.shape[1]] == out).all(axis=1).mean()\n", " return batch_acc / steps" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.27000000000000002" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# model.load_weights('digit4to6_ctc_best2.h5')\n", "evaluate(base_model,batch_size=1, steps=10)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.callbacks import Callback\n", "\n", "class Evaluate(Callback):\n", " '''\n", " 准确率验证的类,每批次的验证码长度必须一致\n", " ''' \n", " def __init__(self):\n", " self.accs = []\n", " \n", " def on_epoch_end(self, epoch, logs=None):\n", " logs = logs or {}\n", " acc = evaluate(base_model, batch_size=128) # evaluate(base_model)\n", " logs['val_acc'] = acc\n", " self.accs.append(acc)\n", " print('\\nacc%.4f'%acc)\n", "# print(f'\\nacc: {acc*100:.4f}')" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/200\n", "1000/1000 [==============================] - 262s 262ms/step - loss: 23.9300 - val_loss: 22.1291\n", "Epoch 2/200\n", "1000/1000 [==============================] - 266s 266ms/step - loss: 20.2433 - val_loss: 19.9841\n", "Epoch 3/200\n", "1000/1000 [==============================] - 264s 264ms/step - loss: 19.5101 - val_loss: 18.1271\n", "Epoch 4/200\n", "1000/1000 [==============================] - 270s 270ms/step - loss: 15.8576 - val_loss: 13.6020\n", "Epoch 5/200\n", "1000/1000 [==============================] - 251s 251ms/step - loss: 11.2304 - val_loss: 10.5907\n", "Epoch 6/200\n", "1000/1000 [==============================] - 253s 253ms/step - loss: 7.7945 - val_loss: 6.8276\n", "Epoch 7/200\n", "1000/1000 [==============================] - 249s 249ms/step - loss: 5.0638 - val_loss: 4.8995\n", "Epoch 8/200\n", "1000/1000 [==============================] - 269s 269ms/step - loss: 3.2676 - val_loss: 3.1209\n", "Epoch 9/200\n", "1000/1000 [==============================] - 259s 259ms/step - loss: 2.2798 - val_loss: 2.4022\n", "Epoch 10/200\n", "1000/1000 [==============================] - 268s 268ms/step - loss: 1.6577 - val_loss: 1.5855\n", "Epoch 11/200\n", "1000/1000 [==============================] - 258s 258ms/step - loss: 1.3260 - val_loss: 1.3435\n", "Epoch 12/200\n", "1000/1000 [==============================] - 263s 263ms/step - loss: 1.0780 - val_loss: 1.1741\n", "Epoch 13/200\n", "1000/1000 [==============================] - 262s 262ms/step - loss: 0.9467 - val_loss: 0.9290\n", "Epoch 14/200\n", "1000/1000 [==============================] - 262s 262ms/step - loss: 0.8385 - val_loss: 0.7924\n", "Epoch 15/200\n", "1000/1000 [==============================] - 248s 248ms/step - loss: 0.7515 - val_loss: 0.7596\n", "Epoch 16/200\n", "1000/1000 [==============================] - 222s 222ms/step - loss: 0.6868 - val_loss: 0.6856\n", "Epoch 17/200\n", "1000/1000 [==============================] - 219s 219ms/step - loss: 0.6275 - val_loss: 0.6722\n", "Epoch 18/200\n", "1000/1000 [==============================] - 250s 250ms/step - loss: 0.6068 - val_loss: 0.6041\n", "Epoch 19/200\n", "1000/1000 [==============================] - 256s 256ms/step - loss: 0.5443 - val_loss: 0.7427\n", "Epoch 20/200\n", "1000/1000 [==============================] - 247s 247ms/step - loss: 0.5192 - val_loss: 0.6104\n", "Epoch 21/200\n", "1000/1000 [==============================] - 192s 192ms/step - loss: 0.5181 - val_loss: 0.5642\n", "Epoch 22/200\n", "1000/1000 [==============================] - 175s 175ms/step - loss: 0.4950 - val_loss: 0.4901\n", "Epoch 23/200\n", "1000/1000 [==============================] - 179s 179ms/step - loss: 0.4738 - val_loss: 0.8496\n", "Epoch 24/200\n", "1000/1000 [==============================] - 179s 179ms/step - loss: 0.4547 - val_loss: 0.4348\n", "Epoch 25/200\n", "1000/1000 [==============================] - 178s 178ms/step - loss: 0.4420 - val_loss: 0.5450\n", "Epoch 26/200\n", "1000/1000 [==============================] - 197s 197ms/step - loss: 0.4077 - val_loss: 0.5357\n", "Epoch 27/200\n", "1000/1000 [==============================] - 179s 179ms/step - loss: 0.4126 - val_loss: 0.3803\n", "Epoch 28/200\n", "1000/1000 [==============================] - 194s 194ms/step - loss: 0.3915 - val_loss: 0.4115\n", "Epoch 29/200\n", "1000/1000 [==============================] - 187s 187ms/step - loss: 0.3893 - val_loss: 0.4076\n", "Epoch 30/200\n", "1000/1000 [==============================] - 171s 171ms/step - loss: 0.3695 - val_loss: 0.4259\n", "Epoch 31/200\n", "1000/1000 [==============================] - 183s 183ms/step - loss: 0.3677 - val_loss: 0.4213\n", "Epoch 32/200\n", "1000/1000 [==============================] - 176s 176ms/step - loss: 0.3579 - val_loss: 1.5800\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Evaluate()\n", "# 模型训练\n", "from tensorflow.keras.callbacks import EarlyStopping, CSVLogger, ModelCheckpoint\n", "from tensorflow.keras.optimizers import *\n", "# model.load_weights('digit4to6_ctc_best.h5')\n", "\n", "train_data = CaptchaSequence(characters, batch_size=128, steps=1000) # (characters, batch_size=128, steps=1000)\n", "valid_data = CaptchaSequence(characters, batch_size=128, steps=100) # (characters, batch_size=128, steps=100)\n", "# callbacks = [EarlyStopping(patience=5), Evaluate(), \n", "# CSVLogger('ctc.csv'), ModelCheckpoint('ctc_best.h5', save_best_only=True)]\n", "callbacks = [EarlyStopping(patience=5),ModelCheckpoint('gru_chinese524char_ctc_best.h5', save_best_only=True)]\n", "model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=Adam(1e-3, amsgrad=True))\n", "# model.fit_generator(train_data, epochs=100, validation_data=valid_data,\n", "# callbacks=callbacks)\n", "model.fit_generator(train_data, epochs=200, validation_data=valid_data, workers=4, use_multiprocessing=True,\n", " callbacks=callbacks)\n", "\n", "# 20200721 gru_chinese524char_ctc_best.h5 训练32个epoch从 loss: 23.9300 - val_loss: 22.1291 下降到 loss: 0.3677 - val_loss: 0.4213" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/200\n", "1000/1000 [==============================] - 367s 367ms/step - loss: 0.0241 - val_loss: 0.0232\n", "Epoch 2/200\n", "1000/1000 [==============================] - 349s 349ms/step - loss: 0.0222 - val_loss: 0.0208\n", "Epoch 3/200\n", "1000/1000 [==============================] - 348s 348ms/step - loss: 0.0197 - val_loss: 0.0258\n", "Epoch 4/200\n", "1000/1000 [==============================] - 350s 350ms/step - loss: 0.0215 - val_loss: 0.0204\n", "Epoch 5/200\n", "1000/1000 [==============================] - 350s 350ms/step - loss: 0.0184 - val_loss: 0.0273\n", "Epoch 6/200\n", "1000/1000 [==============================] - 342s 342ms/step - loss: 0.0192 - val_loss: 0.0197\n", "Epoch 7/200\n", "1000/1000 [==============================] - 355s 355ms/step - loss: 0.0204 - val_loss: 0.0209\n", "Epoch 8/200\n", "1000/1000 [==============================] - 350s 350ms/step - loss: 0.0208 - val_loss: 0.0158\n", "Epoch 9/200\n", "1000/1000 [==============================] - 351s 351ms/step - loss: 0.0190 - val_loss: 0.0159\n", "Epoch 10/200\n", "1000/1000 [==============================] - 352s 352ms/step - loss: 0.0178 - val_loss: 0.0205\n", "Epoch 11/200\n", "1000/1000 [==============================] - 354s 354ms/step - loss: 0.0187 - val_loss: 0.0192\n", "Epoch 12/200\n", "1000/1000 [==============================] - 351s 351ms/step - loss: 0.0188 - val_loss: 0.0145\n", "Epoch 13/200\n", "1000/1000 [==============================] - 347s 347ms/step - loss: 0.0188 - val_loss: 0.0184\n", "Epoch 14/200\n", "1000/1000 [==============================] - 350s 350ms/step - loss: 0.0197 - val_loss: 0.0283\n", "Epoch 15/200\n", "1000/1000 [==============================] - 345s 345ms/step - loss: 0.0198 - val_loss: 0.0207\n", "Epoch 16/200\n", "1000/1000 [==============================] - 346s 346ms/step - loss: 0.0157 - val_loss: 0.0175\n", "Epoch 17/200\n", "1000/1000 [==============================] - 361s 361ms/step - loss: 0.0160 - val_loss: 0.0199\n", "Epoch 18/200\n", "1000/1000 [==============================] - 342s 342ms/step - loss: 0.0165 - val_loss: 0.0142\n", "Epoch 19/200\n", "1000/1000 [==============================] - 338s 338ms/step - loss: 0.0156 - val_loss: 0.0164\n", "Epoch 20/200\n", "1000/1000 [==============================] - 344s 344ms/step - loss: 0.0164 - val_loss: 0.0162\n", "Epoch 21/200\n", "1000/1000 [==============================] - 347s 347ms/step - loss: 0.0164 - val_loss: 0.0176\n", "Epoch 22/200\n", "1000/1000 [==============================] - 339s 339ms/step - loss: 0.0162 - val_loss: 0.0165\n", "Epoch 23/200\n", "1000/1000 [==============================] - 348s 348ms/step - loss: 0.0167 - val_loss: 0.0145\n", "Epoch 24/200\n", "1000/1000 [==============================] - 338s 338ms/step - loss: 0.0163 - val_loss: 0.0156\n", "Epoch 25/200\n", "1000/1000 [==============================] - 335s 335ms/step - loss: 0.0148 - val_loss: 0.0147\n", "Epoch 26/200\n", "1000/1000 [==============================] - 344s 344ms/step - loss: 0.0149 - val_loss: 0.0138\n", "Epoch 27/200\n", "1000/1000 [==============================] - 437s 437ms/step - loss: 0.0149 - val_loss: 0.0140\n", "Epoch 28/200\n", "1000/1000 [==============================] - 440s 440ms/step - loss: 0.0147 - val_loss: 0.0223\n", "Epoch 29/200\n", "1000/1000 [==============================] - 368s 368ms/step - loss: 0.0155 - val_loss: 0.0136\n", "Epoch 30/200\n", "1000/1000 [==============================] - 375s 375ms/step - loss: 0.0161 - val_loss: 0.0120\n", "Epoch 31/200\n", "1000/1000 [==============================] - 351s 351ms/step - loss: 0.0133 - val_loss: 0.0126\n", "Epoch 32/200\n", "1000/1000 [==============================] - 346s 346ms/step - loss: 0.0146 - val_loss: 0.0219\n", "Epoch 33/200\n", "1000/1000 [==============================] - 359s 359ms/step - loss: 0.0155 - val_loss: 0.0174\n", "Epoch 34/200\n", "1000/1000 [==============================] - 359s 359ms/step - loss: 0.0143 - val_loss: 0.0145\n", "Epoch 35/200\n", "1000/1000 [==============================] - 372s 372ms/step - loss: 0.0154 - val_loss: 0.0161\n", "Epoch 36/200\n", "1000/1000 [==============================] - 351s 351ms/step - loss: 0.0152 - val_loss: 0.0128\n", "Epoch 37/200\n", "1000/1000 [==============================] - 359s 359ms/step - loss: 0.0155 - val_loss: 0.0141\n", "Epoch 38/200\n", "1000/1000 [==============================] - 335s 335ms/step - loss: 0.0143 - val_loss: 0.0132\n", "Epoch 39/200\n", "1000/1000 [==============================] - 403s 403ms/step - loss: 0.0125 - val_loss: 0.0118\n", "Epoch 40/200\n", "1000/1000 [==============================] - 342s 342ms/step - loss: 0.0135 - val_loss: 0.0131\n", "Epoch 41/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0125 - val_loss: 0.0145\n", "Epoch 42/200\n", "1000/1000 [==============================] - 330s 330ms/step - loss: 0.0134 - val_loss: 0.0134\n", "Epoch 43/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0126 - val_loss: 0.0117\n", "Epoch 44/200\n", "1000/1000 [==============================] - 330s 330ms/step - loss: 0.0122 - val_loss: 0.0117\n", "Epoch 45/200\n", "1000/1000 [==============================] - 328s 328ms/step - loss: 0.0121 - val_loss: 0.0093\n", "Epoch 46/200\n", "1000/1000 [==============================] - 332s 332ms/step - loss: 0.0120 - val_loss: 0.0099\n", "Epoch 47/200\n", "1000/1000 [==============================] - 342s 342ms/step - loss: 0.0118 - val_loss: 0.0118\n", "Epoch 48/200\n", "1000/1000 [==============================] - 336s 336ms/step - loss: 0.0112 - val_loss: 0.0145\n", "Epoch 49/200\n", "1000/1000 [==============================] - 333s 333ms/step - loss: 0.0134 - val_loss: 0.0146\n", "Epoch 50/200\n", "1000/1000 [==============================] - 342s 342ms/step - loss: 0.0129 - val_loss: 0.0110\n", "Epoch 51/200\n", "1000/1000 [==============================] - 329s 329ms/step - loss: 0.0119 - val_loss: 0.0147\n", "Epoch 52/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0108 - val_loss: 0.0152\n", "Epoch 53/200\n", "1000/1000 [==============================] - 357s 357ms/step - loss: 0.0137 - val_loss: 0.0138\n", "Epoch 54/200\n", "1000/1000 [==============================] - 345s 345ms/step - loss: 0.0111 - val_loss: 0.0095\n", "Epoch 55/200\n", "1000/1000 [==============================] - 332s 332ms/step - loss: 0.0112 - val_loss: 0.0168\n", "Epoch 56/200\n", "1000/1000 [==============================] - 328s 328ms/step - loss: 0.0119 - val_loss: 0.0178\n", "Epoch 57/200\n", "1000/1000 [==============================] - 328s 328ms/step - loss: 0.0129 - val_loss: 0.0117\n", "Epoch 58/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0140 - val_loss: 0.0115\n", "Epoch 59/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0125 - val_loss: 0.0108\n", "Epoch 60/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0118 - val_loss: 0.0134\n", "Epoch 61/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0117 - val_loss: 0.0089\n", "Epoch 62/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0108 - val_loss: 0.0093\n", "Epoch 63/200\n", "1000/1000 [==============================] - 328s 328ms/step - loss: 0.0141 - val_loss: 0.0121\n", "Epoch 64/200\n", "1000/1000 [==============================] - 329s 329ms/step - loss: 0.0122 - val_loss: 0.0137\n", "Epoch 65/200\n", "1000/1000 [==============================] - 331s 331ms/step - loss: 0.0139 - val_loss: 0.0141\n", "Epoch 66/200\n", "1000/1000 [==============================] - 329s 329ms/step - loss: 0.0118 - val_loss: 0.0100\n", "Epoch 67/200\n", "1000/1000 [==============================] - 328s 328ms/step - loss: 0.0120 - val_loss: 0.0118\n", "Epoch 68/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0107 - val_loss: 0.0092\n", "Epoch 69/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0094 - val_loss: 0.0097\n", "Epoch 70/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0110 - val_loss: 0.0095\n", "Epoch 71/200\n", "1000/1000 [==============================] - 331s 331ms/step - loss: 0.0105 - val_loss: 0.0088\n", "Epoch 72/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0102 - val_loss: 0.0100\n", "Epoch 73/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0103 - val_loss: 0.0082\n", "Epoch 74/200\n", "1000/1000 [==============================] - 323s 323ms/step - loss: 0.0103 - val_loss: 0.0082\n", "Epoch 75/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0104 - val_loss: 0.0080\n", "Epoch 76/200\n", "1000/1000 [==============================] - 324s 324ms/step - loss: 0.0095 - val_loss: 0.0068\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 77/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0121 - val_loss: 0.0098\n", "Epoch 78/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0100 - val_loss: 0.0085\n", "Epoch 79/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0100 - val_loss: 0.0104\n", "Epoch 80/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0123 - val_loss: 0.0102\n", "Epoch 81/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0108 - val_loss: 0.0097\n", "Epoch 82/200\n", "1000/1000 [==============================] - 324s 324ms/step - loss: 0.0093 - val_loss: 0.0071\n", "Epoch 83/200\n", "1000/1000 [==============================] - 328s 328ms/step - loss: 0.0096 - val_loss: 0.0076\n", "Epoch 84/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0086 - val_loss: 0.0095\n", "Epoch 85/200\n", "1000/1000 [==============================] - 328s 328ms/step - loss: 0.0101 - val_loss: 0.0119\n", "Epoch 86/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0107 - val_loss: 0.0099\n", "Epoch 87/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0101 - val_loss: 0.0078\n", "Epoch 88/200\n", "1000/1000 [==============================] - 349s 349ms/step - loss: 0.0106 - val_loss: 0.0085\n", "Epoch 89/200\n", "1000/1000 [==============================] - 339s 339ms/step - loss: 0.0103 - val_loss: 0.0109\n", "Epoch 90/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0094 - val_loss: 0.0071\n", "Epoch 91/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0111 - val_loss: 0.0082\n", "Epoch 92/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0085 - val_loss: 0.0118\n", "Epoch 93/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0092 - val_loss: 0.0092\n", "Epoch 94/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0114 - val_loss: 0.0092\n", "Epoch 95/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0089 - val_loss: 0.0089\n", "Epoch 96/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0096 - val_loss: 0.0139\n", "Epoch 97/200\n", "1000/1000 [==============================] - 328s 328ms/step - loss: 0.0095 - val_loss: 0.0089\n", "Epoch 98/200\n", "1000/1000 [==============================] - 324s 324ms/step - loss: 0.0110 - val_loss: 0.0092\n", "Epoch 99/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0104 - val_loss: 0.0091\n", "Epoch 100/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0089 - val_loss: 0.0097\n", "Epoch 101/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0090 - val_loss: 0.0089\n", "Epoch 102/200\n", "1000/1000 [==============================] - 324s 324ms/step - loss: 0.0097 - val_loss: 0.0104\n", "Epoch 103/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0091 - val_loss: 0.0066\n", "Epoch 104/200\n", "1000/1000 [==============================] - 336s 336ms/step - loss: 0.0088 - val_loss: 0.0087\n", "Epoch 105/200\n", "1000/1000 [==============================] - 335s 335ms/step - loss: 0.0088 - val_loss: 0.0094\n", "Epoch 106/200\n", "1000/1000 [==============================] - 333s 333ms/step - loss: 0.0085 - val_loss: 0.0110\n", "Epoch 107/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0096 - val_loss: 0.0090\n", "Epoch 108/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0088 - val_loss: 0.0088\n", "Epoch 109/200\n", "1000/1000 [==============================] - 324s 324ms/step - loss: 0.0104 - val_loss: 0.0098\n", "Epoch 110/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0094 - val_loss: 0.0092\n", "Epoch 111/200\n", "1000/1000 [==============================] - 324s 324ms/step - loss: 0.0081 - val_loss: 0.0071\n", "Epoch 112/200\n", "1000/1000 [==============================] - 323s 323ms/step - loss: 0.0094 - val_loss: 0.0087\n", "Epoch 113/200\n", "1000/1000 [==============================] - 326s 326ms/step - loss: 0.0089 - val_loss: 0.0106\n", "Epoch 114/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0104 - val_loss: 0.0125\n", "Epoch 115/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0113 - val_loss: 0.0077\n", "Epoch 116/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0099 - val_loss: 0.0071\n", "Epoch 117/200\n", "1000/1000 [==============================] - 325s 325ms/step - loss: 0.0111 - val_loss: 0.0104\n", "Epoch 118/200\n", "1000/1000 [==============================] - 328s 328ms/step - loss: 0.0113 - val_loss: 0.0069\n", "Epoch 119/200\n", "1000/1000 [==============================] - 327s 327ms/step - loss: 0.0085 - val_loss: 0.0073\n", "Epoch 120/200\n", "1000/1000 [==============================] - 331s 331ms/step - loss: 0.0092 - val_loss: 0.0101\n", "Epoch 121/200\n", "1000/1000 [==============================] - 330s 330ms/step - loss: 0.0096 - val_loss: 0.0083\n", "Epoch 122/200\n", "1000/1000 [==============================] - 354s 354ms/step - loss: 0.0090 - val_loss: 0.0084\n", "Epoch 123/200\n", "1000/1000 [==============================] - 340s 340ms/step - loss: 0.0089 - val_loss: 0.0090\n", "Epoch 124/200\n", "1000/1000 [==============================] - 349s 349ms/step - loss: 0.0085 - val_loss: 0.0083\n", "Epoch 125/200\n", "1000/1000 [==============================] - 386s 386ms/step - loss: 0.0098 - val_loss: 0.0081\n", "Epoch 126/200\n", "1000/1000 [==============================] - 367s 367ms/step - loss: 0.0090 - val_loss: 0.0113\n", "Epoch 127/200\n", "1000/1000 [==============================] - 376s 376ms/step - loss: 0.0095 - val_loss: 0.0107\n", "Epoch 128/200\n", "1000/1000 [==============================] - 374s 374ms/step - loss: 0.0097 - val_loss: 0.0110\n", "Epoch 129/200\n", "1000/1000 [==============================] - 396s 396ms/step - loss: 0.0080 - val_loss: 0.0081\n", "Epoch 130/200\n", "1000/1000 [==============================] - 389s 389ms/step - loss: 0.0076 - val_loss: 0.0093\n", "Epoch 131/200\n", "1000/1000 [==============================] - 417s 417ms/step - loss: 0.0082 - val_loss: 0.0121\n", "Epoch 132/200\n", "1000/1000 [==============================] - 436s 436ms/step - loss: 0.0081 - val_loss: 0.0079\n", "Epoch 133/200\n", "1000/1000 [==============================] - 448s 448ms/step - loss: 0.0116 - val_loss: 0.0092\n", "Epoch 134/200\n", "1000/1000 [==============================] - 412s 412ms/step - loss: 0.0083 - val_loss: 0.0074\n", "Epoch 135/200\n", "1000/1000 [==============================] - 439s 439ms/step - loss: 0.0089 - val_loss: 0.0102\n", "Epoch 136/200\n", "1000/1000 [==============================] - 265s 265ms/step - loss: 0.0082 - val_loss: 0.0087\n", "Epoch 137/200\n", "1000/1000 [==============================] - 222s 222ms/step - loss: 0.0076 - val_loss: 0.0088\n", "Epoch 138/200\n", "1000/1000 [==============================] - 236s 236ms/step - loss: 0.0088 - val_loss: 0.0069\n", "Epoch 139/200\n", "1000/1000 [==============================] - 219s 219ms/step - loss: 0.0078 - val_loss: 0.0076\n", "Epoch 140/200\n", "1000/1000 [==============================] - 212s 212ms/step - loss: 0.0104 - val_loss: 0.0080\n", "Epoch 141/200\n", "1000/1000 [==============================] - 203s 203ms/step - loss: 0.0083 - val_loss: 0.0087\n", "Epoch 142/200\n", "1000/1000 [==============================] - 189s 189ms/step - loss: 0.0105 - val_loss: 0.0109\n", "Epoch 143/200\n", "1000/1000 [==============================] - 217s 217ms/step - loss: 0.0093 - val_loss: 0.0066\n", "Epoch 144/200\n", "1000/1000 [==============================] - 274s 274ms/step - loss: 0.0093 - val_loss: 0.0085\n", "Epoch 145/200\n", "1000/1000 [==============================] - 280s 280ms/step - loss: 0.0085 - val_loss: 0.0069\n", "Epoch 146/200\n", "1000/1000 [==============================] - 254s 254ms/step - loss: 0.0074 - val_loss: 0.0075\n", "Epoch 147/200\n", "1000/1000 [==============================] - 268s 268ms/step - loss: 0.0086 - val_loss: 0.0139\n", "Epoch 148/200\n", "1000/1000 [==============================] - 273s 273ms/step - loss: 0.0078 - val_loss: 0.0109\n", "Epoch 149/200\n", "1000/1000 [==============================] - 274s 274ms/step - loss: 0.0084 - val_loss: 0.0079\n", "Epoch 150/200\n", "1000/1000 [==============================] - 284s 284ms/step - loss: 0.0086 - val_loss: 0.0075\n", "Epoch 151/200\n", "1000/1000 [==============================] - 280s 280ms/step - loss: 0.0089 - val_loss: 0.0062\n", "Epoch 152/200\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1000/1000 [==============================] - 284s 284ms/step - loss: 0.0085 - val_loss: 0.0123\n", "Epoch 153/200\n", "1000/1000 [==============================] - 249s 249ms/step - loss: 0.0082 - val_loss: 0.0068\n", "Epoch 154/200\n", "1000/1000 [==============================] - 263s 263ms/step - loss: 0.0085 - val_loss: 0.0081\n", "Epoch 155/200\n", "1000/1000 [==============================] - 270s 270ms/step - loss: 0.0082 - val_loss: 0.0083\n", "Epoch 156/200\n", "1000/1000 [==============================] - 255s 255ms/step - loss: 0.0066 - val_loss: 0.0068\n", "Epoch 157/200\n", "1000/1000 [==============================] - 269s 269ms/step - loss: 0.0070 - val_loss: 0.0060\n", "Epoch 158/200\n", "1000/1000 [==============================] - 273s 273ms/step - loss: 0.0065 - val_loss: 0.0132\n", "Epoch 159/200\n", "1000/1000 [==============================] - 255s 255ms/step - loss: 0.0069 - val_loss: 0.0054\n", "Epoch 160/200\n", "1000/1000 [==============================] - 270s 270ms/step - loss: 0.0074 - val_loss: 0.0068\n", "Epoch 161/200\n", "1000/1000 [==============================] - 257s 257ms/step - loss: 0.0069 - val_loss: 0.0086\n", "Epoch 162/200\n", "1000/1000 [==============================] - 264s 264ms/step - loss: 0.0076 - val_loss: 0.0062\n", "Epoch 163/200\n", "1000/1000 [==============================] - 260s 260ms/step - loss: 0.0076 - val_loss: 0.0072\n", "Epoch 164/200\n", "1000/1000 [==============================] - 259s 259ms/step - loss: 0.0078 - val_loss: 0.0089\n", "Epoch 165/200\n", "1000/1000 [==============================] - 247s 247ms/step - loss: 0.0080 - val_loss: 0.0064\n", "Epoch 166/200\n", "1000/1000 [==============================] - 272s 272ms/step - loss: 0.0069 - val_loss: 0.0081\n", "Epoch 167/200\n", "1000/1000 [==============================] - 271s 271ms/step - loss: 0.0069 - val_loss: 0.0067\n", "Epoch 168/200\n", "1000/1000 [==============================] - 269s 269ms/step - loss: 0.0071 - val_loss: 0.0056\n", "Epoch 169/200\n", "1000/1000 [==============================] - 271s 271ms/step - loss: 0.0073 - val_loss: 0.0048\n", "Epoch 170/200\n", "1000/1000 [==============================] - 259s 259ms/step - loss: 0.0071 - val_loss: 0.0080\n", "Epoch 171/200\n", "1000/1000 [==============================] - 274s 274ms/step - loss: 0.0083 - val_loss: 0.0073\n", "Epoch 172/200\n", "1000/1000 [==============================] - 276s 276ms/step - loss: 0.0068 - val_loss: 0.0064\n", "Epoch 173/200\n", "1000/1000 [==============================] - 265s 265ms/step - loss: 0.0069 - val_loss: 0.0068\n", "Epoch 174/200\n", "1000/1000 [==============================] - 262s 262ms/step - loss: 0.0064 - val_loss: 0.0076\n", "Epoch 175/200\n", "1000/1000 [==============================] - 271s 271ms/step - loss: 0.0083 - val_loss: 0.0070\n", "Epoch 176/200\n", "1000/1000 [==============================] - 278s 278ms/step - loss: 0.0080 - val_loss: 0.0113\n", "Epoch 177/200\n", "1000/1000 [==============================] - 275s 275ms/step - loss: 0.0067 - val_loss: 0.0098\n", "Epoch 178/200\n", "1000/1000 [==============================] - 230s 230ms/step - loss: 0.0064 - val_loss: 0.0053\n", "Epoch 179/200\n", "1000/1000 [==============================] - 182s 182ms/step - loss: 0.0063 - val_loss: 0.0063\n", "Epoch 180/200\n", "1000/1000 [==============================] - 175s 175ms/step - loss: 0.0066 - val_loss: 0.0067\n", "Epoch 181/200\n", "1000/1000 [==============================] - 182s 182ms/step - loss: 0.0068 - val_loss: 0.0082\n", "Epoch 182/200\n", "1000/1000 [==============================] - 172s 172ms/step - loss: 0.0078 - val_loss: 0.0068\n", "Epoch 183/200\n", "1000/1000 [==============================] - 188s 188ms/step - loss: 0.0074 - val_loss: 0.0063\n", "Epoch 184/200\n", "1000/1000 [==============================] - 182s 182ms/step - loss: 0.0066 - val_loss: 0.0084\n", "Epoch 185/200\n", "1000/1000 [==============================] - 172s 172ms/step - loss: 0.0066 - val_loss: 0.0067\n", "Epoch 186/200\n", "1000/1000 [==============================] - 193s 193ms/step - loss: 0.0066 - val_loss: 0.0054\n", "Epoch 187/200\n", "1000/1000 [==============================] - 179s 179ms/step - loss: 0.0083 - val_loss: 0.0054\n", "Epoch 188/200\n", "1000/1000 [==============================] - 194s 194ms/step - loss: 0.0071 - val_loss: 0.0089\n", "Epoch 189/200\n", "1000/1000 [==============================] - 194s 194ms/step - loss: 0.0064 - val_loss: 0.0085\n", "Epoch 190/200\n", "1000/1000 [==============================] - 180s 180ms/step - loss: 0.0072 - val_loss: 0.0077\n", "Epoch 191/200\n", "1000/1000 [==============================] - 203s 203ms/step - loss: 0.0077 - val_loss: 0.0059\n", "Epoch 192/200\n", "1000/1000 [==============================] - 185s 185ms/step - loss: 0.0066 - val_loss: 0.0064\n", "Epoch 193/200\n", "1000/1000 [==============================] - 163s 163ms/step - loss: 0.0063 - val_loss: 0.0056\n", "Epoch 194/200\n", "1000/1000 [==============================] - 200s 200ms/step - loss: 0.0072 - val_loss: 0.0068\n", "Epoch 195/200\n", "1000/1000 [==============================] - 227s 227ms/step - loss: 0.0056 - val_loss: 0.0079\n", "Epoch 196/200\n", "1000/1000 [==============================] - 183s 183ms/step - loss: 0.0074 - val_loss: 0.0054\n", "Epoch 197/200\n", "1000/1000 [==============================] - 166s 166ms/step - loss: 0.0062 - val_loss: 0.0061\n", "Epoch 198/200\n", "1000/1000 [==============================] - 171s 171ms/step - loss: 0.0068 - val_loss: 0.0060\n", "Epoch 199/200\n", "1000/1000 [==============================] - 190s 190ms/step - loss: 0.0081 - val_loss: 0.0073\n", "Epoch 200/200\n", "1000/1000 [==============================] - 165s 165ms/step - loss: 0.0080 - val_loss: 0.0068\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 载入最好的模型继续训练一会\n", "from tensorflow.keras.callbacks import EarlyStopping, CSVLogger, ModelCheckpoint\n", "from tensorflow.keras.optimizers import *\n", "model.load_weights('gru_chinese524char_ctc_best.h5')\n", "train_data = CaptchaSequence(characters, batch_size=128, steps=1000) # (characters, batch_size=128, steps=1000)\n", "valid_data = CaptchaSequence(characters, batch_size=128, steps=100) # (characters, batch_size=128, steps=100)\n", "# callbacks = [EarlyStopping(patience=5),\n", "# CSVLogger('ctc.csv', append=True), ModelCheckpoint('ctc_best.h5', save_best_only=True)]\n", "callbacks = [CSVLogger('ctc.csv', append=True), ModelCheckpoint('gru_chinese524char_ctc_best.h5', save_best_only=True)]\n", "\n", "model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=Adam(1e-4, amsgrad=True))\n", "model.fit_generator(train_data, epochs=200, validation_data=valid_data, workers=4, use_multiprocessing=True,\n", " callbacks=callbacks)\n", "\n", "# 继续训练近200个epoch,模型gru_chinese524char_ctc_best.h5最终损失loss: 0.0361 - val_loss: 0.0320 四个字的验证码 调整生成验证码的颜色值\n", "#让背景色与与字体颜色有区分度,再跑200epoch从loss: 0.0361 - val_loss: 0.0320 降到loss: 0.0080 - val_loss: 0.0068" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# model.load_weights('ctc_best.h5')\n", "# base_model.save('gru_chinese_base_model.h5')\n", "base_model.save('gru_chinese524char_base_model.h5')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pred:得得第穿\n", "true:得第穿军\n", "pred:枪枪世代\n", "true:枪世代儿\n", "pred:前会准怕\n", "true:前会传怕\n", "总耗时: 25.031147241592407\n", "2557 3\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/python/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/matplotlib/font_manager.py:1241: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.\n", " (prop.get_family(), self.defaultFamily[fontext]))\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 171, "width": 370 }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# 测试模型\n", "# model.load_weights('gru_chinese524char_ctc_best.h5')\n", "characters2 = characters + ' '\n", "import time\n", "import re\n", "def get_test_data():\n", " '''\n", " 从本地获取验证码图片并生成测试数据\n", " ''' \n", " X = []\n", " Y = []\n", " for path in glob.glob('/data/captcha/total_chinese/*.jpg'): # Digit5/*.jpg #Chinese/*.jpg /data/captcha/total_chinese/*.jpg\n", "# random_str = path.split('_')[-1][:-4] # #Chinese/*.jpg\n", " name = path.split('/')[-1].strip()[:-4]\n", " random_str = label_dic.get(name, None)\n", " if not random_str:\n", " continue\n", " if random_str.isalpha() and len(random_str) ==4:\n", " random_str = random_str.upper()\n", "# print(random_str)\n", "# if random_str.isdigit() and len(random_str) ==4:\n", " img = Image.open(path)\n", " X.append(np.array(img.resize((120,40), Image.BILINEAR))/255.0)\n", " label_idx = [characters.find(x) for x in random_str]\n", " if len(random_str) < n_len:\n", " label_idx += [n_class-1]*(n_len-len(random_str)) \n", " Y.append(label_idx)\n", " return [np.array(X), np.array(Y), np.ones(len(X)), np.ones(len(X))],np.ones(len(X))\n", "\n", "# data = [get_test_data()]\n", "\n", "data = CaptchaSequence(characters, batch_size=128, steps=20, chars_len=(4,4))\n", "\n", "pos = neg = 0\n", "t1 = time.time()\n", "\n", "neg_img = []\n", "neg_str = []\n", "for i in range(len(data)): \n", " flag = False\n", " [X_test, y_test, _, _], _ = data[i]\n", " y_pred = base_model.predict(X_test)\n", "# print(y_pred.shape)\n", " out_pre = K.get_value(K.ctc_decode(y_pred, input_length=np.ones(y_pred.shape[0])*y_pred.shape[1])[0][0])[:, :4]\n", "# print(out_pre.shape)\n", "# print(out)\n", " for j in range(out_pre.shape[0]):\n", " out = ''.join([characters[x] for x in out_pre[j] if x < len(characters)]) \n", " y_true = ''.join([characters[x] for x in y_test[j] if x < len(characters)])\n", "# out = ''.join([characters2[x] for x in out_pre[j] if x < len(characters)]) \n", "# if re.sub(' ','',out) != y_true:\n", " if out != y_true:\n", " neg_img.append(X_test[j])\n", " neg_str.append('pred:' + str(out) + '\\ttrue:' + str(y_true))\n", " plt.imshow(X_test[j])\n", " plt.title('pred:' + str(out) + '\\ntrue: ' + str(y_true))\n", " print('pred:' + str(out) + '\\ntrue:' + str(y_true))\n", " neg += 1\n", " flag = True\n", "# break\n", "# time.sleep(1)\n", "# argmax = np.argmax(y_pred, axis=2)[j]\n", "# print(list(zip(argmax, ''.join([characters2[x] for x in argmax]))))\n", " else:\n", "# print('pred:' + str(out) + '\\ntrue: ' + str(y_true))\n", " pos += 1 \n", "\n", "# if flag:\n", "# break\n", "t2 = time.time()\n", "print('总耗时:',t2-t1)\n", "print(pos,neg)\n", "# # plt.imshow(X_test[0])\n", "# # plt.title('pred:' + str(out) + '\\ntrue: ' + str(y_true))\n", "\n", "# argmax = np.argmax(y_pred, axis=2)[0]\n", "# list(zip(argmax, ''.join([characters2[x] for x in argmax])))\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pred:得得第穿\ttrue:得第穿军\n", "pred:枪枪世代\ttrue:枪世代儿\n", "pred:前会准怕\ttrue:前会传怕\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 114, "width": 860 }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import math\n", "f = plt.figure(figsize=(20,10))\n", "n = math.ceil(len(neg_img)/4)\n", "for i in range(len(neg_img)):\n", " plt.subplot(n,4,i+1)\n", " plt.imshow(neg_img[i])\n", " print(neg_str[i])\n", "plt.show()\n", "\n", "# with open('/data/captcha/total_chinese/total_chinese.txt', encoding='utf-8') as f:\n", "# line = f.readlines()\n", "# print(len(line))\n", "# print(label_dic['f15d93fc-aa3d-11ea-8951-5254009c362b'])\n", "# print(len(label_dic))\n", "# 'f15d93fc-aa3d-11ea-8951-5254009c362b' in label_dic\n", "# line[:3]" ] }, { "cell_type": "code", "execution_count": 199, "metadata": {}, "outputs": [], "source": [ "evaluate(base_model,batch_size=128, steps=10)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD8CAYAAACfF6SlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XmUXGW97vHvr4buTtIJCZlDAgmXSSAKGLhwPeBwjkyLYSloQASCAuciAooXBXGILjwe8Rw8cmSJXESGA5gIiEHQXDmwDChgQgwZSQhT0kkg3UnI1ENN7/1j7+5Umh6qqqvq3Z16PmtlVdWut/Z+d72dZ7/17smcc4iISG2J+a6AiIhUn8JfRKQGKfxFRGqQwl9EpAYp/EVEapDCX0SkBin8RURqkMJfRKQGKfxFRGpQwteCx4wZ46ZOnepr8SIig9LLL7/c4pwbO9D5eAv/qVOnsmjRIl+LFxEZlMzs7XLMR8M+IiI1SOEvIlKDFP4iIjXI25i/iNSmdDpNU1MT7e3tvqsSaQ0NDUyePJlkMlmR+Sv8RaSqmpqaGD58OFOnTsXMfFcnkpxzbNmyhaamJqZNm1aRZWjYR0Sqqr29ndGjRyv4+2BmjB49uqK/jhT+IlJ1Cv7+Vfo78hf+uQyseNzb4kVEapm/8N/6JvzmUtj5jrcqiEhtamxs9F0F7/yFfzYVPOYy3qogIlKrPI75u+DBtNtBRPxwznHDDTdw9NFHM336dObMmQPApk2bOOWUUzjmmGM4+uijee6558hms8yaNaur7E9+8hPPtR+YCBzqqR0/IrXqe0+sYOXGHWWd55GTRvDds48qqOxjjz3GkiVLeOWVV2hpaeH444/nlFNO4aGHHuK0007j5ptvJpvN0traypIlS9iwYQPLly8H4L333itrvavNf7dbe/1FxJPnn3+eCy+8kHg8zvjx4/noRz/KwoULOf744/nVr37F7NmzWbZsGcOHD+fggw/mjTfe4JprruGPf/wjI0aM8F39AfHX88+mgXrU8xepXYX20KvtlFNOYcGCBTz55JPMmjWL66+/nksuuYRXXnmF+fPnc+eddzJ37lzuuece31Utmf+ev4iIJyeffDJz5swhm83S3NzMggULOOGEE3j77bcZP348V1xxBZdffjmLFy+mpaWFXC7Heeedxy233MLixYt9V39A/I/5u5zvGohIjfrUpz7FCy+8wIc+9CHMjFtvvZUJEyZw33338eMf/5hkMkljYyP3338/GzZs4LLLLiOXCzLrhz/8oefaD4w557wseMakuFt0ZSNcvwpGTPJSBxGpvlWrVvGBD3zAdzUGhZ6+KzN72Tk3Y6Dz9j/s42njIyJSyyIQ/hr2ERGpNv/hj3r+IiLV5j/8NewjIlJ1EQh/DfuIiFSb//DPpsMTvkREpFr6DX8zm2Jmz5rZSjNbYWbX9VDGzOx2M1trZkvN7LiCa3DH8XDbkUVWW0REBqKQnn8G+Jpz7kjgROBqM+ue1mcAh4b/rgR+XlQtdm8uqriISLX0de3/t956i6OPPrqKtSmffsPfObfJObc4fL4TWAUc0K3YucD9LvAiMNLMJpa9tiIiUhZFXd7BzKYCxwIvdXvrAGB93uumcNqmAdRNRPZ1f7gR3llW3nlOmA5n/Guvb994441MmTKFq6++GoDZs2eTSCR49tln2bZtG+l0mltuuYVzzz23qMW2t7dz1VVXsWjRIhKJBLfddhsf//jHWbFiBZdddhmpVIpcLsejjz7KpEmT+OxnP0tTUxPZbJZvf/vbzJw5c0CrXayCw9/MGoFHga8450q6ALeZXUkwLMSHJ/rf1ywitWfmzJl85Stf6Qr/uXPnMn/+fK699lpGjBhBS0sLJ554Iuecc05RN1G/4447MDOWLVvGq6++yqmnnsqaNWu48847ue6667joootIpVJks1meeuopJk2axJNPPgnA9u3bK7KufSko/M0sSRD8DzrnHuuhyAZgSt7ryeG0vTjn7gLuguDaPkXXVkT2LX300Cvl2GOPZfPmzWzcuJHm5mZGjRrFhAkT+OpXv8qCBQuIxWJs2LCBd999lwkTJhQ83+eff55rrrkGgCOOOIKDDjqINWvWcNJJJ/GDH/yApqYmPv3pT3PooYcyffp0vva1r/GNb3yDs846i5NPPrlSq9urQo72MeCXwCrn3G29FJsHXBIe9XMisN05pyEfEYmkz3zmMzzyyCPMmTOHmTNn8uCDD9Lc3MzLL7/MkiVLGD9+PO3t7WVZ1uc+9znmzZvHkCFDOPPMM3nmmWc47LDDWLx4MdOnT+db3/oW3//+98uyrGIU0vP/CHAxsMzMloTTvgkcCOCcuxN4CjgTWAu0ApeVv6oiIuUxc+ZMrrjiClpaWvjzn//M3LlzGTduHMlkkmeffZa333676HmefPLJPPjgg3ziE59gzZo1rFu3jsMPP5w33niDgw8+mGuvvZZ169axdOlSjjjiCPbff38+//nPM3LkSO6+++4KrGXf+g1/59zz9HO7LRdcF/rqclVKRKSSjjrqKHbu3MkBBxzAxIkTueiiizj77LOZPn06M2bM4Igjjih6nl/60pe46qqrmD59OolEgnvvvZf6+nrmzp3LAw88QDKZZMKECXzzm99k4cKF3HDDDcRiMZLJJD//eXFHx5eD/+v5d5pd/R0eIlJ9up5/4fbt6/kDxJK+ayAiUlP838YRYOSU/suIiHiybNkyLr744r2m1dfX89JL3U95GjyiEf6xaFRDRKrDOVfUMfS+TZ8+nSVLlvRfsIwqPSQfiWGfjItENUSkChoaGtiyZUvFw20wc86xZcsWGhoaKraMSHS5WzOOEb4rISJVMXnyZJqammhubvZdlUhraGhg8uTJFZt/JMLfYnHfVRCRKkkmk0ybNs13NWpeJMZbnEViGyQiUjMiEf65aFRDRKRmRCJ1X2tp9V0FEZGaEonwd31fPUJERMosEuFv6JAvEZFqikT4i4hIdUUi/Ec06No+IiLVFInwR2f6iYhUVTTCX0REqioS4a8dviIi1RWJ8BcRkeqKRPir3y8iUl2RCH8N+4iIVFckwl9ERKpL4S8iUoMU/iIiNUjhLyJSgyIR/trhKyJSXZEIfxERqa5IhL96/iIi1RWJ8Nd13UREqisS4a+ev4hIdfkL/3FHwtk/ZWXdB71VQUSkVvkL/0Q9fHgWqViDtyqIiNSqSAz7iIhIdXkPf4eh63qKiFSX9/AHMN8VEBGpMZEIfxERqS6Fv4hIDeo3/M3sHjPbbGbLe3n/Y2a23cyWhP++U3w1NOYvIlJNiQLK3Av8DLi/jzLPOefOKqUCzjTiLyJSbf32/J1zC4CtlayEzvAVEamuco35n2Rmr5jZH8zsqOI+qp6/iEi1FTLs05/FwEHOuV1mdibwOHBoTwXN7ErgSoADDzywDIsWEZFSDLjn75zb4ZzbFT5/Ckia2Zheyt7lnJvhnJsxduzY/DcGWg0RESnCgMPfzCaYBXttzeyEcJ5bipjDQKsgIiJF6nfYx8weBj4GjDGzJuC7QBLAOXcncD5wlZllgDbgAueK68or/kVEqqvf8HfOXdjP+z8jOBS0JE7RLyJSdTrDV0SkBnkP/2BvgXb4iohUk/fw17CPiEj1eQ9/0Bm+IiLVFonwFxGR6lL4i4jUoIiEv4Z9RESqyXv4O0zZLyJSZd7DH6p0hm8uCw9/Dta9WI2liYhEWgTCv0qHeu56F1Y/Cb+ZVZ3liYhEmP/wH0j2r3sJ2t4rW1VERGqF//AHShr0z6TgnlPhoc+WvzoiIvu4CIR/iV1/lw0eN71SvqqIiNSICIS/zvAVEak27+Gva/uIiFSf9/BX9IuIVJ/38AcN+4iIVJv38Hemvr+ISLV5D38REam+wRv+xd0jXkRE8gze8O9rP0HrVnj6e8H1fERE5H0iEf5l3+H7h6/D87fB6j+Ud74iIvuICIR/qWf49rHByLSHZdTzFxHpSQTCH8p+QX/tDxAR6ZP/8C/5UE8FvIhIqfyHP5SW43317nXugIhInyIR/mXf4athHxGRPnkP/9Iv7KaAFxEplffwhwpc3E3DPiIifYpA+FfgUE8N+4iI9Ml/+JfcSVfAi4iUyn/4A2UPcg37iIj0KQLhX6VhHw0FiYh0iUD4V/JmLvkbFoW/iEgn7+Ff2Xv4KvBFRHriPfxL399bZLBr2EdEpEu/4W9m95jZZjNb3sv7Zma3m9laM1tqZscVXw0N+9ScZ34A6xf6roVIzSqk538vcHof758BHBr+uxL4+cCrVYhCwlyBH1kLboVf/pPvWojUrH7D3zm3ANjaR5Fzgftd4EVgpJlNLKYSJQ39aNhHRKRk5RjzPwBYn/e6KZz2PmZ2pZktMrNFzc3NALiKHpOv4/1FRHpS1R2+zrm7nHMznHMzxo4dO9C5FVlGPX8RkU7lCP8NwJS815PDaQUr6Th/DfuIiJSsHOE/D7gkPOrnRGC7c25T4R/XsI+ISLUl+itgZg8DHwPGmFkT8F0gCeCcuxN4CjgTWAu0ApcVX42SbuVVZBn1/EVEOvUb/s65C/t53wFXl1wDXYRNRKTqvJ/hC5T/Hr5d8jYsGvMXEekSifAvre+vMB+0tCEW8S4C4a9hn5qj8BfxLgLhr0M9a4/aQsQ37+Ff+iWdFSCDljbEIt55D//qUeCIiHTyHv5Bv1/DPrVFbSHim/fwr+yF3SSStCEW8c57+Bul3sO32M8ocKJDbSHim/fwLzkG1HsUESmZ9/C3ah3nr41FdKgtRLzzHv5QrTN8FTjRobYQ8c17+Je8w1e9x8FLbSfinffwh1J3+BZJgRMhagsR3yIR/qVFgQJERKRUkQj/6tDGIjL0K0zEu0iEvy7sVmvUFiK++Q9/neFbe7QhFvHOf/hTrSv6K3BERDpFIPyrfKinep0RoDYQ8S0C4V8lCv3oUFuIeBeJ8K/Yhd322p/gepgmfij8RXyLQPhXcNhHPcxoUruIeBeB8Ieq9AQVOCIiXbyHf+k3cylx2EcbARER/+FfMg37DF5qFxHvvIe/UaXj/J12+EaHwl/EN+/h7zBKC4Nih31ERKST9/A3q2DPf6/hBfU2I0PDPiLeeQ9/V60zfJU3EaLGEPHNe/iX3uvXsM+gpZ6/iHfewx8qeCcvDftElNpCxDfv4e8oMQrUexQRKZn38DdsgNf26WNoJ3/YRxuL6FBbiHjnPfxLP8O3aw5lLieVp7YQ8a2g8Dez081stZmtNbMbe3h/lpk1m9mS8N/l5a9qN+o9Dl5qOxHvEv0VMLM4cAfwSaAJWGhm85xzK7sVneOc+3IplajKcf4KHBGRLoX0/E8A1jrn3nDOpYBfA+dWtlqFKCTMFfjRpHYR8a2Q8D8AWJ/3uimc1t15ZrbUzB4xsynFVMJK6ZUX/RkFTmToV5iId+Xa4fsEMNU590HgT8B9PRUysyvNbJGZLWpubi5zFXqgYZ+IUluI+FZI8m4A8nvyk8NpXZxzW5xzHeHLu4EP9zQj59xdzrkZzrkZY8eOLaW++XMrUxmpOm2IRbwrJPwXAoea2TQzqwMuAOblFzCziXkvzwFWFVOJko7zdwUc568zfEVEetTv0T7OuYyZfRmYD8SBe5xzK8zs+8Ai59w84FozOwfIAFuBWQXXYMCH+ijUBx+1mYhv/YY/gHPuKeCpbtO+k/f8JuCm8lat31oVV0ZDDdGhthDxzvsZvhW9j5eGfSJKbSHiWwTCv0TKDxGRkvkPfyv1ks4F7PDdq7i2FpGhthDxzn/4D3jYp48g6SlkFDzVt2MjbHvLdy1EJE8Ewn+gh3oW/IHilyF9y2ZgV3P/5W77APz0Q3teawMs4p3/8C/5ks4lHu2jWzuWz/yb4N8OgfYdRX5Q4S/im//wryT1MCtr1RPBY8dOv/UQkaJFIvxL6otr2CcCOluuyO9WG2UR7yIQ/pUchtEO34rqHELThlhk0IlA+A/0UM++iugM38pSz19ksPIe/q7Unn9fF3brMVy0w7fsSu75i4hv3sN/4FHcV/AolIrSsrbID5TY81e7iHjnPfwDZR726alHqt5p31b9Hn72YfjL7bD26cI+05X9ueKWpbYQ8a6gq3pWVCWGYfoa9lHw9Ozd5cHjn74dPM7eXvhnc0WGv3r+It5FoudfuUM9FTKV1fkLSz1/kcHGe/iXvMO3rwu79Tjs0+09KR+X9V0DESmS9/CvyA5f9Syro3NDmis2/NU+Ir55D3+o5IXddDOXyur8hVVk+GvjLOKd//Af8IXdCh32UeCUnXr+IoOW//Cn1DN8O2nYx58Sd/jmU1uJeBGB8B/oGb59FurleQnLqrWQKmR9S+356xeZiHcRCP8KKlewPPIF+N7I8sxrsCioNx+G//b1xc68l+ciUi3+w99K7ftX8WJiKx4r/bODVSHh39nzf/SLsPzRIuatnr+Ib/7DvxIXdttTqJfn0q+ChnLyvvtHvlDE8I/aRcS3CIQ/xKyXAPjd1fDMD/r5dJE3cJfClHLiVi5TWLndW/KWozYS8SEC4d9Dz71jF2x6Bf7+X7Dg1l4+p2vIV1Qxwz6dsunC5v3QZ/IXVHCVRKR8IhD+PZjzefjFKX2XKXrYpwxqaQPy5nMFDON0++4L7fnnq6XvVCRC/Id/T9m97oXyzNuVeWx5IMezDza/vhD+8h99l+ne888P/1QrzN4P7jtnz7S+rrYqIlXlP/wHfGG3Qot3K59qhfV/K24epfRsB7N3VwaPu1uCYbj36SP8//5fweObf94zrXUrtL2392fU8xfxIgLhHyo5BEr83O++BL/8JOzaXPhnai38s6ng8a6P9zwM19OYf2p3MFzU0w7jHx8MPzqo20SFf9Gy6eDoqs2rfNdEBrEIhH8QIG6v8C/g10BBJ/j2MeyzYXHwmNpdwIxCNRf+4Q7c7euCxy2vB733TrH43uVzafiXSfDEdYVvzNXzL947S4PzKh6/yndNZBDzH/4lX9O5kB2+JXjtach09Pxe0RcwG+Q6e/6d/vM4uOd02Pwq/Oay95d/+nvB498foPAevcK/aJ1fmTacMgD+w79L3h9yUVf6LPAG7r39R8kPuKZF8OB5e0Ksu5rr+afeP61ldTBktuIxeHfF3u+tfHzP8/nfLGwZCjARLyIT/m7ts/DWX4r4QAGhUcjRPpn24HHXZtjdHDxvWdNz2X06/HvY4PYU/gAWDvdYOf58FP4l013pZAC838A9G6sDIPbQecGES58o8JNlGvbJdMDOd+HfD4NJx3abdzcDCf/tTTDigAj/h+1hnbOp4KiofBaHWPhnU45eu3r+xettoyxSBO89/y2HnL/3hPvOhnS3wHniOpg9Et5+IQjRnjz2z/Dqk8Hzzt78it8Gx5q3bu0hZNyesrveDZ5v/HvwuPZpWPYI/N9/hHUv7flIqeH/znL4yVGw8O7SPu9L8xr4l4l7T4sn9+zozRV4Rm+fFP5F6/z7FhmAgnr+ZnY68FMgDtztnPvXbu/XA/cDHwa2ADOdc28VMu+z/9cx/OXN6/nI67f1Xujle4PHX53+/vcybcHx+kt/HfybvR22hYte/2Lw2PIa7NgYPO++Eciket7B++gXg8d7Tt0zrdQdvkvnBI9P/R/YbzIcfkZp86m2dA9HQsWSZRruCannXzz1/KUM+g1/M4sDdwCfBJqAhWY2zzm3Mq/YF4FtzrlDzOwC4EfAzEIqEIsZH7n4uzj3HV57822yf/1PWrds4K30KM7b9VBha/HLT3Y93X7LIeyXad7r7fQD55NM7whe7HqHjY9/l0nvBYcvti5+mHi6lfpCllNKzz+Tgr/evuf1wxcEG6ioKXTDltoJdY2VrYv0rbej0USKUEjP/wRgrXPuDQAz+zVwLpAf/ucCs8PnjwA/MzNzrvBunZlx2MFT4eB/B4KfEOTuoL1tFy07drN16f9j1BuPszU+lo2xiQxt28hHt8ylJTaWBtdKowt6qd2DH9gT/KFJS/ZctmDoqkcKrSJvvfBbxnXcRiKXJtYwnPaP3kzd0FEkknWYgTkXjOnnj+vv2PD+Gf31ZzB8Ahx2GsTrIVFXcB161LncUuWyuNTuwveerH6y9GV1l24LNjwW23sduq9TLvf+77aCOtp2seknH6Mxt4P3hh9GatyHaB9+EMn6euLDxjJkx+tk4w24CR8klxhCfTJBNpMiuWsDNmoqyWw7yfbNtI2bQf2ON0gm4iRGjCfe2sKuhom4+hE0xDLQ9h6x1nepG3Ug8WH7k8tlye7agqvfj6xzxDq2gxlu6DgsZgxJxsm27yQBuN3NkMuRc45M2w5o3UL9uEP2/r6cg1gseA2kczmS8fie7zGTCjo18TqIJ3r43rN7funlMsGwH4R3t8sBFsy/k3Pw1nNwwAyoG7pnets2SA4b+N96ueSywXksyQbfNfHG+stnMzsfON05d3n4+mLgfzrnvpxXZnlYpil8/XpYpqW3+c6YMcMtWrSoDKvQTS6HM2P7ptehbjg7Wtt5Lx3DbXyFxI71pPc7iETHNuLb17MjV08ytY2Gjq2M2baE18d+gi3xcWyxkRy6/UUSmd00pN+DXJoP7nyu10W2uTpiOOotTdrFaaeOGDni5EiQJWG9XxMo7eKkLcFQOuggieHYxVBiONIkcBj1pEiQIUUdGeLkiFFHmjrS7GYIw2glTYIkGQzYxgji5Gigg90M6bpHcpwcdaRpZQhJ0iTIkCPGMNoYQs+9yWtTV/P15BwmWwsZF+t1Xf6WO5wTYqt7Xc8mN4bJ1uufAykSGLCbBrLE2Y9dJMiynUaSZBhKOzsYRo4YQ2mjjQbSJKgjzU6Ghd9RllYayATRiBHcH7pzvR2QIUGOGIbb697R+c9zxADHRHqvb7W1uTrSJIiRo9H2jPm3uyQNtmffS9rFSVrwKy7lgvLvMZxGWjEc9ZbpKucw6mzPr9kshjnIEqONeuLkGEIHrTTQaG1d5Xa7euotTYIcOWe0U0cbDdRZMBw1nKBsG/W0U08DHV1/XxtsfPj9drYQXc8tr8069wU5YuSIlX3P0Bi3lTrSbLTxXdMa6CBLnHS1j4Mpsj8z7bsrX3bOzRjoYqu6lmZ2JXAlwIEHHliZhcRiGDByUtADGgkcCPA/pvT70XF7vfr8Xq9at2xg9bK/kW1+DZfaTV3bZlLxRpxzxLJtxHIZ0rEG4tk24rk0qVg9OYuTczGG5HbhRk1jdzZGq2tgyvaFtCZG0pDeTooE6fgQsBiJbBsZYjRkW+mIDSHmsuAcSddBR2wIDiPmspjLEXdp2mPDSLqO4LNh8GctQTyXImNJspYkmWsPeo4OnMXIkKQu10YmliRrCWIuR0N2J0OzO9iw/4nUn/TPpLJZMh3tZDp28w91E3nO/W8S7VtpizUyvuVFGlvXs2bcGeTiCfZvfZsxu1azcsK5bNi6iG31Uzhg+0KGZHawbtSJbI+PZiQ72BbbnzH1GTINo4nv3EB71piy+RmGtTYxom0ju+ONtMX3oz7XSsKlSJEk4TIQi5OONZCxJI3prWRidXTEhjIkuxMHxFyWuMuSitWTdCniuRTOYji35xZxOeJheBh0Bosj+F66ImePRC4IsXX1ozjmi7fjnGNz0+u07dhKcvcmsru3ko3VE9+1AbIpMrEG0iRpyO3CXJZdNpxcup1h6a201Y0m5jKkrY6UizO07R0skSROjt0MgUQDuVgCl2ojmd1NjKA3bWbk4vVYLsuYnavYOWQSOeJks1lSdfsxuvUNtg05EMumyMSH4uIJ4i6LpXZh5Ehm20jHGuiwBoZmt5ON1Qd/J7kUbfFGHMaQzA7aE420x0dAtoNYNkXMjMbstuAoPOdoizdSl9lF3IJ4jpMlQ5yMsyCWLQjuWC5NJlZHItvB/h3r2dRwCFmLUZ9tBefYHRvOlLZV7EiMDr/lvePcnMOFvzj2bAKMGFlieRdULNdGIJvZQn2ulW11e3IhmesgE0viijkOJu+XUkl1K2mf18r+ixSgkJ7/ScBs59xp4eubAJxzP8wrMz8s84KZJYB3gLF9DftUrOcvIrIPM7Oy9PwL2cQtBA41s2lmVgdcAMzrVmYecGn4/HzgmWLG+0VEpLr6HfZxzmXM7MvAfIJDPe9xzq0ws+8Di5xz84BfAg+Y2VpgK8EGQkREIqqgMX/n3FPAU92mfSfveTvwme6fExGRaPJ+hq+IiFSfwl9EpAYp/EVEapDCX0SkBin8RURqUL8neVVswWY7gd6vBzD4jYEIXR+g/Pbl9duX1w20foPZGGCYc27sQGfk82Yuq8txllpUmdkird/gtC+vG2j9BrNw3aaWY14a9hERqUEKfxGRGuQz/O/yuOxq0PoNXvvyuoHWbzAr27p52+ErIiL+aNhHRKQGeQl/MzvdzFab2Vozu9FHHQbCzKaY2bNmttLMVpjZdeH0/c3sT2b2Wvg4KpxuZnZ7uL5Lzew4v2tQGDOLm9nfzez34etpZvZSuB5zwkt8Y2b14eu14ftTfda7P2Y20sweMbNXzWyVmZ20L7WdmX01/LtcbmYPm1nDYG47M7vHzDaHdwzsnFZ0e5nZpWH518zs0p6W5UMv6/fj8O9zqZn91sxG5r13U7h+q83stLzpxeWqc66q/wguC/06cDBQB7wCHFntegxwHSYCx4XPhwNrgCOBW4Ebw+k3Aj8Kn58J/IHgVlInAi/5XocC1/N64CHg9+HrucAF4fM7gavC518C7gyfXwDM8V33ftbrPuDy8HkdwQ3f9om2Aw4A3gSG5LXZrMHcdsApwHHA8rxpRbUXsD/wRvg4Knw+yve69bF+pwKJ8PmP8tbvyDAz64FpYZbGS8lVHyt6EjA/7/VNwE2+G2CA6/Q74JMEJ61NDKdNJDiXAeAXwIV55bvKRfUfMBn4b+ATwO/D/0wteX+QXe1IcK+Hk8LnibCc+V6HXtZrvzAcrdv0faLtwvBfH4ZcImy70wZ72wFTu4VjUe0FXAj8Im/6XuV8/+u+ft3e+xTwYPh8r7zsbL9SctXHsE/nH2enpnDaoBT+TD4WeAkY75zbFL71DtB5d+jBuM7/AXwd6LyB6mjgPedc5x2/89eha/3C97eH5aNoGtAM/Coc0rrbzIaxj7Sdc24D8G+ZgL9ZAAACU0lEQVTAOmATQVu8zL7RdvmKba9B1Y7dfIHg1wyUcf20w3cAzKwReBT4inNuR/57Ltj8DspDqczsLGCzc+5l33WpgATBT+yfO+eOBXYTDBt0GeRtNwo4l2AjNwkYBpzutVIVNpjbqz9mdjOQAR4s97x9hP8GYEre68nhtEHFzJIEwf+gc+6xcPK7ZjYxfH8isDmcPtjW+SPAOWb2FvBrgqGfnwIjzazzkiD569C1fuH7+wFbqlnhIjQBTc65l8LXjxBsDPaVtvsn4E3nXLNzLg08RtCe+0Lb5Su2vQZbO2Jms4CzgIvCDRyUcf18hH8hN4SPNDMzgvsWr3LO3Zb3Vv6N7C8l2BfQOf2S8EiEE4HteT9ZI8c5d5NzbrILriFyAfCMc+4i4Fng/LBY9/XrXO/zw/KR7Ik5594B1pvZ4eGkfwRWso+0HcFwz4lmNjT8O+1cv0Hfdt0U217zgVPNbFT46+jUcFokmdnpBMOu5zjnWvPemgdcEB6lNQ04FPgbpeSqp50bZxIcIfM6cLPvnS0l1P8fCH5mLgWWhP/OJBgr/W/gNeBpYP+wvAF3hOu7DJjhex2KWNePsedon4PDP7S1wG+A+nB6Q/h6bfj+wb7r3c86HQMsCtvvcYKjP/aZtgO+B7wKLAceIDgyZNC2HfAwwf6LNMEvty+W0l4EY+drw3+X+V6vftZvLcEYfme+3JlX/uZw/VYDZ+RNLypXdYaviEgN0g5fEZEapPAXEalBCn8RkRqk8BcRqUEKfxGRGqTwFxGpQQp/EZEapPAXEalB/x/z6f2uXx6wmQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# 展示损失下降图\n", "import pandas as pd\n", "\n", "df = pd.read_csv('ctc.csv')\n", "df[['loss', 'val_loss']].plot()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.0" } }, "nbformat": 4, "nbformat_minor": 2 }