Created
May 14, 2019 10:52
-
-
Save BrikerMan/12e4794d7078f03d9a5d0b6f38b48931 to your computer and use it in GitHub Desktop.
seq2seq.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "seq2seq.ipynb", | |
"version": "0.3.2", | |
"provenance": [], | |
"include_colab_link": true | |
}, | |
"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.6.7" | |
}, | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/BrikerMan/12e4794d7078f03d9a5d0b6f38b48931/seq2seq.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "OYB21k7k9nTl", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 479 | |
}, | |
"outputId": "8a3f90af-a9a6-4276-e839-953845f58d0a" | |
}, | |
"source": [ | |
"!pip install gensim hanziconv" | |
], | |
"execution_count": 2, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Requirement already satisfied: gensim in /usr/local/lib/python3.6/dist-packages (3.6.0)\n", | |
"Collecting hanziconv\n", | |
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/63/71/b89cb63077fd807fe31cf7c016a06e7e579a289d8a37aa24a30282d02dd2/hanziconv-0.3.2.tar.gz (276kB)\n", | |
"\u001b[K |████████████████████████████████| 286kB 4.9MB/s \n", | |
"\u001b[?25hRequirement already satisfied: scipy>=0.18.1 in /usr/local/lib/python3.6/dist-packages (from gensim) (1.2.1)\n", | |
"Requirement already satisfied: six>=1.5.0 in /usr/local/lib/python3.6/dist-packages (from gensim) (1.12.0)\n", | |
"Requirement already satisfied: numpy>=1.11.3 in /usr/local/lib/python3.6/dist-packages (from gensim) (1.16.3)\n", | |
"Requirement already satisfied: smart-open>=1.2.1 in /usr/local/lib/python3.6/dist-packages (from gensim) (1.8.3)\n", | |
"Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from smart-open>=1.2.1->gensim) (2.21.0)\n", | |
"Requirement already satisfied: boto3 in /usr/local/lib/python3.6/dist-packages (from smart-open>=1.2.1->gensim) (1.9.145)\n", | |
"Requirement already satisfied: boto>=2.32 in /usr/local/lib/python3.6/dist-packages (from smart-open>=1.2.1->gensim) (2.49.0)\n", | |
"Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->smart-open>=1.2.1->gensim) (2.8)\n", | |
"Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->smart-open>=1.2.1->gensim) (1.24.3)\n", | |
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->smart-open>=1.2.1->gensim) (2019.3.9)\n", | |
"Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->smart-open>=1.2.1->gensim) (3.0.4)\n", | |
"Requirement already satisfied: s3transfer<0.3.0,>=0.2.0 in /usr/local/lib/python3.6/dist-packages (from boto3->smart-open>=1.2.1->gensim) (0.2.0)\n", | |
"Requirement already satisfied: botocore<1.13.0,>=1.12.145 in /usr/local/lib/python3.6/dist-packages (from boto3->smart-open>=1.2.1->gensim) (1.12.145)\n", | |
"Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in /usr/local/lib/python3.6/dist-packages (from boto3->smart-open>=1.2.1->gensim) (0.9.4)\n", | |
"Requirement already satisfied: python-dateutil<3.0.0,>=2.1; python_version >= \"2.7\" in /usr/local/lib/python3.6/dist-packages (from botocore<1.13.0,>=1.12.145->boto3->smart-open>=1.2.1->gensim) (2.5.3)\n", | |
"Requirement already satisfied: docutils>=0.10 in /usr/local/lib/python3.6/dist-packages (from botocore<1.13.0,>=1.12.145->boto3->smart-open>=1.2.1->gensim) (0.14)\n", | |
"Building wheels for collected packages: hanziconv\n", | |
" Building wheel for hanziconv (setup.py) ... \u001b[?25l\u001b[?25hdone\n", | |
" Stored in directory: /root/.cache/pip/wheels/03/d8/3c/c39898fa9c9ce6e34b0ab4c6604892462d440c743715c94054\n", | |
"Successfully built hanziconv\n", | |
"Installing collected packages: hanziconv\n", | |
"Successfully installed hanziconv-0.3.2\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "GEglTfJU9xBp", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"from tensorflow.keras.utils import to_categorical\n", | |
"from tensorflow.keras.preprocessing.sequence import pad_sequences\n", | |
"import collections\n", | |
"import operator\n", | |
"from typing import List, Dict\n", | |
"\n", | |
"import os\n", | |
"import json\n", | |
"import gensim\n", | |
"import numpy as np\n", | |
"import pathlib\n", | |
"import tensorflow as tf\n", | |
"from tensorflow.python.keras.preprocessing.sequence import pad_sequences\n", | |
"from hanziconv import HanziConv" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "FzDZspNP9nTo", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
}, | |
"outputId": "1a088554-bf25-4d87-bdb9-02488421dc46" | |
}, | |
"source": [ | |
"tf.__version__" | |
], | |
"execution_count": 4, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"'1.13.1'" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 4 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "iY1BEz9y9nTu", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 258 | |
}, | |
"outputId": "3b733040-6f97-4893-9c65-c9b3c2df8e42" | |
}, | |
"source": [ | |
"## data from http://www.manythings.org/anki/ Chinese (Mandarin) - English cmn-eng.zip (21007)\n", | |
"\n", | |
"data_path = 'cmn.txt'\n", | |
"df = pd.read_table(data_path,header=None)\n", | |
"\n", | |
"df.columns=['inputs','targets']\n", | |
"df.head()" | |
], | |
"execution_count": 7, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:3: FutureWarning: read_table is deprecated, use read_csv instead, passing sep='\\t'.\n", | |
" This is separate from the ipykernel package so we can avoid doing imports until\n" | |
], | |
"name": "stderr" | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>inputs</th>\n", | |
" <th>targets</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Hi.</td>\n", | |
" <td>嗨。</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Hi.</td>\n", | |
" <td>你好。</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Run.</td>\n", | |
" <td>你用跑的。</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>Wait!</td>\n", | |
" <td>等等!</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>Hello!</td>\n", | |
" <td>你好。</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" inputs targets\n", | |
"0 Hi. 嗨。\n", | |
"1 Hi. 你好。\n", | |
"2 Run. 你用跑的。\n", | |
"3 Wait! 等等!\n", | |
"4 Hello! 你好。" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 7 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "tFUJl8hy9nTw", | |
"colab_type": "code", | |
"colab": {}, | |
"outputId": "4db170a7-7c3d-41ae-c187-1340385fd17d" | |
}, | |
"source": [ | |
"#讲每句中文句首加上'\\t'作为起始标志,句末加上'\\n'作为终止标志\n", | |
"# df['targets'] = df['targets'].apply(lambda x: '\\t'+x+'\\n')\n", | |
"\n", | |
"df['inputs'] = df['inputs'].apply(lambda x: x[:-1].strip())\n", | |
"df['targets'] = df['targets'].apply(lambda x: x[:-1].strip())\n", | |
"\n", | |
"# df['inputs'] = df['inputs'].apply(lambda x: HanziConv.toSimplified(x))\n", | |
"df['targets'] = df['targets'].apply(lambda x: HanziConv.toSimplified(x))\n", | |
"\n", | |
"df['cutted_inputs'] = df['inputs'].apply(lambda x: x.split(' '))\n", | |
"df['cutted_targets'] = df['targets'].apply(lambda x: ['<BOS>'] + list(x) + ['<EOS>'])\n", | |
"df.head()" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>inputs</th>\n", | |
" <th>targets</th>\n", | |
" <th>cutted_inputs</th>\n", | |
" <th>cutted_targets</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Hi</td>\n", | |
" <td>嗨</td>\n", | |
" <td>[Hi]</td>\n", | |
" <td>[<BOS>, 嗨, <EOS>]</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Hi</td>\n", | |
" <td>你好</td>\n", | |
" <td>[Hi]</td>\n", | |
" <td>[<BOS>, 你, 好, <EOS>]</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Run</td>\n", | |
" <td>你用跑的</td>\n", | |
" <td>[Run]</td>\n", | |
" <td>[<BOS>, 你, 用, 跑, 的, <EOS>]</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>Wait</td>\n", | |
" <td>等等</td>\n", | |
" <td>[Wait]</td>\n", | |
" <td>[<BOS>, 等, 等, <EOS>]</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>Hello</td>\n", | |
" <td>你好</td>\n", | |
" <td>[Hello]</td>\n", | |
" <td>[<BOS>, 你, 好, <EOS>]</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" inputs targets cutted_inputs cutted_targets\n", | |
"0 Hi 嗨 [Hi] [<BOS>, 嗨, <EOS>]\n", | |
"1 Hi 你好 [Hi] [<BOS>, 你, 好, <EOS>]\n", | |
"2 Run 你用跑的 [Run] [<BOS>, 你, 用, 跑, 的, <EOS>]\n", | |
"3 Wait 等等 [Wait] [<BOS>, 等, 等, <EOS>]\n", | |
"4 Hello 你好 [Hello] [<BOS>, 你, 好, <EOS>]" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 5 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "JCZDj_nT9nTz", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"class Tokenizer(object):\n", | |
"\n", | |
" def __init__(self):\n", | |
" self.input2idx = {} # token 索引字典\n", | |
" self.input2count = collections.OrderedDict() # token 词频表\n", | |
" self.output2idx = {} # 标签索引词典\n", | |
" self.output2count = collections.OrderedDict() # token 词频表\n", | |
"\n", | |
" def build_token_dict(self, corpus: List[List[str]]):\n", | |
" \"\"\"\n", | |
" 构建 token 字典,这个方法将会遍历分词后的语料,构建一个标记频率字典和标记与索引的映射字典\n", | |
" Args:\n", | |
" corpus: 所有分词后的语料\n", | |
" \"\"\"\n", | |
" token2idx = {\n", | |
" '<PAD>': 0,\n", | |
" '<UNK>': 1,\n", | |
" '<BOS>': 2,\n", | |
" '<EOS>': 3\n", | |
" }\n", | |
"\n", | |
" token2count = {}\n", | |
" for sentence in corpus:\n", | |
" for token in sentence:\n", | |
" count = token2count.get(token, 0)\n", | |
" token2count[token] = count + 1\n", | |
" # 按照词频降序排序\n", | |
" sorted_token2count = sorted(token2count.items(),\n", | |
" key=operator.itemgetter(1),\n", | |
" reverse=True)\n", | |
" token2count = collections.OrderedDict(sorted_token2count)\n", | |
"\n", | |
" for token in token2count.keys():\n", | |
" if token not in token2idx:\n", | |
" token2idx[token] = len(token2idx)\n", | |
" return token2idx, token2count\n", | |
" \n", | |
" def build_from_w2v(self, w2v_path: str):\n", | |
" \"\"\"\n", | |
" 使用预训练词嵌入构建词表和词向量表\n", | |
" Args:\n", | |
" w2v_path: 预训练词嵌入文件路径\n", | |
" \"\"\"\n", | |
" w2v = gensim.models.KeyedVectors.load_word2vec_format(w2v_path)\n", | |
"\n", | |
" token2idx = {\n", | |
" '<PAD>': 0, # 由于我们用 0 补全序列,所以补全标记的索引必须为 0\n", | |
" '<UNK>': 1, # 新词标记的索引可以使任何一个,设置为 1 只是为了方便\n", | |
" '<BOS>': 2,\n", | |
" '<EOS>': 3\n", | |
" }\n", | |
"\n", | |
" # 我们遍历预训练词嵌入的词表,加入到我们的标记索引词典\n", | |
" token_index_list = []\n", | |
" for index, token in enumerate(w2v.index2word):\n", | |
" if len(token) == 1 and token not in token2idx:\n", | |
" token2idx[token] = len(token2idx)\n", | |
" token_index_list.append(index)\n", | |
" \n", | |
"\n", | |
" # 初始化一个形状为 [标记总数,预训练向量维度] 的全 0 张量\n", | |
" vector_matrix = np.zeros((len(token2idx), w2v.vector_size))\n", | |
" # 随机初始化 <UNK> 标记的张量\n", | |
" vector_matrix[1] = np.random.rand(300)\n", | |
" # 从索引 4 开始使用预训练的向量\n", | |
" vector_matrix[4:] = w2v.vectors[token_index_list]\n", | |
" \n", | |
" return token2idx, vector_matrix, w2v.vector_size\n", | |
" \n", | |
" @staticmethod\n", | |
" def numericalize_sequencese(sequence: List[str],\n", | |
" token2index: Dict[str, int]) -> List[int]:\n", | |
" \"\"\"\n", | |
" 将分词后的标记(token)数组转换成对应的索引数组\n", | |
" 如 ['我', '想', '睡觉'] -> [10, 313, 233]\n", | |
" Args:\n", | |
" sequence: 分词后的标记数组\n", | |
" token2index: 索引词典\n", | |
" Returns: 输入数据对应的索引数组\n", | |
" \"\"\"\n", | |
" token_result = []\n", | |
" for token in sequence:\n", | |
" token_index = token2index.get(token)\n", | |
" if token_index is None:\n", | |
" print(token)\n", | |
" token_index = token2index['<UNK>']\n", | |
" token_result.append(token_index)\n", | |
" return token_result" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "MI9jZRId9nT0", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"t = Tokenizer()\n", | |
"t.input2idx, t.input2count = t.build_token_dict(df.cutted_inputs.to_list())\n", | |
"t.output2idx, t.output2count = t.build_token_dict(df.cutted_targets.to_list())\n", | |
"# t.output2idx, t.output_vector_matrix, t.output_embedding_size = t.build_from_w2v('/input0/sgns.baidubaike.bigram-char')\n", | |
"\n", | |
"t.idx2output = dict([(v, k) for k, v in t.output2idx.items()])" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "s7HWqQJK9nT2", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"tokenized_input = []\n", | |
"tokenized_output = []\n", | |
"\n", | |
"for input_seq in df.cutted_inputs.to_list():\n", | |
" tokenized_input.append(t.numericalize_sequencese(input_seq, t.input2idx))\n", | |
"\n", | |
"for output_seq in df.cutted_targets.to_list():\n", | |
" tokenized_output.append(t.numericalize_sequencese(output_seq, t.output2idx))" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "rOs_mMZ49nT4", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"encoder_input_data = pad_sequences(tokenized_input, padding='post', truncating='post')\n", | |
"decoder_input = pad_sequences(tokenized_output, padding='post', truncating='post')" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "kjl7VXP79nT6", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"# For Decoder Input, you don't need the last word as that is only for prediction\n", | |
"# when we are training using Teacher Forcing.\n", | |
"decoder_input_data = decoder_input[:, :-1]\n", | |
"\n", | |
"# Decoder Target Data Is Ahead By 1 Time Step From Decoder Input Data (Teacher Forcing)\n", | |
"decoder_target_data = decoder_input[:, 1:]\n", | |
"\n", | |
"decoder_target_data = to_categorical(decoder_target_data, len(t.output2idx))" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "RpYW5Dct9nT8", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"# Defining some constants: \n", | |
"EMBEDDING_DIM = 300 # Length of the vector that we willl get from the embedding layer\n", | |
"HIDDEN_LAYER_DIM = 1024 # Hidden layers dimension \n", | |
"\n", | |
"L = tf.keras.layers\n", | |
"\n", | |
"# Define an input sequence and process it.\n", | |
"# Input layer of the encoder :\n", | |
"encoder_input_layer = L.Input(shape=(None,))\n", | |
"encoder_embedding_layer = L.Embedding(input_dim = len(t.input2idx), output_dim = EMBEDDING_DIM)\n", | |
"encoder_lstm_layer = L.LSTM(HIDDEN_LAYER_DIM, return_state=True)\n", | |
"\n", | |
"\n", | |
"encoder_embedding = encoder_embedding_layer(encoder_input_layer)\n", | |
"# # Output layer of the encoder :\n", | |
"encoder_outputs, state_h, state_c = encoder_lstm_layer(encoder_embedding)\n", | |
"\n", | |
"# # We discard `encoder_outputs` and only keep the states.\n", | |
"encoder_states = [state_h, state_c]" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "b0UFwey99nT-", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"# Set up the decoder, using `encoder_states` as initial state.\n", | |
"# Input layer of the decoder :\n", | |
"decoder_input_layer = L.Input(shape=(None,))\n", | |
"\n", | |
"# Hidden layers of the decoder :\n", | |
"# decoder_embedding_layer = L.Embedding(input_dim = len(t.output2idx),\n", | |
"# output_dim = 300,\n", | |
"# weights=[t.output_vector_matrix],\n", | |
"# trainable=False)\n", | |
"\n", | |
"\n", | |
"decoder_embedding_layer = L.Embedding(input_dim = len(t.output2idx),\n", | |
" output_dim = 100)\n", | |
"\n", | |
"decoder_embedding = decoder_embedding_layer(decoder_input_layer)\n", | |
"\n", | |
"decoder_lstm_layer = L.LSTM(HIDDEN_LAYER_DIM, return_sequences=True, return_state=True)\n", | |
"decoder_lstm_output, state_h, state_c = decoder_lstm_layer(decoder_embedding, initial_state = encoder_states)\n", | |
"\n", | |
"# Output layer of the decoder :\n", | |
"decoder_dense_layer = L.Dense(len(t.output2idx), activation='softmax')\n", | |
"decoder_outputs = decoder_dense_layer(decoder_lstm_output)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "_O70gZr89nUA", | |
"colab_type": "code", | |
"colab": {}, | |
"outputId": "5eb89d16-e9a8-4188-9605-0a2cb8c019ef" | |
}, | |
"source": [ | |
"model = tf.keras.Model([encoder_input_layer, decoder_input_layer], decoder_outputs)\n", | |
"model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])\n", | |
"model.summary()" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Model: \"model_3\"\n", | |
"__________________________________________________________________________________________________\n", | |
"Layer (type) Output Shape Param # Connected to \n", | |
"==================================================================================================\n", | |
"input_1 (InputLayer) [(None, None)] 0 \n", | |
"__________________________________________________________________________________________________\n", | |
"input_5 (InputLayer) [(None, None)] 0 \n", | |
"__________________________________________________________________________________________________\n", | |
"embedding (Embedding) (None, None, 300) 2361000 input_1[0][0] \n", | |
"__________________________________________________________________________________________________\n", | |
"embedding_2 (Embedding) (None, None, 100) 271500 input_5[0][0] \n", | |
"__________________________________________________________________________________________________\n", | |
"lstm (LSTM) [(None, 1024), (None 5427200 embedding[0][0] \n", | |
"__________________________________________________________________________________________________\n", | |
"lstm_2 (LSTM) [(None, None, 1024), 4608000 embedding_2[0][0] \n", | |
" lstm[0][1] \n", | |
" lstm[0][2] \n", | |
"__________________________________________________________________________________________________\n", | |
"dense_1 (Dense) (None, None, 2715) 2782875 lstm_2[0][0] \n", | |
"==================================================================================================\n", | |
"Total params: 15,450,575\n", | |
"Trainable params: 15,450,575\n", | |
"Non-trainable params: 0\n", | |
"__________________________________________________________________________________________________\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "4x8wYbz49nUC", | |
"colab_type": "code", | |
"colab": {}, | |
"outputId": "eab34c01-72f4-4355-bfb0-fbbc2ff0419c" | |
}, | |
"source": [ | |
"encoder_model = tf.keras.Model(encoder_input_layer, encoder_states)\n", | |
"encoder_model.summary(line_length=120)" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Model: \"model_4\"\n", | |
"________________________________________________________________________________________________________________________\n", | |
"Layer (type) Output Shape Param # \n", | |
"========================================================================================================================\n", | |
"input_1 (InputLayer) [(None, None)] 0 \n", | |
"________________________________________________________________________________________________________________________\n", | |
"embedding (Embedding) (None, None, 300) 2361000 \n", | |
"________________________________________________________________________________________________________________________\n", | |
"lstm (LSTM) [(None, 1024), (None, 1024), (None, 1024)] 5427200 \n", | |
"========================================================================================================================\n", | |
"Total params: 7,788,200\n", | |
"Trainable params: 7,788,200\n", | |
"Non-trainable params: 0\n", | |
"________________________________________________________________________________________________________________________\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "WSi98aIu9nUE", | |
"colab_type": "code", | |
"colab": {}, | |
"outputId": "c8e7cf25-4835-4913-9faa-8fcd42f0f2ea" | |
}, | |
"source": [ | |
"decoder_state_input_h = L.Input(shape=(HIDDEN_LAYER_DIM,))\n", | |
"decoder_state_input_c = L.Input(shape=(HIDDEN_LAYER_DIM,))\n", | |
"decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]\n", | |
"\n", | |
"decoder_outputs, state_h, state_c = decoder_lstm_layer(decoder_embedding, \n", | |
" initial_state = decoder_states_inputs)\n", | |
"\n", | |
"# Output layer of the decoder :\n", | |
"# decoder_dense = L.Dense(len(t.output2idx), activation='softmax')\n", | |
"decoder_states = [state_h, state_c]\n", | |
"decoder_outputs = decoder_dense_layer(decoder_outputs)\n", | |
"\n", | |
"decoder_model = tf.keras.Model([decoder_input_layer] + decoder_states_inputs, [decoder_outputs] + decoder_states)\n", | |
"decoder_model.summary()" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Model: \"model_5\"\n", | |
"__________________________________________________________________________________________________\n", | |
"Layer (type) Output Shape Param # Connected to \n", | |
"==================================================================================================\n", | |
"input_5 (InputLayer) [(None, None)] 0 \n", | |
"__________________________________________________________________________________________________\n", | |
"embedding_2 (Embedding) (None, None, 100) 271500 input_5[0][0] \n", | |
"__________________________________________________________________________________________________\n", | |
"input_6 (InputLayer) [(None, 1024)] 0 \n", | |
"__________________________________________________________________________________________________\n", | |
"input_7 (InputLayer) [(None, 1024)] 0 \n", | |
"__________________________________________________________________________________________________\n", | |
"lstm_2 (LSTM) [(None, None, 1024), 4608000 embedding_2[0][0] \n", | |
" input_6[0][0] \n", | |
" input_7[0][0] \n", | |
"__________________________________________________________________________________________________\n", | |
"dense_1 (Dense) (None, None, 2715) 2782875 lstm_2[1][0] \n", | |
"==================================================================================================\n", | |
"Total params: 7,662,375\n", | |
"Trainable params: 7,662,375\n", | |
"Non-trainable params: 0\n", | |
"__________________________________________________________________________________________________\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "4XBkwLSX9nUH", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"def encode_result(sentence: List[str]):\n", | |
" vect_sen = t.numericalize_sequencese(sentence, t.input2idx)\n", | |
" vect_sen = pad_sequences([vect_sen], padding='post', truncating='post')\n", | |
" states_value = encoder_model.predict(vect_sen)\n", | |
" target_seq = np.array([[t.output2idx['<BOS>']]])\n", | |
" \n", | |
" stop_condition = False\n", | |
" decoded_sentence = ''\n", | |
" while not stop_condition:\n", | |
" output_tokens, h, c = decoder_model.predict([target_seq] + states_value)\n", | |
"\n", | |
" # Sample a token\n", | |
" sampled_token_index = np.argmax(output_tokens[0, -1, :])\n", | |
" print(sampled_token_index)\n", | |
" sampled_char = t.idx2output[sampled_token_index]\n", | |
" \n", | |
" if (sampled_char == '<EOS>' or len(decoded_sentence) > 100):\n", | |
" stop_condition = True\n", | |
" else:\n", | |
" decoded_sentence += sampled_char\n", | |
" target_seq = np.array([[sampled_token_index]])\n", | |
" states_value = [h, c]\n", | |
" return decoded_sentence" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "fK4PBnh-9nUK", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"vect_sen = t.numericalize_sequencese('hello world'.split(' '), t.input2idx)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "lbUbSRI19nUM", | |
"colab_type": "code", | |
"colab": {}, | |
"outputId": "f6fbe085-85f1-42ab-e554-c044c2d9dd0e" | |
}, | |
"source": [ | |
"encode_result('Hi'.split(' '))" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"759\n", | |
"3\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"'肯'" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 55 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "TqhIi2ZG9nUO", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"vect_sen = pad_sequences([vect_sen], padding='post', truncating='post')" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "BD_h244m9nUQ", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"import random\n", | |
"\n", | |
"class TransalteCallBack(tf.keras.callbacks.Callback):\n", | |
" def on_epoch_end(self, epoch, logs={}):\n", | |
" print('\\n')\n", | |
" for i in range(10):\n", | |
" if i < 5:\n", | |
" index = i\n", | |
" else:\n", | |
" index = random.randint(0, len(encoder_input_data))\n", | |
" sentence = df.cutted_inputs.to_list()[index]\n", | |
" res = encode_result(sentence)\n", | |
" print(f\"{' '.join(sentence):50}-> {res}\")" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "QUKL5ouV9nUS", | |
"colab_type": "code", | |
"colab": {}, | |
"outputId": "8f9cdf53-8626-404a-bdf0-e8bde7aee2a9" | |
}, | |
"source": [ | |
"model.fit([encoder_input_data, decoder_input_data], \n", | |
" decoder_target_data, \n", | |
" epochs=100, \n", | |
" batch_size=64,\n", | |
" callbacks=[TransalteCallBack()])" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Epoch 1/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 1.1243 - acc: 0.8233\n", | |
"\n", | |
"Hi -> 你的么\n", | |
"Hi -> 你的么\n", | |
"Run -> 你的么\n", | |
"Wait -> 你们的个个事\n", | |
"Hello -> 你的么\n", | |
"You should do your homework now -> 你是你的\n", | |
"Four is an unlucky number in Japanese -> 这个个个孩子的\n", | |
"My daughter is in her late teens -> 我的房子的一个孩\n", | |
"She said she had been happy -> 她们的个个儿\n", | |
"You'll love it -> 你的\n", | |
"21007/21007 [==============================] - 74s 4ms/sample - loss: 1.1240 - acc: 0.8233\n", | |
"Epoch 2/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.8067 - acc: 0.8598\n", | |
"\n", | |
"Hi -> 你的\n", | |
"Hi -> 你的\n", | |
"Run -> 你的事\n", | |
"Wait -> 助他们的\n", | |
"Hello -> 你的事\n", | |
"She's not as beautiful as her sister -> 她的孩子\n", | |
"He looks like a good boy -> 他一欢\n", | |
"There's nothing good on television now -> 天没有看\n", | |
"He makes three times more money than I do -> 他的一个孩子\n", | |
"To be always honest is not easy -> 他们不是一个\n", | |
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.8067 - acc: 0.8598\n", | |
"Epoch 3/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.6748 - acc: 0.8777\n", | |
"\n", | |
"Hi -> 始\n", | |
"Hi -> 始\n", | |
"Run -> 始\n", | |
"Wait -> 玛丽\n", | |
"Hello -> 始\n", | |
"Can I help -> 我们\n", | |
"She was afraid to cross the road -> 她很常怕\n", | |
"I'd like to go to London -> 我想去\n", | |
"Help me peel the potatoes -> 让我们的书\n", | |
"Where is your dog -> 你的书\n", | |
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.6748 - acc: 0.8777\n", | |
"Epoch 4/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.5736 - acc: 0.8920\n", | |
"\n", | |
"Hi -> 始\n", | |
"Hi -> 始\n", | |
"Run -> 始\n", | |
"Wait -> 玛丽\n", | |
"Hello -> 始\n", | |
"No words can relieve her deep sorrow -> 她没有的法字\n", | |
"He has a strong sense of responsibility -> 他的\n", | |
"We'll die sooner or later -> 我们经常去\n", | |
"I want you to grow up -> 我想去\n", | |
"She is married to an American -> 她去学习\n", | |
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.5736 - acc: 0.8920\n", | |
"Epoch 5/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.4872 - acc: 0.9048\n", | |
"\n", | |
"Hi -> 始\n", | |
"Hi -> 始\n", | |
"Run -> 始\n", | |
"Wait -> 窗般般般幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅\n", | |
"Hello -> 始\n", | |
"Tom certainly is an interesting person -> 汤姆有一个小人\n", | |
"Tom is in the house -> 汤姆姆经在一起\n", | |
"Can you imagine what the 21st century will be like-> 你想知道你的电话\n", | |
"I'll give you a little tip -> 我会一点\n", | |
"It was beginning to snow -> 开始\n", | |
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.4871 - acc: 0.9048\n", | |
"Epoch 6/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.4096 - acc: 0.9179\n", | |
"\n", | |
"Hi -> 始\n", | |
"Hi -> 始\n", | |
"Run -> 择\n", | |
"Wait -> 窗般般般嗜嗜嗜嗜般嗜嗜幅幅嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅幅嗜嗜嗜嗜幅幅嗜\n", | |
"Hello -> 惯\n", | |
"Would you look after my cat -> 你的电脑上\n", | |
"Winter is my favorite season -> 数的数目\n", | |
"My favorite sport is baseball -> 山,我最喜欢的食物\n", | |
"I wish that Tom would agree to do that -> 我希望汤姆\n", | |
"I want to travel with you -> 我想要的方方\n", | |
"21007/21007 [==============================] - 72s 3ms/sample - loss: 0.4097 - acc: 0.9179\n", | |
"Epoch 7/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.3403 - acc: 0.9306\n", | |
"\n", | |
"Hi -> 视<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n", | |
"Hi -> 视<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n", | |
"Run -> 猜\n", | |
"Wait -> 惯赶<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n", | |
"Hello -> 惯\n", | |
"Tom had to sell his house -> 汤姆们经常大\n", | |
"What have I got to lose -> 我的钱\n", | |
"Rome is a city worth visiting -> 世过一个新外的城市\n", | |
"I stayed up late last night -> 晚晚了\n", | |
"Do you have any Japanese magazines -> 你的书子\n", | |
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.3403 - acc: 0.9306\n", | |
"Epoch 8/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.2799 - acc: 0.9423\n", | |
"\n", | |
"Hi -> \n", | |
"Hi -> \n", | |
"Run -> 猜\n", | |
"Wait -> 猜赶般\n", | |
"Hello -> 惯\n", | |
"There was no money left in my wallet -> 巴里没有钱\n", | |
"Shine your shoes before going out -> 路上你的地址\n", | |
"One's new. The other's old -> 其中的人\n", | |
"You should quit smoking -> 警察开始\n", | |
"I wish we had won the game -> 我希望的时候\n", | |
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.2800 - acc: 0.9423\n", | |
"Epoch 9/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.2265 - acc: 0.9532\n", | |
"\n", | |
"Hi -> 惯\n", | |
"Hi -> 惯\n", | |
"Run -> 猜\n", | |
"Wait -> 猜按\n", | |
"Hello -> 猜\n", | |
"What were you doing in Boston -> 你去了一个\n", | |
"The skies are clear -> 昨机\n", | |
"Can you guess what I have here -> 你来这里\n", | |
"Some people like summer, and others like winter -> 想,是有孩子\n", | |
"I'm under so much pressure, I just want to cry -> 我吃着很多可能的\n", | |
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.2265 - acc: 0.9532\n", | |
"Epoch 10/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.1827 - acc: 0.9629\n", | |
"\n", | |
"Hi -> ,<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n", | |
"Hi -> ,<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n", | |
"Run -> 猜\n", | |
"Wait -> 猜今般9颗颗颗颗颗擅颗擅颗擅颗颗擅颗擅颗颗擅颗擅颗颗擅颗颗擅颗颗擅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅\n", | |
"Hello -> 猜\n", | |
"The towel wasn't useful at all -> 牛算已经已经做了\n", | |
"The rivers were flooded by the heavy rain -> 雨下了,他们可常会吃功\n", | |
"You need to know -> 你的想法\n", | |
"Your wife is mad at you -> 你的意气\n", | |
"I laughed at his joke -> 他的父亲\n", | |
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.1828 - acc: 0.9629\n", | |
"Epoch 11/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.1460 - acc: 0.9713\n", | |
"\n", | |
"Hi -> \n", | |
"Hi -> \n", | |
"Run -> 猜\n", | |
"Wait -> 冷\n", | |
"Hello -> 猜\n", | |
"We have barely enough bread for breakfast -> 早上的家子太在我们\n", | |
"It worried me that she looked pale -> 她相信\n", | |
"He has been to France three times -> 他去三次三次\n", | |
"I don't want Tom to die -> 我不想\n", | |
"Do you want to know -> 你想要\n", | |
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.1460 - acc: 0.9712\n", | |
"Epoch 12/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.1180 - acc: 0.9776\n", | |
"\n", | |
"Hi -> 肯\n", | |
"Hi -> 肯\n", | |
"Run -> 猜\n", | |
"Wait -> 猜\n", | |
"Hello -> 猜\n", | |
"Tom is single and has a three-year-old daughter -> T些次, 他是没有的\n", | |
"Could you drive Tom home -> 你开始这个\n", | |
"Don't enter the room without permission -> 上学习,不是你的办公室里了\n", | |
"The accident almost cost him his life -> 此差他不懂他的事\n", | |
"The teacher got quite well again -> 大声很大\n", | |
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.1180 - acc: 0.9776\n", | |
"Epoch 13/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0956 - acc: 0.9823\n", | |
"\n", | |
"Hi -> 肯\n", | |
"Hi -> 肯\n", | |
"Run -> 猜\n", | |
"Wait -> 猜\n", | |
"Hello -> 猜\n", | |
"He showed interest in the plan -> 他的钱\n", | |
"Tom joined our company three years ago -> 汤姆下来大学\n", | |
"Please give me something to eat -> 请我有吃多\n", | |
"What did you hear -> 听\n", | |
"Tom realized it was time to leave -> 汤姆想成有个多人\n", | |
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.0956 - acc: 0.9823\n", | |
"Epoch 14/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0786 - acc: 0.9861\n", | |
"\n", | |
"Hi -> 肯\n", | |
"Hi -> 肯\n", | |
"Run -> 猜\n", | |
"Wait -> 猜\n", | |
"Hello -> 猜\n", | |
"How deep is the hole -> 非常多\n", | |
"I'd like to know the exact time -> 我想要知道的方馆\n", | |
"We speak the same language, don't we -> 我们的理孩子是在理面\n", | |
"He asked her where her mother was -> 他和她妈妈\n", | |
"Please speak more loudly -> 入英语\n", | |
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.0786 - acc: 0.9861\n", | |
"Epoch 15/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0656 - acc: 0.9885\n", | |
"\n", | |
"Hi -> 肯\n", | |
"Hi -> 肯\n", | |
"Run -> 猜\n", | |
"Wait -> 雨\n", | |
"Hello -> 肯\n", | |
"Those are their books -> 这个女儿\n", | |
"You should read many books when you are young -> 年轻的时候,你很须很快读\n", | |
"She put on her hat to go out -> 她下散须\n", | |
"The conflict between blacks and whites in the city became worse-> 这个城市,他的办成00000个人不住在这个地方\n", | |
"I'm more interested in spoken English -> 我要的英语几倍\n", | |
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.0656 - acc: 0.9885\n", | |
"Epoch 16/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0557 - acc: 0.9906\n", | |
"\n", | |
"Hi -> 肯\n", | |
"Hi -> 肯\n", | |
"Run -> 猜\n", | |
"Wait -> 忘<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n", | |
"Hello -> 肯\n", | |
"She told me an interesting story -> 她做了一个趣的小说\n", | |
"You must do it -> 你\n", | |
"Problems that can be solved with money are not real problems-> 除的可以学生不们\n", | |
"I took a shower -> 即\n", | |
"He is the father of two children -> 他的成功留在\n", | |
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.0557 - acc: 0.9906\n", | |
"Epoch 17/100\n", | |
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0480 - acc: 0.9920\n", | |
"\n", | |
"Hi -> 肯\n", | |
"Hi -> 肯\n", | |
"Run -> 猜\n", | |
"Wait -> 忘週\n", | |
"Hello -> 肯\n", | |
"How I've missed you -> 我们\n", | |
"I've always been smart -> 明天\n", | |
"He is angry with you -> 他的生气\n", | |
"I'll pay -> 我\n", | |
"This was the most interesting book that she had ever read-> 这是非常喜欢的电脑\n", | |
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.0480 - acc: 0.9920\n", | |
"Epoch 18/100\n", | |
" 2048/21007 [=>............................] - ETA: 1:04 - loss: 0.0342 - acc: 0.9947" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "error", | |
"ename": "KeyboardInterrupt", | |
"evalue": "", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-47-91a38accf93c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m64\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m callbacks=[TransalteCallBack()])\n\u001b[0m", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)\u001b[0m\n\u001b[1;32m 804\u001b[0m \u001b[0mvalidation_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_steps\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 805\u001b[0m \u001b[0mvalidation_freq\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_freq\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 806\u001b[0;31m steps_name='steps_per_epoch')\n\u001b[0m\u001b[1;32m 807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 808\u001b[0m def evaluate(self,\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training_arrays.py\u001b[0m in \u001b[0;36mmodel_iteration\u001b[0;34m(model, inputs, targets, sample_weights, batch_size, epochs, verbose, callbacks, val_inputs, val_targets, val_sample_weights, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq, mode, validation_in_fit, prepared_feed_values_from_dataset, steps_name, **kwargs)\u001b[0m\n\u001b[1;32m 357\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 358\u001b[0m \u001b[0;31m# Get outputs.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 359\u001b[0;31m \u001b[0mbatch_outs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins_batch\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 360\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch_outs\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[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 361\u001b[0m \u001b[0mbatch_outs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mbatch_outs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m 3383\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmath_ops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3384\u001b[0m \u001b[0mconverted_inputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3385\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_graph_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mconverted_inputs\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 3386\u001b[0m return nest.pack_sequence_as(\n\u001b[1;32m 3387\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_outputs_structure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\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[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 547\u001b[0m raise TypeError(\"Keyword arguments {} unknown. Expected {}.\".format(\n\u001b[1;32m 548\u001b[0m list(kwargs.keys()), list(self._arg_keywords)))\n\u001b[0;32m--> 549\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_flat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\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 550\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 551\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_filtered_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\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/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_call_flat\u001b[0;34m(self, args)\u001b[0m\n\u001b[1;32m 646\u001b[0m \u001b[0;31m# Only need to override the gradient in graph mode and when we have outputs.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 647\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecuting_eagerly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\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--> 648\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_inference_function\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mctx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\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 649\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 650\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_register_gradient\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/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36mcall\u001b[0;34m(self, ctx, args)\u001b[0m\n\u001b[1;32m 420\u001b[0m attrs=(\"executor_type\", executor_type,\n\u001b[1;32m 421\u001b[0m \"config_proto\", config),\n\u001b[0;32m--> 422\u001b[0;31m ctx=ctx)\n\u001b[0m\u001b[1;32m 423\u001b[0m \u001b[0;31m# Replace empty list with None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 424\u001b[0m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moutputs\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py\u001b[0m in \u001b[0;36mquick_execute\u001b[0;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[1;32m 59\u001b[0m tensors = pywrap_tensorflow.TFE_Py_Execute(ctx._handle, device_name,\n\u001b[1;32m 60\u001b[0m \u001b[0mop_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattrs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m num_outputs)\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NotOkStatusException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mKeyboardInterrupt\u001b[0m: " | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "0hOA0kLX9nUV", | |
"colab_type": "code", | |
"colab": {}, | |
"outputId": "13cb87cb-2ed7-4a9a-b002-339f8e1b5145" | |
}, | |
"source": [ | |
"tf.keras.utils.plot_model(model, show_shapes=True)" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<IPython.core.display.Image object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 25 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "T0OSHK2D9nUX", | |
"colab_type": "code", | |
"colab": {}, | |
"outputId": "d07ef317-7be3-48b6-a564-b94bf1f7170d" | |
}, | |
"source": [ | |
"!apt update && apt install -y graphviz" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Hit:1 http://security.ubuntu.com/ubuntu bionic-security InRelease\n", | |
"Hit:2 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu bionic InRelease\n", | |
"Hit:3 http://archive.ubuntu.com/ubuntu bionic InRelease\n", | |
"Hit:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease\n", | |
"Hit:5 http://archive.ubuntu.com/ubuntu bionic-backports InRelease\n", | |
"Reading package lists... Done\n", | |
"Building dependency tree \n", | |
"Reading state information... Done\n", | |
"41 packages can be upgraded. Run 'apt list --upgradable' to see them.\n", | |
"Reading package lists... Done\n", | |
"Building dependency tree \n", | |
"Reading state information... Done\n", | |
"The following additional packages will be installed:\n", | |
" libcairo2 libdatrie1 libgraphite2-3 libgvc6 libgvpr2 libharfbuzz0b\n", | |
" liblab-gamut1 libltdl7 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0\n", | |
" libpathplan4 libthai-data libthai0 libxaw7 libxcb-shm0 libxmu6 libxrender1\n", | |
" libxt6\n", | |
"Suggested packages:\n", | |
" gsfonts graphviz-doc\n", | |
"The following NEW packages will be installed:\n", | |
" graphviz libcairo2 libdatrie1 libgraphite2-3 libgvc6 libgvpr2 libharfbuzz0b\n", | |
" liblab-gamut1 libltdl7 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0\n", | |
" libpathplan4 libthai-data libthai0 libxaw7 libxcb-shm0 libxmu6 libxrender1\n", | |
" libxt6\n", | |
"0 upgraded, 20 newly installed, 0 to remove and 41 not upgraded.\n", | |
"29 not fully installed or removed.\n", | |
"Need to get 3279 kB of archives.\n", | |
"After this operation, 13.2 MB of additional disk space will be used.\n", | |
"Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxcb-shm0 amd64 1.13-2~ubuntu18.04 [5600 B]\n", | |
"Get:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxrender1 amd64 1:0.9.10-1 [18.7 kB]\n", | |
"Get:3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libcairo2 amd64 1.15.10-2ubuntu0.1 [580 kB]\n", | |
"Get:4 http://archive.ubuntu.com/ubuntu bionic/main amd64 libltdl7 amd64 2.4.6-2 [38.8 kB]\n", | |
"Get:5 http://archive.ubuntu.com/ubuntu bionic/main amd64 libthai-data all 0.1.27-2 [133 kB]\n", | |
"Get:6 http://archive.ubuntu.com/ubuntu bionic/main amd64 libdatrie1 amd64 0.2.10-7 [17.8 kB]\n", | |
"Get:7 http://archive.ubuntu.com/ubuntu bionic/main amd64 libthai0 amd64 0.1.27-2 [18.0 kB]\n", | |
"Get:8 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpango-1.0-0 amd64 1.40.14-1ubuntu0.1 [153 kB]\n", | |
"Get:9 http://archive.ubuntu.com/ubuntu bionic/main amd64 libgraphite2-3 amd64 1.3.11-2 [78.7 kB]\n", | |
"Get:10 http://archive.ubuntu.com/ubuntu bionic/main amd64 libharfbuzz0b amd64 1.7.2-1ubuntu1 [232 kB]\n", | |
"Get:11 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpangoft2-1.0-0 amd64 1.40.14-1ubuntu0.1 [33.2 kB]\n", | |
"Get:12 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpangocairo-1.0-0 amd64 1.40.14-1ubuntu0.1 [20.8 kB]\n", | |
"Get:13 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libpathplan4 amd64 2.40.1-2 [22.6 kB]\n", | |
"Get:14 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libgvc6 amd64 2.40.1-2 [601 kB]\n", | |
"Get:15 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libgvpr2 amd64 2.40.1-2 [169 kB]\n", | |
"Get:16 http://archive.ubuntu.com/ubuntu bionic/universe amd64 liblab-gamut1 amd64 2.40.1-2 [178 kB]\n", | |
"Get:17 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxt6 amd64 1:1.1.5-1 [160 kB]\n", | |
"Get:18 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxmu6 amd64 2:1.1.2-2 [46.0 kB]\n", | |
"Get:19 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxaw7 amd64 2:1.0.13-1 [173 kB]\n", | |
"Get:20 http://archive.ubuntu.com/ubuntu bionic/universe amd64 graphviz amd64 2.40.1-2 [601 kB]\n", | |
"Fetched 3279 kB in 5s (705 kB/s)\n", | |
"debconf: unable to initialize frontend: Dialog\n", | |
"debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76, <> line 20.)\n", | |
"debconf: falling back to frontend: Readline\n", | |
"\n", | |
"(Reading database ... 19585 files and directories currently installed.)\n", | |
"Preparing to unpack .../00-libxcb-shm0_1.13-2~ubuntu18.04_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 0%]\u001b[49m\u001b[39m [..........................................................] \u001b8Unpacking libxcb-shm0:amd64 (1.13-2~ubuntu18.04) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 1%]\u001b[49m\u001b[39m [..........................................................] \u001b8Selecting previously unselected package libxrender1:amd64.\n", | |
"Preparing to unpack .../01-libxrender1_1%3a0.9.10-1_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 2%]\u001b[49m\u001b[39m [#.........................................................] \u001b8Unpacking libxrender1:amd64 (1:0.9.10-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 3%]\u001b[49m\u001b[39m [#.........................................................] \u001b8Selecting previously unselected package libcairo2:amd64.\n", | |
"Preparing to unpack .../02-libcairo2_1.15.10-2ubuntu0.1_amd64.deb ...\n", | |
"Unpacking libcairo2:amd64 (1.15.10-2ubuntu0.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 4%]\u001b[49m\u001b[39m [##........................................................] \u001b8Selecting previously unselected package libltdl7:amd64.\n", | |
"Preparing to unpack .../03-libltdl7_2.4.6-2_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 5%]\u001b[49m\u001b[39m [###.......................................................] \u001b8Unpacking libltdl7:amd64 (2.4.6-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 6%]\u001b[49m\u001b[39m [###.......................................................] \u001b8Selecting previously unselected package libthai-data.\n", | |
"Preparing to unpack .../04-libthai-data_0.1.27-2_all.deb ...\n", | |
"Unpacking libthai-data (0.1.27-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 7%]\u001b[49m\u001b[39m [####......................................................] \u001b8Selecting previously unselected package libdatrie1:amd64.\n", | |
"Preparing to unpack .../05-libdatrie1_0.2.10-7_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 9%]\u001b[49m\u001b[39m [####......................................................] \u001b8Unpacking libdatrie1:amd64 (0.2.10-7) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 9%]\u001b[49m\u001b[39m [#####.....................................................] \u001b8Selecting previously unselected package libthai0:amd64.\n", | |
"Preparing to unpack .../06-libthai0_0.1.27-2_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 10%]\u001b[49m\u001b[39m [#####.....................................................] \u001b8Unpacking libthai0:amd64 (0.1.27-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 11%]\u001b[49m\u001b[39m [######....................................................] \u001b8Selecting previously unselected package libpango-1.0-0:amd64.\n", | |
"Preparing to unpack .../07-libpango-1.0-0_1.40.14-1ubuntu0.1_amd64.deb ...\n", | |
"Unpacking libpango-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 12%]\u001b[49m\u001b[39m [#######...................................................] \u001b8Selecting previously unselected package libgraphite2-3:amd64.\n", | |
"Preparing to unpack .../08-libgraphite2-3_1.3.11-2_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 13%]\u001b[49m\u001b[39m [#######...................................................] \u001b8Unpacking libgraphite2-3:amd64 (1.3.11-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 14%]\u001b[49m\u001b[39m [########..................................................] \u001b8Selecting previously unselected package libharfbuzz0b:amd64.\n", | |
"Preparing to unpack .../09-libharfbuzz0b_1.7.2-1ubuntu1_amd64.deb ...\n", | |
"Unpacking libharfbuzz0b:amd64 (1.7.2-1ubuntu1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 15%]\u001b[49m\u001b[39m [########..................................................] \u001b8Selecting previously unselected package libpangoft2-1.0-0:amd64.\n", | |
"Preparing to unpack .../10-libpangoft2-1.0-0_1.40.14-1ubuntu0.1_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 16%]\u001b[49m\u001b[39m [#########.................................................] \u001b8Unpacking libpangoft2-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 17%]\u001b[49m\u001b[39m [#########.................................................] \u001b8Selecting previously unselected package libpangocairo-1.0-0:amd64.\n", | |
"Preparing to unpack .../11-libpangocairo-1.0-0_1.40.14-1ubuntu0.1_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 18%]\u001b[49m\u001b[39m [##########................................................] \u001b8Unpacking libpangocairo-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 19%]\u001b[49m\u001b[39m [###########...............................................] \u001b8Selecting previously unselected package libpathplan4.\n", | |
"Preparing to unpack .../12-libpathplan4_2.40.1-2_amd64.deb ...\n", | |
"Unpacking libpathplan4 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 20%]\u001b[49m\u001b[39m [###########...............................................] \u001b8Selecting previously unselected package libgvc6.\n", | |
"Preparing to unpack .../13-libgvc6_2.40.1-2_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 21%]\u001b[49m\u001b[39m [############..............................................] \u001b8Unpacking libgvc6 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 22%]\u001b[49m\u001b[39m [############..............................................] \u001b8Selecting previously unselected package libgvpr2.\n", | |
"Preparing to unpack .../14-libgvpr2_2.40.1-2_amd64.deb ...\n", | |
"Unpacking libgvpr2 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 23%]\u001b[49m\u001b[39m [#############.............................................] \u001b8Selecting previously unselected package liblab-gamut1.\n", | |
"Preparing to unpack .../15-liblab-gamut1_2.40.1-2_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 24%]\u001b[49m\u001b[39m [##############............................................] \u001b8Unpacking liblab-gamut1 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 25%]\u001b[49m\u001b[39m [##############............................................] \u001b8Selecting previously unselected package libxt6:amd64.\n", | |
"Preparing to unpack .../16-libxt6_1%3a1.1.5-1_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 26%]\u001b[49m\u001b[39m [###############...........................................] \u001b8Unpacking libxt6:amd64 (1:1.1.5-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 27%]\u001b[49m\u001b[39m [###############...........................................] \u001b8Selecting previously unselected package libxmu6:amd64.\n", | |
"Preparing to unpack .../17-libxmu6_2%3a1.1.2-2_amd64.deb ...\n", | |
"Unpacking libxmu6:amd64 (2:1.1.2-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 28%]\u001b[49m\u001b[39m [################..........................................] \u001b8Selecting previously unselected package libxaw7:amd64.\n", | |
"Preparing to unpack .../18-libxaw7_2%3a1.0.13-1_amd64.deb ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 29%]\u001b[49m\u001b[39m [################..........................................] \u001b8Unpacking libxaw7:amd64 (2:1.0.13-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 30%]\u001b[49m\u001b[39m [#################.........................................] \u001b8Selecting previously unselected package graphviz.\n", | |
"Preparing to unpack .../19-graphviz_2.40.1-2_amd64.deb ...\n", | |
"Unpacking graphviz (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 31%]\u001b[49m\u001b[39m [##################........................................] \u001b8Setting up libgts-0.7-5:amd64 (0.7.6+darcs121130-4) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 32%]\u001b[49m\u001b[39m [##################........................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 34%]\u001b[49m\u001b[39m [###################.......................................] \u001b8Setting up libpathplan4 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 34%]\u001b[49m\u001b[39m [###################.......................................] \u001b8Setting up liblab-gamut1 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 35%]\u001b[49m\u001b[39m [####################......................................] \u001b8Setting up libpng16-16:amd64 (1.6.34-1ubuntu0.18.04.2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 36%]\u001b[49m\u001b[39m [####################......................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 37%]\u001b[49m\u001b[39m [#####################.....................................] \u001b8Setting up libjbig0:amd64 (2.1-3.1build1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 38%]\u001b[49m\u001b[39m [######################....................................] \u001b8Setting up fonts-dejavu-core (2.37-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 39%]\u001b[49m\u001b[39m [######################....................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 40%]\u001b[49m\u001b[39m [#######################...................................] \u001b8Setting up libdatrie1:amd64 (0.2.10-7) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 41%]\u001b[49m\u001b[39m [########################..................................] \u001b8Setting up libtiff5:amd64 (4.0.9-5ubuntu0.2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 42%]\u001b[49m\u001b[39m [########################..................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 43%]\u001b[49m\u001b[39m [########################..................................] \u001b8Setting up libbsd0:amd64 (0.8.7-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 44%]\u001b[49m\u001b[39m [#########################.................................] \u001b8Setting up fonts-liberation (1:1.07.4-7~18.04.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 45%]\u001b[49m\u001b[39m [##########################................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 46%]\u001b[49m\u001b[39m [##########################................................] \u001b8Setting up ucf (3.0038) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 47%]\u001b[49m\u001b[39m [###########################...............................] \u001b8debconf: unable to initialize frontend: Dialog\n", | |
"debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)\n", | |
"debconf: falling back to frontend: Readline\n", | |
"Setting up libfreetype6:amd64 (2.8.1-2ubuntu2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 48%]\u001b[49m\u001b[39m [############################..............................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 49%]\u001b[49m\u001b[39m [############################..............................] \u001b8Setting up libgraphite2-3:amd64 (1.3.11-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 50%]\u001b[49m\u001b[39m [#############################.............................] \u001b8Setting up libpixman-1-0:amd64 (0.34.0-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 51%]\u001b[49m\u001b[39m [#############################.............................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 52%]\u001b[49m\u001b[39m [##############################............................] \u001b8Processing triggers for libc-bin (2.27-3ubuntu1) ...\n", | |
"Setting up libltdl7:amd64 (2.4.6-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 53%]\u001b[49m\u001b[39m [##############################............................] \u001b8Setting up libann0 (1.1.2+doc-6) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 54%]\u001b[49m\u001b[39m [###############################...........................] \u001b8Setting up libthai-data (0.1.27-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 55%]\u001b[49m\u001b[39m [################################..........................] \u001b8Setting up libxdmcp6:amd64 (1:1.1.2-3) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 56%]\u001b[49m\u001b[39m [################################..........................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 57%]\u001b[49m\u001b[39m [#################################.........................] \u001b8Setting up x11-common (1:7.7+19ubuntu7.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 59%]\u001b[49m\u001b[39m [#################################.........................] \u001b8debconf: unable to initialize frontend: Dialog\n", | |
"debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)\n", | |
"debconf: falling back to frontend: Readline\n", | |
"update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults\n", | |
"invoke-rc.d: could not determine current runlevel\n", | |
"invoke-rc.d: policy-rc.d denied execution of start.\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 59%]\u001b[49m\u001b[39m [##################################........................] \u001b8Setting up libcdt5 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 60%]\u001b[49m\u001b[39m [##################################........................] \u001b8Setting up libx11-data (2:1.6.4-3ubuntu0.2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 61%]\u001b[49m\u001b[39m [###################################.......................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 62%]\u001b[49m\u001b[39m [####################################......................] \u001b8Setting up libxau6:amd64 (1:1.0.8-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 63%]\u001b[49m\u001b[39m [####################################......................] \u001b8Setting up libcgraph6 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 64%]\u001b[49m\u001b[39m [#####################################.....................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 65%]\u001b[49m\u001b[39m [#####################################.....................] \u001b8Setting up libwebp6:amd64 (0.6.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 66%]\u001b[49m\u001b[39m [######################################....................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 67%]\u001b[49m\u001b[39m [######################################....................] \u001b8Setting up fontconfig-config (2.12.6-0ubuntu2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 68%]\u001b[49m\u001b[39m [#######################################...................] \u001b8Setting up libgvpr2 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 69%]\u001b[49m\u001b[39m [########################################..................] \u001b8Setting up libharfbuzz0b:amd64 (1.7.2-1ubuntu1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 70%]\u001b[49m\u001b[39m [########################################..................] \u001b8Setting up libthai0:amd64 (0.1.27-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 71%]\u001b[49m\u001b[39m [#########################################.................] \u001b8Setting up libice6:amd64 (2:1.0.9-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 72%]\u001b[49m\u001b[39m [#########################################.................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 73%]\u001b[49m\u001b[39m [##########################################................] \u001b8Setting up libxcb1:amd64 (1.13-2~ubuntu18.04) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 74%]\u001b[49m\u001b[39m [###########################################...............] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 75%]\u001b[49m\u001b[39m [###########################################...............] \u001b8Setting up libfontconfig1:amd64 (2.12.6-0ubuntu2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 76%]\u001b[49m\u001b[39m [############################################..............] \u001b8Setting up libsm6:amd64 (2:1.2.2-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 77%]\u001b[49m\u001b[39m [############################################..............] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 78%]\u001b[49m\u001b[39m [#############################################.............] \u001b8Setting up libxcb-render0:amd64 (1.13-2~ubuntu18.04) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 79%]\u001b[49m\u001b[39m [#############################################.............] \u001b8Setting up libx11-6:amd64 (2:1.6.4-3ubuntu0.2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 80%]\u001b[49m\u001b[39m [##############################################............] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 81%]\u001b[49m\u001b[39m [###############################################...........] \u001b8Setting up libxcb-shm0:amd64 (1.13-2~ubuntu18.04) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 82%]\u001b[49m\u001b[39m [###############################################...........] \u001b8Setting up libxpm4:amd64 (1:3.5.12-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 84%]\u001b[49m\u001b[39m [################################################..........] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 84%]\u001b[49m\u001b[39m [################################################..........] \u001b8Setting up libxt6:amd64 (1:1.1.5-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 85%]\u001b[49m\u001b[39m [#################################################.........] \u001b8Setting up libxrender1:amd64 (1:0.9.10-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 86%]\u001b[49m\u001b[39m [#################################################.........] \u001b8Setting up fontconfig (2.12.6-0ubuntu2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 87%]\u001b[49m\u001b[39m [##################################################........] \u001b8Regenerating fonts cache... done.\n", | |
"Setting up libxext6:amd64 (2:1.3.3-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 88%]\u001b[49m\u001b[39m [###################################################.......] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 89%]\u001b[49m\u001b[39m [###################################################.......] \u001b8Setting up libgd3:amd64 (2.2.5-4ubuntu0.3) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 90%]\u001b[49m\u001b[39m [####################################################......] \u001b8Setting up libxmu6:amd64 (2:1.1.2-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 91%]\u001b[49m\u001b[39m [#####################################################.....] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 92%]\u001b[49m\u001b[39m [#####################################################.....] \u001b8Setting up libpango-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 93%]\u001b[49m\u001b[39m [#####################################################.....] \u001b8Setting up libxaw7:amd64 (2:1.0.13-1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 94%]\u001b[49m\u001b[39m [######################################################....] \u001b8Setting up libcairo2:amd64 (1.15.10-2ubuntu0.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 95%]\u001b[49m\u001b[39m [#######################################################...] \u001b8Setting up libpangoft2-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 96%]\u001b[49m\u001b[39m [#######################################################...] \u001b8Setting up libpangocairo-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 97%]\u001b[49m\u001b[39m [########################################################..] \u001b8Setting up libgvc6 (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 98%]\u001b[49m\u001b[39m [#########################################################.] \u001b8Setting up graphviz (2.40.1-2) ...\n", | |
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 99%]\u001b[49m\u001b[39m [#########################################################.] \u001b8Processing triggers for libc-bin (2.27-3ubuntu1) ...\n", | |
"\n", | |
"\u001b7\u001b[0;24r\u001b8\u001b[1A\u001b[J" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "f44uvtcY9nUZ", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"print('a ')" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "_8lD4s-S9nUa", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment