{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0123456789\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", "\n", "%matplotlib inline\n", "%config InlineBackend.figure_format = 'retina'\n", "\n", "import string\n", "# characters = string.digits + string.ascii_uppercase\n", "characters = string.digits # 验证码字符集合\n", "print(characters)\n", "\n", "width, height, n_len, n_class = 100, 50, 6, 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)" ] }, { "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": 15, "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": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "input_1 (InputLayer) (None, 50, 100, 3) 0 \n", "_________________________________________________________________\n", "conv2d (Conv2D) (None, 50, 100, 32) 896 \n", "_________________________________________________________________\n", "batch_normalization (BatchNo (None, 50, 100, 32) 128 \n", "_________________________________________________________________\n", "activation (Activation) (None, 50, 100, 32) 0 \n", "_________________________________________________________________\n", "conv2d_1 (Conv2D) (None, 50, 100, 32) 9248 \n", "_________________________________________________________________\n", "batch_normalization_1 (Batch (None, 50, 100, 32) 128 \n", "_________________________________________________________________\n", "activation_1 (Activation) (None, 50, 100, 32) 0 \n", "_________________________________________________________________\n", "max_pooling2d (MaxPooling2D) (None, 25, 50, 32) 0 \n", "_________________________________________________________________\n", "conv2d_2 (Conv2D) (None, 25, 50, 64) 18496 \n", "_________________________________________________________________\n", "batch_normalization_2 (Batch (None, 25, 50, 64) 256 \n", "_________________________________________________________________\n", "activation_2 (Activation) (None, 25, 50, 64) 0 \n", "_________________________________________________________________\n", "conv2d_3 (Conv2D) (None, 25, 50, 64) 36928 \n", "_________________________________________________________________\n", "batch_normalization_3 (Batch (None, 25, 50, 64) 256 \n", "_________________________________________________________________\n", "activation_3 (Activation) (None, 25, 50, 64) 0 \n", "_________________________________________________________________\n", "max_pooling2d_1 (MaxPooling2 (None, 12, 25, 64) 0 \n", "_________________________________________________________________\n", "conv2d_4 (Conv2D) (None, 12, 25, 128) 73856 \n", "_________________________________________________________________\n", "batch_normalization_4 (Batch (None, 12, 25, 128) 512 \n", "_________________________________________________________________\n", "activation_4 (Activation) (None, 12, 25, 128) 0 \n", "_________________________________________________________________\n", "conv2d_5 (Conv2D) (None, 12, 25, 128) 147584 \n", "_________________________________________________________________\n", "batch_normalization_5 (Batch (None, 12, 25, 128) 512 \n", "_________________________________________________________________\n", "activation_5 (Activation) (None, 12, 25, 128) 0 \n", "_________________________________________________________________\n", "max_pooling2d_2 (MaxPooling2 (None, 6, 12, 128) 0 \n", "_________________________________________________________________\n", "conv2d_6 (Conv2D) (None, 6, 12, 256) 295168 \n", "_________________________________________________________________\n", "batch_normalization_6 (Batch (None, 6, 12, 256) 1024 \n", "_________________________________________________________________\n", "activation_6 (Activation) (None, 6, 12, 256) 0 \n", "_________________________________________________________________\n", "conv2d_7 (Conv2D) (None, 6, 12, 256) 590080 \n", "_________________________________________________________________\n", "batch_normalization_7 (Batch (None, 6, 12, 256) 1024 \n", "_________________________________________________________________\n", "activation_7 (Activation) (None, 6, 12, 256) 0 \n", "_________________________________________________________________\n", "max_pooling2d_3 (MaxPooling2 (None, 3, 12, 256) 0 \n", "_________________________________________________________________\n", "permute (Permute) (None, 12, 3, 256) 0 \n", "_________________________________________________________________\n", "time_distributed (TimeDistri (None, 12, 768) 0 \n", "_________________________________________________________________\n", "bidirectional (Bidirectional (None, 12, 128) 319872 \n", "_________________________________________________________________\n", "bidirectional_1 (Bidirection (None, 12, 128) 74112 \n", "_________________________________________________________________\n", "dense (Dense) (None, 12, 11) 1419 \n", "=================================================================\n", "Total params: 1,571,499\n", "Trainable params: 1,569,579\n", "Non-trainable params: 1,920\n", "_________________________________________________________________\n" ] } ], "source": [ "base_model.summary()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "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", "def generate_image(random_str, width=80, height=30):\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/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=25)\n", " draw = ImageDraw.Draw(image) \n", " for _ in range(random.randint(50, 150)):\n", " draw.line(xy=(random_xy(width,height),random_xy(width,height)),fill=random_color(180, 255))\n", " for _ in range(random.randint(0,50)):\n", " draw.point(xy=(random_xy(width,height)),fill=random_color(70, 200))\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((100,50), Image.BILINEAR)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# 重组验证码\n", "def rebuild_img(path):\n", " '''\n", " 读取本地4-5位验证码图片进行裁剪分割为单个数字,从分割的字符随机抽取n个重组为新图片\n", " 参数:path:图片路径\n", " 返回:重组后图片\n", " '''\n", " label = path.split('_')[-1][:-4]\n", " if label.isdigit() 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", " return img.resize((100,50), Image.BILINEAR), ''.join(new_label)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# 定义数据生成器\n", "from tensorflow.keras.utils import Sequence\n", "\n", "class CaptchaSequence2(Sequence):\n", " '''\n", " 继承Sequence的数据生成类,方便调用多CPU,加快生成训练及测试数据\n", " 参数:self.characters:验证码字符集合,self.batch_size:每批次样本数,self.steps:生成多少批数据,self.n_len:验证码长度,\n", " self.width:图片宽度,self.height:图片高度,self.input_length:lstm time step长度,self.label_length:标签长度\n", " 返回:array类型训练或测试数据 \n", " \n", " ''' \n", " def __init__(self, characters, batch_size, steps, n_len=6, width=100, height=50, \n", " input_length=12, label_length=6): # width=128, height=64, input_length=16, label_length=4\n", " self.characters = characters\n", " self.batch_size = batch_size\n", " self.steps = steps\n", " self.n_len = n_len\n", " self.width = width\n", " self.height = height\n", " self.input_length = input_length\n", " self.label_length = label_length\n", "# self.label_length = self.n_len\n", " self.n_class = len(characters)\n", " self.generator = ImageCaptcha(width=width, height=height)\n", " \n", " def __len__(self):\n", " return self.steps\n", "\n", " def __getitem__(self, idx):\n", " X = np.zeros((self.batch_size, self.height, self.width, 3), dtype=np.float32)\n", " y = np.zeros((self.batch_size, self.n_len), dtype=np.uint8)\n", " input_length = np.ones(self.batch_size)*self.input_length\n", " label_length = np.ones(self.batch_size)*self.label_length\n", " bat_len = random.randint(5,5)\n", "# bat_len = 4\n", "# num = '0123456789'\n", "# sign = '+*-'\n", " for i in range(self.batch_size):\n", " # random_str = '{}{}{}='.format(random.choice(num), random.choice(sign), random.choice(num)) \n", " if bat_len == 4: \n", " if i % 3 == 0:\n", "# print('bat_len == 4 if i % 3 == 0:')\n", " image, random_str = rebuild_img(random.choice(glob.glob('Digit4/*.jpg'))) \n", " elif i % 3 == 1: \n", "# print('bat_len == 4 if i % 3 == 1:')\n", " random_str = ''.join([random.choice(self.characters) for j in range(bat_len)])\n", " image = generate_image(random_str, 80, 30) \n", " elif i % 3 == 2:\n", "# print('bat_len == 4 if i % 3 == 2:')\n", " random_str = ''.join([random.choice(self.characters) for j in range(bat_len)])\n", " image = self.generator.generate_image(random_str) \n", " elif bat_len == 5: \n", " if i % 3 == 0:\n", "# print('bat_len == 5 if i % 3 == 0:')\n", " image, random_str = rebuild_img(random.choice(glob.glob('Digit5/*.jpg'))) \n", "# elif i % 3 == 1: \n", "# # print('bat_len == 5 if i % 3 == 1:')\n", "# random_str = ''.join([random.choice(self.characters) for j in range(bat_len)])\n", "# image = generate_image(random_str, 100, 27)\n", "# elif i % 3 == 2:\n", "# print('bat_len == 5 if i % 3 == 2:')\n", " else:\n", " random_str = ''.join([random.choice(self.characters) for j in range(bat_len)])\n", " image = self.generator.generate_image(random_str) \n", "# else: \n", "# # print('else:')\n", "# random_str = ''.join([random.choice(self.characters) for j in range(bat_len)])\n", "# image = generate_image(random_str, 100, 50) \n", "# elif i % 2 == 1:\n", "# random_str = ''.join([random.choice(self.characters) for j in range(bat_len)])\n", "# image = self.generator.generate_image(random_str) \n", "# print('i=',i,'bat_len=',bat_len) \n", " X[i] = np.array(image)/255.0\n", " label = [self.characters.find(x) for x in random_str]\n", " if len(random_str) < self.n_len:\n", " label += [self.n_class]*(self.n_len-len(random_str)) \n", " y[i] = label\n", "\n", " return [X, y, input_length, label_length], np.ones(self.batch_size)\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# 定义数据生成器\n", "from tensorflow.keras.utils import Sequence\n", "\n", "class CaptchaSequence(Sequence):\n", " '''\n", " 继承Sequence的数据生成类,方便调用多CPU,加快生成训练及测试数据\n", " 参数:self.characters:验证码字符集合,self.batch_size:每批次样本数,self.steps:生成多少批数据,self.n_len:验证码长度,\n", " self.width:图片宽度,self.height:图片高度,self.input_length:lstm time step长度,self.label_length:标签长度\n", " 返回:array类型训练或测试数据 \n", " \n", " '''\n", " def __init__(self, characters, batch_size, steps, n_len=6, width=100, height=50, \n", " input_length=12, label_length=6): # width=128, height=64, input_length=16, label_length=4\n", " self.characters = characters\n", " self.batch_size = batch_size\n", " self.steps = steps\n", " self.n_len = n_len\n", " self.width = width\n", " self.height = height\n", " self.input_length = input_length\n", " self.label_length = label_length\n", "# self.label_length = self.n_len\n", " self.n_class = len(characters)\n", " self.generator = ImageCaptcha(width=width, height=height)\n", " \n", " def __len__(self):\n", " return self.steps\n", "\n", " def __getitem__(self, idx):\n", " X = np.zeros((self.batch_size, self.height, self.width, 3), dtype=np.float32)\n", " y = np.zeros((self.batch_size, self.n_len), dtype=np.uint8)\n", " input_length = np.ones(self.batch_size)*self.input_length\n", " label_length = np.ones(self.batch_size)*self.label_length \n", " for i in range(self.batch_size): \n", " if i % 4 == 0:\n", " image, random_str = rebuild_img(random.choice(glob.glob('Digit4/*.jpg'))) \n", " elif i % 4 == 1: \n", " random_str = ''.join([random.choice(self.characters) for j in range(random.randint(4, 6))])\n", " image = generate_image(random_str, 80, 30) \n", " elif i % 4 == 2:\n", " random_str = ''.join([random.choice(self.characters) for j in range(random.randint(4, 6))])\n", " image = self.generator.generate_image(random_str) \n", " elif i % 4 == 3:\n", " image, random_str = rebuild_img(random.choice(glob.glob('Digit5/*.jpg'))) \n", " X[i] = np.array(image)/255.0\n", " label = [self.characters.find(x) for x in random_str]\n", " if len(random_str) < self.n_len:\n", " label += [self.n_class]*(self.n_len-len(random_str)) \n", " y[i] = label\n", "\n", " return [X, y, input_length, label_length], np.ones(self.batch_size)\n" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, '1310')" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 213, "width": 370 }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# 测试生成器\n", "data = CaptchaSequence(characters, batch_size=10, steps=5)\n", "[X_test, y_test, input_length, label_length], _ = data[3]\n", "idx = 2\n", "plt.imshow(X_test[idx])\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": 233, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 30, 80, 3)\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 233, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 158, "width": 370 }, "needs_background": "light" }, "output_type": "display_data" } ], "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])" ] }, { "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": 41, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/200\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Process ForkPoolWorker-149:\n", "Process ForkPoolWorker-150:\n", "Process ForkPoolWorker-147:\n", "Process ForkPoolWorker-148:\n", "Traceback (most recent call last):\n", "Traceback (most recent call last):\n", "Traceback (most recent call last):\n", "Traceback (most recent call last):\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 254, in _bootstrap\n", " self.run()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 254, in _bootstrap\n", " self.run()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 254, in _bootstrap\n", " self.run()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 254, in _bootstrap\n", " self.run()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", " self._target(*self._args, **self._kwargs)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", " self._target(*self._args, **self._kwargs)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", " self._target(*self._args, **self._kwargs)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", " self._target(*self._args, **self._kwargs)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/pool.py\", line 108, in worker\n", " task = get()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/pool.py\", line 108, in worker\n", " task = get()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/pool.py\", line 108, in worker\n", " task = get()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/pool.py\", line 108, in worker\n", " task = get()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/queues.py\", line 342, in get\n", " with self._rlock:\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/queues.py\", line 343, in get\n", " res = self._reader.recv_bytes()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/queues.py\", line 342, in get\n", " with self._rlock:\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/queues.py\", line 342, in get\n", " with self._rlock:\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/synchronize.py\", line 96, in __enter__\n", " return self._semlock.__enter__()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/connection.py\", line 216, in recv_bytes\n", " buf = self._recv_bytes(maxlength)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/synchronize.py\", line 96, in __enter__\n", " return self._semlock.__enter__()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/synchronize.py\", line 96, in __enter__\n", " return self._semlock.__enter__()\n", "KeyboardInterrupt\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/connection.py\", line 407, in _recv_bytes\n", " buf = self._recv(4)\n", "KeyboardInterrupt\n", "KeyboardInterrupt\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/connection.py\", line 379, in _recv\n", " chunk = read(handle, remaining)\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;31m# callbacks=callbacks)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m model.fit_generator(train_data, epochs=200, validation_data=valid_data, workers=4, use_multiprocessing=True,\n\u001b[0;32m---> 16\u001b[0;31m callbacks=callbacks)\n\u001b[0m", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m 1777\u001b[0m \u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1778\u001b[0m \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1779\u001b[0;31m initial_epoch=initial_epoch)\n\u001b[0m\u001b[1;32m 1780\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1781\u001b[0m def evaluate_generator(self,\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_generator.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m 202\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m outs = model.train_on_batch(\n\u001b[0;32m--> 204\u001b[0;31m x, y, sample_weight=sample_weight, class_weight=class_weight)\n\u001b[0m\u001b[1;32m 205\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mtrain_on_batch\u001b[0;34m(self, x, y, sample_weight, class_weight)\u001b[0m\n\u001b[1;32m 1549\u001b[0m \u001b[0mins\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0msample_weights\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1550\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1551\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_train_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1552\u001b[0m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36m_make_train_function\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 596\u001b[0m \u001b[0;31m# Training updates\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 597\u001b[0m updates = self.optimizer.get_updates(\n\u001b[0;32m--> 598\u001b[0;31m params=self._collected_trainable_weights, loss=self.total_loss)\n\u001b[0m\u001b[1;32m 599\u001b[0m \u001b[0;31m# Unconditional updates\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 600\u001b[0m \u001b[0mupdates\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_updates_for\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/optimizers.py\u001b[0m in \u001b[0;36mget_updates\u001b[0;34m(self, loss, params)\u001b[0m\n\u001b[1;32m 478\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 479\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvhat\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgrads\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvhats\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 480\u001b[0;31m \u001b[0mm_t\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbeta_1\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1.\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbeta_1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 481\u001b[0m \u001b[0mv_t\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbeta_2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1.\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbeta_2\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mmath_ops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msquare\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 482\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mamsgrad\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/ops/resource_variable_ops.py\u001b[0m in \u001b[0;36m_run_op\u001b[0;34m(a, *args)\u001b[0m\n\u001b[1;32m 856\u001b[0m \u001b[0;31m# pylint: disable=protected-access\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 857\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_AsTensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 858\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtensor_oper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 859\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 860\u001b[0m \u001b[0;31m# Propagate __doc__ to wrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/ops/math_ops.py\u001b[0m in \u001b[0;36mr_binary_op_wrapper\u001b[0;34m(y, x)\u001b[0m\n\u001b[1;32m 876\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname_scope\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 877\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconvert_to_tensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbase_dtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"x\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 878\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 879\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 880\u001b[0m \u001b[0;31m# Propagate func.__doc__ to the wrappers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/ops/gen_math_ops.py\u001b[0m in \u001b[0;36msub\u001b[0;34m(x, y, name)\u001b[0m\n\u001b[1;32m 8186\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0m_ctx\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0m_ctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_eager_context\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_eager\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8187\u001b[0m _, _, _op = _op_def_lib._apply_op_helper(\n\u001b[0;32m-> 8188\u001b[0;31m \"Sub\", x=x, y=y, name=name)\n\u001b[0m\u001b[1;32m 8189\u001b[0m \u001b[0m_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_op\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8190\u001b[0m \u001b[0m_inputs_flat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_op\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/framework/op_def_library.py\u001b[0m in \u001b[0;36m_apply_op_helper\u001b[0;34m(self, op_type_name, name, **keywords)\u001b[0m\n\u001b[1;32m 785\u001b[0m op = g.create_op(op_type_name, inputs, output_types, name=scope,\n\u001b[1;32m 786\u001b[0m \u001b[0minput_types\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minput_types\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mattr_protos\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 787\u001b[0;31m op_def=op_def)\n\u001b[0m\u001b[1;32m 788\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0moutput_structure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop_def\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_stateful\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 789\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/util/deprecation.py\u001b[0m in \u001b[0;36mnew_func\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 425\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_in_graph_mode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIS_IN_GRAPH_MODE\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_PRINT_DEPRECATION_WARNINGS\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 426\u001b[0m \u001b[0minvalid_args\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 427\u001b[0;31m \u001b[0mnamed_args\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_inspect\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetcallargs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 428\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mspec\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdeprecated_positions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 429\u001b[0m if (spec.position < len(args) and\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/util/tf_inspect.py\u001b[0m in \u001b[0;36mgetcallargs\u001b[0;34m(func, *positional, **named)\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[0margspec\u001b[0m \u001b[0mwill\u001b[0m \u001b[0mbe\u001b[0m \u001b[0mused\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 234\u001b[0m \"\"\"\n\u001b[0;32m--> 235\u001b[0;31m \u001b[0margspec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetfullargspec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 236\u001b[0m \u001b[0mcall_args\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnamed\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[0mthis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'im_self'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'__self__'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/util/tf_inspect.py\u001b[0m in \u001b[0;36mgetfullargspec\u001b[0;34m(obj)\u001b[0m\n\u001b[1;32m 214\u001b[0m return next((d.decorator_argspec\n\u001b[1;32m 215\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0md\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdecorators\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 216\u001b[0;31m if d.decorator_argspec is not None), _getfullargspec(target))\n\u001b[0m\u001b[1;32m 217\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/inspect.py\u001b[0m in \u001b[0;36mgetfullargspec\u001b[0;34m(func)\u001b[0m\n\u001b[1;32m 1086\u001b[0m \u001b[0mfollow_wrapper_chains\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1087\u001b[0m \u001b[0mskip_bound_arg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1088\u001b[0;31m sigcls=Signature)\n\u001b[0m\u001b[1;32m 1089\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mex\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1090\u001b[0m \u001b[0;31m# Most of the times 'signature' will raise ValueError.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/inspect.py\u001b[0m in \u001b[0;36m_signature_from_callable\u001b[0;34m(obj, follow_wrapper_chains, skip_bound_arg, sigcls)\u001b[0m\n\u001b[1;32m 2223\u001b[0m \u001b[0;31m# If it's a pure Python function, or an object that is duck type\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2224\u001b[0m \u001b[0;31m# of a Python function (Cython functions, for instance), then:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2225\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_signature_from_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msigcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2226\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2227\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0m_signature_is_builtin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/inspect.py\u001b[0m in \u001b[0;36m_signature_from_function\u001b[0;34m(cls, func)\u001b[0m\n\u001b[1;32m 2140\u001b[0m return cls(parameters,\n\u001b[1;32m 2141\u001b[0m \u001b[0mreturn_annotation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mannotations\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'return'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_empty\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2142\u001b[0;31m __validate_parameters__=is_duck_function)\n\u001b[0m\u001b[1;32m 2143\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2144\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/inspect.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, parameters, return_annotation, __validate_parameters__)\u001b[0m\n\u001b[1;32m 2709\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2710\u001b[0m params = OrderedDict(((param.name, param)\n\u001b[0;32m-> 2711\u001b[0;31m for param in parameters))\n\u001b[0m\u001b[1;32m 2712\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2713\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parameters\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtypes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mMappingProxyType\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "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_digit4to6_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)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/300\n", " 999/1000 [============================>.] - ETA: 0s - loss: 0.0117Epoch 1/300\n", "1000/1000 [==============================] - 212s 212ms/step - loss: 0.0117 - val_loss: 0.0123\n", "Epoch 2/300\n", "1000/1000 [==============================] - 178s 178ms/step - loss: 0.0089 - val_loss: 0.0094\n", "Epoch 3/300\n", "1000/1000 [==============================] - 185s 185ms/step - loss: 0.0090 - val_loss: 0.0110\n", "Epoch 4/300\n", "1000/1000 [==============================] - 189s 189ms/step - loss: 0.0076 - val_loss: 0.0105\n", "Epoch 5/300\n", "1000/1000 [==============================] - 178s 178ms/step - loss: 0.0089 - val_loss: 0.0098\n", "Epoch 6/300\n", "1000/1000 [==============================] - 195s 195ms/step - loss: 0.0079 - val_loss: 0.0113\n", "Epoch 7/300\n", "1000/1000 [==============================] - 193s 193ms/step - loss: 0.0058 - val_loss: 0.0083\n", "Epoch 8/300\n", "1000/1000 [==============================] - 188s 188ms/step - loss: 0.0072 - val_loss: 0.0074\n", "Epoch 9/300\n", "1000/1000 [==============================] - 189s 189ms/step - loss: 0.0062 - val_loss: 0.0062\n", "Epoch 10/300\n", "1000/1000 [==============================] - 180s 180ms/step - loss: 0.0064 - val_loss: 0.0078\n", "Epoch 11/300\n", "1000/1000 [==============================] - 180s 180ms/step - loss: 0.0056 - val_loss: 0.0052\n", "Epoch 12/300\n", "1000/1000 [==============================] - 184s 184ms/step - loss: 0.0059 - val_loss: 0.0064\n", "Epoch 13/300\n", "1000/1000 [==============================] - 186s 186ms/step - loss: 0.0052 - val_loss: 0.0063\n", "Epoch 14/300\n", "1000/1000 [==============================] - 185s 185ms/step - loss: 0.0056 - val_loss: 0.0055\n", "Epoch 15/300\n", "1000/1000 [==============================] - 172s 172ms/step - loss: 0.0044 - val_loss: 0.0039\n", "Epoch 16/300\n", "1000/1000 [==============================] - 199s 199ms/step - loss: 0.0055 - val_loss: 0.0047\n", "Epoch 17/300\n", "1000/1000 [==============================] - 186s 186ms/step - loss: 0.0048 - val_loss: 0.0040\n", "Epoch 18/300\n", "1000/1000 [==============================] - 183s 183ms/step - loss: 0.0052 - val_loss: 0.0065\n", "Epoch 19/300\n", "1000/1000 [==============================] - 180s 180ms/step - loss: 0.0048 - val_loss: 0.0055\n", "Epoch 20/300\n", "1000/1000 [==============================] - 177s 177ms/step - loss: 0.0051 - val_loss: 0.0042\n", "Epoch 21/300\n", "1000/1000 [==============================] - 181s 181ms/step - loss: 0.0044 - val_loss: 0.0021\n", "Epoch 22/300\n", "1000/1000 [==============================] - 180s 180ms/step - loss: 0.0047 - val_loss: 0.0036\n", "Epoch 23/300\n", "1000/1000 [==============================] - 182s 182ms/step - loss: 0.0045 - val_loss: 0.0052\n", "Epoch 24/300\n", "1000/1000 [==============================] - 169s 169ms/step - loss: 0.0045 - val_loss: 0.0044\n", "Epoch 25/300\n", "1000/1000 [==============================] - 157s 157ms/step - loss: 0.0048 - val_loss: 0.0030\n", "Epoch 26/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0042 - val_loss: 0.0060\n", "Epoch 27/300\n", "1000/1000 [==============================] - 148s 148ms/step - loss: 0.0047 - val_loss: 0.0067\n", "Epoch 28/300\n", "1000/1000 [==============================] - 173s 173ms/step - loss: 0.0036 - val_loss: 0.0056\n", "Epoch 29/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0049 - val_loss: 0.0025\n", "Epoch 30/300\n", "1000/1000 [==============================] - 154s 154ms/step - loss: 0.0045 - val_loss: 0.0043\n", "Epoch 31/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0041 - val_loss: 0.0023\n", "Epoch 32/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0036 - val_loss: 0.0044\n", "Epoch 33/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0036 - val_loss: 0.0024\n", "Epoch 34/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0041 - val_loss: 0.0018\n", "Epoch 35/300\n", "1000/1000 [==============================] - 142s 142ms/step - loss: 0.0043 - val_loss: 0.0043\n", "Epoch 36/300\n", "1000/1000 [==============================] - 188s 188ms/step - loss: 0.0036 - val_loss: 0.0030\n", "Epoch 37/300\n", "1000/1000 [==============================] - 147s 147ms/step - loss: 0.0042 - val_loss: 0.0033\n", "Epoch 38/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0040 - val_loss: 0.0039\n", "Epoch 39/300\n", "1000/1000 [==============================] - 147s 147ms/step - loss: 0.0033 - val_loss: 0.0049\n", "Epoch 40/300\n", "1000/1000 [==============================] - 155s 155ms/step - loss: 0.0039 - val_loss: 0.0035\n", "Epoch 41/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0033 - val_loss: 0.0019\n", "Epoch 42/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0039 - val_loss: 0.0021\n", "Epoch 43/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0040 - val_loss: 0.0040\n", "Epoch 44/300\n", "1000/1000 [==============================] - 165s 165ms/step - loss: 0.0034 - val_loss: 0.0024\n", "Epoch 45/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0039 - val_loss: 0.0036\n", "Epoch 46/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0038 - val_loss: 0.0033\n", "Epoch 47/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0040 - val_loss: 0.0055\n", "Epoch 48/300\n", "1000/1000 [==============================] - 157s 157ms/step - loss: 0.0042 - val_loss: 0.0030\n", "Epoch 49/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0039 - val_loss: 0.0031\n", "Epoch 50/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0031 - val_loss: 0.0028\n", "Epoch 51/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0031 - val_loss: 0.0019\n", "Epoch 52/300\n", "1000/1000 [==============================] - 154s 154ms/step - loss: 0.0028 - val_loss: 0.0045\n", "Epoch 53/300\n", "1000/1000 [==============================] - 141s 141ms/step - loss: 0.0040 - val_loss: 0.0035\n", "Epoch 54/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0029 - val_loss: 0.0028\n", "Epoch 55/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0031 - val_loss: 0.0023\n", "Epoch 56/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0030 - val_loss: 0.0027\n", "Epoch 57/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0034 - val_loss: 0.0062\n", "Epoch 58/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0030 - val_loss: 0.0028\n", "Epoch 59/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0030 - val_loss: 0.0024\n", "Epoch 60/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0031 - val_loss: 0.0019\n", "Epoch 61/300\n", "1000/1000 [==============================] - 180s 180ms/step - loss: 0.0032 - val_loss: 0.0022\n", "Epoch 62/300\n", "1000/1000 [==============================] - 196s 196ms/step - loss: 0.0026 - val_loss: 0.0027\n", "Epoch 63/300\n", "1000/1000 [==============================] - 147s 147ms/step - loss: 0.0036 - val_loss: 0.0020\n", "Epoch 64/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0030 - val_loss: 0.0030\n", "Epoch 65/300\n", "1000/1000 [==============================] - 183s 183ms/step - loss: 0.0029 - val_loss: 0.0022\n", "Epoch 66/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0034 - val_loss: 0.0047\n", "Epoch 67/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0029 - val_loss: 0.0032\n", "Epoch 68/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0027 - val_loss: 0.0045\n", "Epoch 69/300\n", "1000/1000 [==============================] - 168s 168ms/step - loss: 0.0026 - val_loss: 0.0033\n", "Epoch 70/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0030 - val_loss: 0.0019\n", "Epoch 71/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0030 - val_loss: 0.0024\n", "Epoch 72/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0032 - val_loss: 0.0041\n", "Epoch 73/300\n", "1000/1000 [==============================] - 150s 150ms/step - loss: 0.0027 - val_loss: 0.0028\n", "Epoch 74/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0029 - val_loss: 0.0037\n", "Epoch 75/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0024 - val_loss: 0.0041\n", "Epoch 76/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0022 - val_loss: 0.0011\n", "Epoch 77/300\n", "1000/1000 [==============================] - 154s 154ms/step - loss: 0.0027 - val_loss: 0.0043\n", "Epoch 78/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0027 - val_loss: 0.0029\n", "Epoch 79/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0033 - val_loss: 0.0021\n", "Epoch 80/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0023 - val_loss: 0.0022\n", "Epoch 81/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0028 - val_loss: 0.0022\n", "Epoch 82/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0032 - val_loss: 0.0017\n", "Epoch 83/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0025 - val_loss: 0.0010\n", "Epoch 84/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0025 - val_loss: 0.0023\n", "Epoch 85/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0031 - val_loss: 0.0018\n", "Epoch 86/300\n", "1000/1000 [==============================] - 159s 159ms/step - loss: 0.0021 - val_loss: 0.0025\n", "Epoch 87/300\n", "1000/1000 [==============================] - 175s 175ms/step - loss: 0.0026 - val_loss: 0.0022\n", "Epoch 88/300\n", "1000/1000 [==============================] - 182s 182ms/step - loss: 0.0027 - val_loss: 0.0020\n", "Epoch 89/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0025 - val_loss: 0.0035\n", "Epoch 90/300\n", "1000/1000 [==============================] - 139s 139ms/step - loss: 0.0022 - val_loss: 0.0026\n", "Epoch 91/300\n", "1000/1000 [==============================] - 150s 150ms/step - loss: 0.0023 - val_loss: 0.0018\n", "Epoch 92/300\n", "1000/1000 [==============================] - 176s 176ms/step - loss: 0.0027 - val_loss: 0.0020\n", "Epoch 93/300\n", "1000/1000 [==============================] - 169s 169ms/step - loss: 0.0027 - val_loss: 0.0036\n", "Epoch 94/300\n", "1000/1000 [==============================] - 179s 179ms/step - loss: 0.0021 - val_loss: 0.0050\n", "Epoch 95/300\n", "1000/1000 [==============================] - 190s 190ms/step - loss: 0.0021 - val_loss: 0.0033\n", "Epoch 96/300\n", "1000/1000 [==============================] - 175s 175ms/step - loss: 0.0028 - val_loss: 0.0024\n", "Epoch 97/300\n", "1000/1000 [==============================] - 182s 182ms/step - loss: 0.0028 - val_loss: 0.0030\n", "Epoch 98/300\n", "1000/1000 [==============================] - 179s 179ms/step - loss: 0.0025 - val_loss: 0.0019\n", "Epoch 99/300\n", "1000/1000 [==============================] - 139s 139ms/step - loss: 0.0019 - val_loss: 0.0024\n", "Epoch 100/300\n", "1000/1000 [==============================] - 138s 138ms/step - loss: 0.0020 - val_loss: 0.0022\n", "Epoch 101/300\n", "1000/1000 [==============================] - 179s 179ms/step - loss: 0.0025 - val_loss: 0.0015\n", "Epoch 102/300\n", "1000/1000 [==============================] - 170s 170ms/step - loss: 0.0020 - val_loss: 9.1135e-04\n", "Epoch 103/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0024 - val_loss: 0.0026\n", "Epoch 104/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0020 - val_loss: 0.0019\n", "Epoch 105/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0021 - val_loss: 0.0019\n", "Epoch 106/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 0.0013\n", "Epoch 107/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0022 - val_loss: 0.0025\n", "Epoch 108/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0021 - val_loss: 0.0020\n", "Epoch 109/300\n", "1000/1000 [==============================] - 166s 166ms/step - loss: 0.0020 - val_loss: 0.0043\n", "Epoch 110/300\n", "1000/1000 [==============================] - 181s 181ms/step - loss: 0.0017 - val_loss: 0.0024\n", "Epoch 111/300\n", "1000/1000 [==============================] - 178s 178ms/step - loss: 0.0018 - val_loss: 0.0016\n", "Epoch 112/300\n", "1000/1000 [==============================] - 174s 174ms/step - loss: 0.0028 - val_loss: 0.0020\n", "Epoch 113/300\n", "1000/1000 [==============================] - 182s 182ms/step - loss: 0.0020 - val_loss: 0.0015\n", "Epoch 114/300\n", "1000/1000 [==============================] - 181s 181ms/step - loss: 0.0019 - val_loss: 0.0039\n", "Epoch 115/300\n", "1000/1000 [==============================] - 182s 182ms/step - loss: 0.0019 - val_loss: 0.0020\n", "Epoch 116/300\n", "1000/1000 [==============================] - 183s 183ms/step - loss: 0.0020 - val_loss: 0.0019\n", "Epoch 117/300\n", "1000/1000 [==============================] - 183s 183ms/step - loss: 0.0024 - val_loss: 0.0031\n", "Epoch 118/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0018 - val_loss: 0.0023\n", "Epoch 119/300\n", "1000/1000 [==============================] - 145s 145ms/step - loss: 0.0023 - val_loss: 0.0021\n", "Epoch 120/300\n", "1000/1000 [==============================] - 152s 152ms/step - loss: 0.0024 - val_loss: 0.0028\n", "Epoch 121/300\n", "1000/1000 [==============================] - 155s 155ms/step - loss: 0.0025 - val_loss: 0.0040\n", "Epoch 122/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0018 - val_loss: 9.9961e-04\n", "Epoch 123/300\n", "1000/1000 [==============================] - 139s 139ms/step - loss: 0.0021 - val_loss: 0.0035\n", "Epoch 124/300\n", "1000/1000 [==============================] - 178s 178ms/step - loss: 0.0024 - val_loss: 9.8802e-04\n", "Epoch 125/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0021 - val_loss: 0.0011\n", "Epoch 126/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0021 - val_loss: 0.0021\n", "Epoch 127/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0018 - val_loss: 0.0017\n", "Epoch 128/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0021 - val_loss: 8.7637e-04\n", "Epoch 129/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0022 - val_loss: 0.0023\n", "Epoch 130/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0024 - val_loss: 0.0017\n", "Epoch 131/300\n", "1000/1000 [==============================] - 133s 133ms/step - loss: 0.0014 - val_loss: 0.0016\n", "Epoch 132/300\n", "1000/1000 [==============================] - 171s 171ms/step - loss: 0.0017 - val_loss: 0.0017\n", "Epoch 133/300\n", "1000/1000 [==============================] - 189s 189ms/step - loss: 0.0015 - val_loss: 0.0012\n", "Epoch 134/300\n", "1000/1000 [==============================] - 192s 192ms/step - loss: 0.0017 - val_loss: 8.8747e-04\n", "Epoch 135/300\n", "1000/1000 [==============================] - 180s 180ms/step - loss: 0.0019 - val_loss: 0.0022\n", "Epoch 136/300\n", "1000/1000 [==============================] - 184s 184ms/step - loss: 0.0022 - val_loss: 0.0022\n", "Epoch 137/300\n", "1000/1000 [==============================] - 192s 192ms/step - loss: 0.0022 - val_loss: 0.0027\n", "Epoch 138/300\n", "1000/1000 [==============================] - 191s 191ms/step - loss: 0.0023 - val_loss: 0.0022\n", "Epoch 139/300\n", "1000/1000 [==============================] - 189s 189ms/step - loss: 0.0016 - val_loss: 0.0011\n", "Epoch 140/300\n", "1000/1000 [==============================] - 178s 178ms/step - loss: 0.0019 - val_loss: 0.0032\n", "Epoch 141/300\n", "1000/1000 [==============================] - 187s 187ms/step - loss: 0.0022 - val_loss: 0.1112\n", "Epoch 142/300\n", "1000/1000 [==============================] - 153s 153ms/step - loss: 0.0020 - val_loss: 0.0011\n", "Epoch 143/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 0.0037\n", "Epoch 144/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0020 - val_loss: 0.0035\n", "Epoch 145/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0022\n", "Epoch 146/300\n", "1000/1000 [==============================] - 149s 149ms/step - loss: 0.0019 - val_loss: 0.0014\n", "Epoch 147/300\n", "1000/1000 [==============================] - 133s 133ms/step - loss: 0.0022 - val_loss: 0.0012\n", "Epoch 148/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 0.0015\n", "Epoch 149/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0019 - val_loss: 0.0013\n", "Epoch 150/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0021\n", "Epoch 151/300\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0019 - val_loss: 0.0018\n", "Epoch 152/300\n", "1000/1000 [==============================] - 133s 133ms/step - loss: 0.0024 - val_loss: 0.0021\n", "Epoch 153/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 0.0019\n", "Epoch 154/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0023 - val_loss: 0.0014\n", "Epoch 155/300\n", "1000/1000 [==============================] - 154s 154ms/step - loss: 0.0015 - val_loss: 0.0026\n", "Epoch 156/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0019 - val_loss: 0.0020\n", "Epoch 157/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0025 - val_loss: 0.0044\n", "Epoch 158/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0018 - val_loss: 0.0039\n", "Epoch 159/300\n", "1000/1000 [==============================] - 159s 159ms/step - loss: 0.0022 - val_loss: 0.0019\n", "Epoch 160/300\n", "1000/1000 [==============================] - 144s 144ms/step - loss: 0.0025 - val_loss: 0.0016\n", "Epoch 161/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 0.0011\n", "Epoch 162/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0018 - val_loss: 0.0013\n", "Epoch 163/300\n", "1000/1000 [==============================] - 141s 141ms/step - loss: 0.0017 - val_loss: 0.0012\n", "Epoch 164/300\n", "1000/1000 [==============================] - 169s 169ms/step - loss: 0.0019 - val_loss: 0.0023\n", "Epoch 165/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 9.8551e-04\n", "Epoch 166/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0019\n", "Epoch 167/300\n", "1000/1000 [==============================] - 137s 137ms/step - loss: 0.0012 - val_loss: 0.0014\n", "Epoch 168/300\n", "1000/1000 [==============================] - 164s 164ms/step - loss: 0.0015 - val_loss: 0.0020\n", "Epoch 169/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0017 - val_loss: 5.7275e-04\n", "Epoch 170/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0026\n", "Epoch 171/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0019 - val_loss: 0.0015\n", "Epoch 172/300\n", "1000/1000 [==============================] - 158s 158ms/step - loss: 0.0017 - val_loss: 7.7992e-04\n", "Epoch 173/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 0.0017\n", "Epoch 174/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0020 - val_loss: 0.0022\n", "Epoch 175/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0022\n", "Epoch 176/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0016 - val_loss: 0.0016\n", "Epoch 177/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 0.0011\n", "Epoch 178/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 7.6523e-04\n", "Epoch 179/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 0.0010\n", "Epoch 180/300\n", "1000/1000 [==============================] - 136s 136ms/step - loss: 0.0015 - val_loss: 5.9600e-04\n", "Epoch 181/300\n", "1000/1000 [==============================] - 167s 167ms/step - loss: 0.0015 - val_loss: 7.2295e-04\n", "Epoch 182/300\n", "1000/1000 [==============================] - 154s 154ms/step - loss: 0.0014 - val_loss: 0.0019\n", "Epoch 183/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0018 - val_loss: 0.0014\n", "Epoch 184/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0020 - val_loss: 0.0013\n", "Epoch 185/300\n", "1000/1000 [==============================] - 149s 149ms/step - loss: 0.0018 - val_loss: 0.0025\n", "Epoch 186/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0011\n", "Epoch 187/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0011\n", "Epoch 188/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0018 - val_loss: 0.0016\n", "Epoch 189/300\n", "1000/1000 [==============================] - 142s 142ms/step - loss: 0.0017 - val_loss: 0.0016\n", "Epoch 190/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0024 - val_loss: 6.4412e-04\n", "Epoch 191/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0017\n", "Epoch 192/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0026\n", "Epoch 193/300\n", "1000/1000 [==============================] - 142s 142ms/step - loss: 0.0016 - val_loss: 0.0010\n", "Epoch 194/300\n", "1000/1000 [==============================] - 136s 136ms/step - loss: 0.0021 - val_loss: 0.0017\n", "Epoch 195/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0020\n", "Epoch 196/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0018\n", "Epoch 197/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0013\n", "Epoch 198/300\n", "1000/1000 [==============================] - 140s 140ms/step - loss: 0.0014 - val_loss: 0.0011\n", "Epoch 199/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0014\n", "Epoch 200/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0011\n", "Epoch 201/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 9.8165e-04\n", "Epoch 202/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 0.0011\n", "Epoch 203/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0025\n", "Epoch 204/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 7.7435e-04\n", "Epoch 205/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 0.0020\n", "Epoch 206/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0025\n", "Epoch 207/300\n", "1000/1000 [==============================] - 152s 152ms/step - loss: 0.0017 - val_loss: 0.0023\n", "Epoch 208/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0022\n", "Epoch 209/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 9.4707e-04\n", "Epoch 210/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 0.0014\n", "Epoch 211/300\n", "1000/1000 [==============================] - 148s 148ms/step - loss: 0.0014 - val_loss: 0.0012\n", "Epoch 212/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 0.0022\n", "Epoch 213/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0017 - val_loss: 0.0019\n", "Epoch 214/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 9.4521e-04 - val_loss: 0.0017\n", "Epoch 215/300\n", "1000/1000 [==============================] - 145s 145ms/step - loss: 0.0011 - val_loss: 0.0013\n", "Epoch 216/300\n", "1000/1000 [==============================] - 138s 138ms/step - loss: 0.0014 - val_loss: 8.5960e-04\n", "Epoch 217/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 0.0016\n", "Epoch 218/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0019 - val_loss: 0.0016\n", "Epoch 219/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0010 - val_loss: 0.0018\n", "Epoch 220/300\n", "1000/1000 [==============================] - 138s 138ms/step - loss: 0.0013 - val_loss: 0.0017\n", "Epoch 221/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 0.0020\n", "Epoch 222/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0011 - val_loss: 0.0011\n", "Epoch 223/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0011 - val_loss: 0.0021\n", "Epoch 224/300\n", "1000/1000 [==============================] - 138s 138ms/step - loss: 0.0014 - val_loss: 5.4602e-04\n", "Epoch 225/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0021 - val_loss: 8.8988e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 226/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0012\n", "Epoch 227/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0013\n", "Epoch 228/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 9.6861e-04\n", "Epoch 229/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0016\n", "Epoch 230/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 6.1688e-04\n", "Epoch 231/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0015\n", "Epoch 232/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0014\n", "Epoch 233/300\n", "1000/1000 [==============================] - 137s 137ms/step - loss: 0.0013 - val_loss: 0.0013\n", "Epoch 234/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0019 - val_loss: 0.0019\n", "Epoch 235/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0023\n", "Epoch 236/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0013\n", "Epoch 237/300\n", "1000/1000 [==============================] - 137s 137ms/step - loss: 0.0016 - val_loss: 9.2824e-04\n", "Epoch 238/300\n", "1000/1000 [==============================] - 137s 137ms/step - loss: 0.0011 - val_loss: 9.0287e-04\n", "Epoch 239/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0019 - val_loss: 9.2114e-04\n", "Epoch 240/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 5.2642e-04\n", "Epoch 241/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0011 - val_loss: 0.0013\n", "Epoch 242/300\n", "1000/1000 [==============================] - 150s 150ms/step - loss: 0.0014 - val_loss: 0.0028\n", "Epoch 243/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 0.0012\n", "Epoch 244/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0029\n", "Epoch 245/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 0.0014\n", "Epoch 246/300\n", "1000/1000 [==============================] - 152s 152ms/step - loss: 0.0016 - val_loss: 5.1604e-04\n", "Epoch 247/300\n", "1000/1000 [==============================] - 136s 136ms/step - loss: 0.0012 - val_loss: 0.0018\n", "Epoch 248/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 0.0020\n", "Epoch 249/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0017 - val_loss: 3.4457e-04\n", "Epoch 250/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 0.0017\n", "Epoch 251/300\n", "1000/1000 [==============================] - 141s 141ms/step - loss: 0.0013 - val_loss: 0.0014\n", "Epoch 252/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 6.7468e-04\n", "Epoch 253/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0018\n", "Epoch 254/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 6.8391e-04\n", "Epoch 255/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0010 - val_loss: 0.0020\n", "Epoch 256/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 0.0017\n", "Epoch 257/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0010 - val_loss: 0.0012\n", "Epoch 258/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 8.4647e-04\n", "Epoch 259/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0011 - val_loss: 0.0026\n", "Epoch 260/300\n", "1000/1000 [==============================] - 138s 138ms/step - loss: 0.0012 - val_loss: 0.0014\n", "Epoch 261/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 9.9913e-04\n", "Epoch 262/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0011\n", "Epoch 263/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 0.0025\n", "Epoch 264/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0011 - val_loss: 9.0106e-04\n", "Epoch 265/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0013 - val_loss: 6.5029e-04\n", "Epoch 266/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0011 - val_loss: 0.0011\n", "Epoch 267/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 0.0016\n", "Epoch 268/300\n", "1000/1000 [==============================] - 141s 141ms/step - loss: 0.0013 - val_loss: 5.8865e-04\n", "Epoch 269/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0013 - val_loss: 6.9571e-04\n", "Epoch 270/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0010 - val_loss: 4.8008e-04\n", "Epoch 271/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 8.6520e-04\n", "Epoch 272/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 0.0014\n", "Epoch 273/300\n", "1000/1000 [==============================] - 146s 146ms/step - loss: 0.0011 - val_loss: 0.0016\n", "Epoch 274/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 9.6764e-04 - val_loss: 0.0013\n", "Epoch 275/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0016 - val_loss: 0.0015\n", "Epoch 276/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0015 - val_loss: 0.0011\n", "Epoch 277/300\n", "1000/1000 [==============================] - 139s 139ms/step - loss: 0.0012 - val_loss: 5.0505e-04\n", "Epoch 278/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 0.0010\n", "Epoch 279/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0013 - val_loss: 2.5568e-04\n", "Epoch 280/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0014\n", "Epoch 281/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0011 - val_loss: 0.0062\n", "Epoch 282/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0011 - val_loss: 0.0022\n", "Epoch 283/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 0.0020\n", "Epoch 284/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0011 - val_loss: 4.4470e-04\n", "Epoch 285/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0018\n", "Epoch 286/300\n", "1000/1000 [==============================] - 148s 148ms/step - loss: 9.0743e-04 - val_loss: 0.0016\n", "Epoch 287/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0012 - val_loss: 0.0012\n", "Epoch 288/300\n", "1000/1000 [==============================] - 135s 135ms/step - loss: 0.0014 - val_loss: 4.8864e-04\n", "Epoch 289/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 3.8594e-04\n", "Epoch 290/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0013 - val_loss: 0.0012\n", "Epoch 291/300\n", "1000/1000 [==============================] - 136s 136ms/step - loss: 0.0010 - val_loss: 2.4477e-04\n", "Epoch 292/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 4.7540e-04\n", "Epoch 293/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0012 - val_loss: 4.7845e-04\n", "Epoch 294/300\n", "1000/1000 [==============================] - 134s 134ms/step - loss: 0.0014 - val_loss: 0.0018\n", "Epoch 295/300\n", "1000/1000 [==============================] - 142s 142ms/step - loss: 0.0014 - val_loss: 7.2145e-04\n", "Epoch 296/300\n", " 558/1000 [===============>..............] - ETA: 55s - loss: 8.3824e-04" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Process ForkPoolWorker-3113:\n", "Traceback (most recent call last):\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 254, in _bootstrap\n", " self.run()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", " self._target(*self._args, **self._kwargs)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/pool.py\", line 108, in worker\n", " task = get()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/queues.py\", line 343, in get\n", " res = self._reader.recv_bytes()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/connection.py\", line 216, in recv_bytes\n", " buf = self._recv_bytes(maxlength)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/connection.py\", line 407, in _recv_bytes\n", " buf = self._recv(4)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/connection.py\", line 379, in _recv\n", " chunk = read(handle, remaining)\n", "KeyboardInterrupt\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mloss\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m'ctc'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0my_true\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_pred\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0my_pred\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mAdam\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1e-4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mamsgrad\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m model.fit_generator(train_data, epochs=300, validation_data=valid_data, workers=4, use_multiprocessing=True,\n\u001b[0;32m---> 10\u001b[0;31m callbacks=callbacks)\n\u001b[0m", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m 1777\u001b[0m \u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1778\u001b[0m \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1779\u001b[0;31m initial_epoch=initial_epoch)\n\u001b[0m\u001b[1;32m 1780\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1781\u001b[0m def evaluate_generator(self,\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_generator.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m 202\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m outs = model.train_on_batch(\n\u001b[0;32m--> 204\u001b[0;31m x, y, sample_weight=sample_weight, class_weight=class_weight)\n\u001b[0m\u001b[1;32m 205\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mtrain_on_batch\u001b[0;34m(self, x, y, sample_weight, class_weight)\u001b[0m\n\u001b[1;32m 1550\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1551\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_train_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1552\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1554\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m 2912\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_callable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfeed_arrays\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_symbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbol_vals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msession\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2913\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2914\u001b[0;31m \u001b[0mfetched\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_callable_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marray_vals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2915\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_fetch_callbacks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfetched\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fetches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2916\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mfetched\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1380\u001b[0m ret = tf_session.TF_SessionRunCallable(\n\u001b[1;32m 1381\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_handle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatus\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1382\u001b[0;31m run_metadata_ptr)\n\u001b[0m\u001b[1;32m 1383\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1384\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] }, { "name": "stderr", "output_type": "stream", "text": [ "Process ForkPoolWorker-3114:\n", "Process ForkPoolWorker-3115:\n", "Process ForkPoolWorker-3116:\n", "Traceback (most recent call last):\n", "Traceback (most recent call last):\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 254, in _bootstrap\n", " self.run()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 254, in _bootstrap\n", " self.run()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", " self._target(*self._args, **self._kwargs)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", " self._target(*self._args, **self._kwargs)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", " result = (True, func(*args, **kwds))\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", " result = (True, func(*args, **kwds))\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/utils/data_utils.py\", line 432, in get_index\n", " return _SHARED_SEQUENCES[uid][i]\n", "Traceback (most recent call last):\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/site-packages/tensorflow/python/keras/utils/data_utils.py\", line 432, in get_index\n", " return _SHARED_SEQUENCES[uid][i]\n", " File \"\", line 29, in __getitem__\n", " image, random_str = rebuild_img(random.choice(glob.glob('Digit4/*.jpg')))\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 254, in _bootstrap\n", " self.run()\n", " File \"\", line 29, in __getitem__\n", " image, random_str = rebuild_img(random.choice(glob.glob('Digit4/*.jpg')))\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/glob.py\", line 20, in glob\n", " return list(iglob(pathname, recursive=recursive))\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", " self._target(*self._args, **self._kwargs)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/glob.py\", line 20, in glob\n", " return list(iglob(pathname, recursive=recursive))\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/glob.py\", line 64, in iglob\n", " for name in glob_in_dir(dirname, basename):\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/pool.py\", line 108, in worker\n", " task = get()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/glob.py\", line 65, in iglob\n", " yield os.path.join(dirname, name)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/glob.py\", line 78, in glob1\n", " names = os.listdir(dirname)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/queues.py\", line 342, in get\n", " with self._rlock:\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/posixpath.py\", line 81, in join\n", " for b in p:\n", "KeyboardInterrupt\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/synchronize.py\", line 96, in __enter__\n", " return self._semlock.__enter__()\n", "KeyboardInterrupt\n", "KeyboardInterrupt\n", "Process ForkPoolWorker-3125:\n", "Traceback (most recent call last):\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 254, in _bootstrap\n", " self.run()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", " self._target(*self._args, **self._kwargs)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/pool.py\", line 108, in worker\n", " task = get()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/queues.py\", line 343, in get\n", " res = self._reader.recv_bytes()\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/connection.py\", line 216, in recv_bytes\n", " buf = self._recv_bytes(maxlength)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/connection.py\", line 407, in _recv_bytes\n", " buf = self._recv(4)\n", " File \"/home/python/anaconda3/envs/dl_nlp/lib/python3.5/multiprocessing/connection.py\", line 379, in _recv\n", " chunk = read(handle, remaining)\n", "KeyboardInterrupt\n" ] } ], "source": [ "# 载入最好的模型继续训练一会\n", "model.load_weights('gru_digit4to6_ctc_best.h5')\n", "\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_digit4to6_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=300, validation_data=valid_data, workers=4, use_multiprocessing=True,\n", " callbacks=callbacks)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "# model.load_weights('ctc_best.h5')\n", "base_model.save('gru_digit_base_model.h5')" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "总耗时: 1.0670440196990967\n", "128 0\n" ] } ], "source": [ "# 测试模型\n", "characters2 = characters + ' '\n", "import time\n", "\n", "def get_test_data():\n", " '''\n", " 从本地获取验证码图片并生成测试数据\n", " ''' \n", " X = []\n", " Y = []\n", " for path in glob.glob('../FileInfo/*.jpg'): # Digit5/*.jpg\n", " random_str = path.split('_')[-1][:-4] \n", " if random_str.isdigit() and len(random_str) ==4:\n", " img = Image.open(path)\n", " X.append(np.array(img.resize((100,50), 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 = CaptchaSequence2(characters, batch_size=128, steps=1)\n", "\n", "pos = neg = 0\n", "t1 = time.time()\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])[:, :6]\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]]) \n", " y_true = ''.join([characters[x] for x in y_test[j] if x < len(characters)])\n", " if out != 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])))" ] }, { "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": "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\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 }