Skip to content

Instantly share code, notes, and snippets.

@naotokui
Created January 11, 2017 08:11
Show Gist options
  • Save naotokui/3a4d3e76498459ab137af5df079247eb to your computer and use it in GitHub Desktop.
Save naotokui/3a4d3e76498459ab137af5df079247eb to your computer and use it in GitHub Desktop.
sequence2sequence autoencoder in keras
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# sequence2sequence autoencoder in keras\n",
"\n",
"still working...\n",
"\n",
"\n",
"https://blog.keras.io/building-autoencoders-in-keras.html\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import os\n",
"#os.environ[\"KERAS_BACKEND\"] = \"tensorflow\"\n",
"\n",
"import codecs\n",
"\n",
"# I happen to have a copus of scripts of american TV soap opera\n",
"f = codecs.open('soap_opera.csv','r',encoding='UTF-8',errors=\"ignore\")\n",
"X = f.readlines()\n",
"\n",
"# limit the size\n",
"X = X[:100000]\n",
"\n",
"# convert to ascii because keras.processing.text doesnt work with UTF8\n",
"X = [s.encode('ascii', 'ignore') for s in X]\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using Theano backend.\n",
"Using gpu device 2: GeForce GTX TITAN X (CNMeM is disabled, cuDNN 5005)\n"
]
}
],
"source": [
"from keras.preprocessing import text, sequence\n",
"from keras.preprocessing.text import Tokenizer\n",
"\n",
"\n",
"nb_words = 2000\n",
"tokenizer = text.Tokenizer(nb_words=nb_words, lower=True, split=\" \")\n",
"tokenizer.fit_on_texts(X)\n",
" \n",
"# WARNING: before calling texts_to_sequences, you need to call fit_on_texts \n",
"# otherwise you get \"word_index\" error\n",
"Y = tokenizer.texts_to_sequences(X)\n",
"\n",
"maxlen = 16 # up to 16 words per sentence\n",
"Y = sequence.pad_sequences(Y, maxlen=maxlen, padding=\"post\", truncating=\"post\")\n",
"\n",
"# Y should be (# of words in dictionary x samples) matrix\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Vectorization...\n",
"[[False False False ..., False False False]\n",
" [False False False ..., False False False]\n",
" [False False False ..., False False False]\n",
" ..., \n",
" [ True False False ..., False False False]\n",
" [ True False False ..., False False False]\n",
" [False False False ..., False False False]]\n"
]
}
],
"source": [
"print('Vectorization...')\n",
"import numpy as np\n",
"\n",
"Z = np.zeros((len(Y), maxlen, nb_words), dtype=np.bool)\n",
"Z_next = np.zeros((len(Y), maxlen, nb_words), dtype=np.bool)\n",
"for i, seq in enumerate(Y):\n",
" for t, word in enumerate(seq[:-1]):\n",
" Z[i, t, word] = 1\n",
" Z_next[i, t, seq[t+1]] = 1\n",
"print Z[0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"inputs (None, 16, 2000)\n",
"encoded (None, 128)\n",
"decoded (None, 16, 128)\n",
"output (None, 16, 2000)\n"
]
}
],
"source": [
"# sequence-to-sequence autoencoder\n",
"# https://keras.io/layers/recurrent/\n",
"\n",
"from keras.layers import Input, LSTM, RepeatVector, Activation\n",
"from keras.models import Model\n",
"from keras.optimizers import RMSprop, Adam\n",
"import keras.backend as K\n",
"\n",
"latent_dim = 128\n",
"\n",
"timesteps = maxlen\n",
"inputs = Input(shape=(maxlen, nb_words))\n",
"print \"inputs\", K.int_shape(inputs) \n",
"\n",
"#LATMのインプット  (number of samples, number of timesteps, number of features)\n",
"encoded = LSTM(latent_dim)(inputs)\n",
"print \"encoded\", K.int_shape(encoded)\n",
"\n",
"decoded = RepeatVector(timesteps)(encoded)\n",
"print \"decoded\", K.int_shape(decoded)\n",
"\n",
"decoded = LSTM(nb_words, return_sequences=True)(decoded)\n",
"print \"output\", K.int_shape(decoded)\n",
"\n",
"# is sigmoid the best choice?\n",
"activation = Activation('sigmoid')(decoded)\n",
"\n",
"sequence_autoencoder = Model(inputs, activation)\n",
"encoder = Model(inputs, encoded)\n",
"\n",
"optimizer = Adam(lr = 0.005)\n",
"#optimizer = RMSprop(lr=0.01)\n",
"sequence_autoencoder.compile(loss='binary_crossentropy', optimizer=optimizer)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 90000 samples, validate on 10000 samples\n",
"Epoch 1/100\n",
"90000/90000 [==============================] - 178s - loss: 0.4563 - val_loss: 0.4555\n",
"Epoch 2/100\n",
"90000/90000 [==============================] - 179s - loss: 0.4555 - val_loss: 0.4555\n",
"Epoch 3/100\n",
"90000/90000 [==============================] - 179s - loss: 0.4555 - val_loss: 0.4555\n",
"Epoch 4/100\n",
"90000/90000 [==============================] - 183s - loss: 0.4555 - val_loss: 0.4555\n",
"Epoch 5/100\n",
"90000/90000 [==============================] - 183s - loss: 0.4555 - val_loss: 0.4555\n",
"Epoch 6/100\n",
"90000/90000 [==============================] - 184s - loss: 0.4555 - val_loss: 0.4555\n",
"Epoch 7/100\n",
"90000/90000 [==============================] - 180s - loss: 0.4555 - val_loss: 0.4555\n",
"Epoch 8/100\n",
"90000/90000 [==============================] - 181s - loss: 0.4555 - val_loss: 0.4555\n",
"Epoch 9/100\n",
"64000/90000 [====================>.........] - ETA: 53s - loss: 0.4555"
]
}
],
"source": [
"sequence_autoencoder.fit(Z, Z, batch_size=100, nb_epoch=100, validation_split=0.1)"
]
},
{
"cell_type": "code",
"execution_count": 187,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sequence_autoencoder.save(\"seq2seq_model.h5\")\n",
"#from keras.models import load_model\n",
"#sequence_autoencoder = load_model(\"seq2seq_model.h5\")"
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"def sample(preds, temperature=1.0):\n",
" # helper function to sample an index from a probability array\n",
" preds = np.asarray(preds).astype('float64')\n",
" preds = np.log(preds) / temperature\n",
" exp_preds = np.exp(preds)\n",
" preds = exp_preds / np.sum(exp_preds)\n",
" probas = np.random.multinomial(1, preds, 1)\n",
" return np.argmax(probas)\n",
"\n",
"def sequence_to_word(tokenizer, seq):\n",
" sentence = \"\"\n",
" for wi in seq:\n",
" if wi in tokenizer.word_index.values():\n",
" word = tokenizer.word_index.keys()[list(tokenizer.word_index.values()).index(wi)]\n",
" if word == \"\\n\":\n",
" break\n",
" sentence += word + \" \"\n",
" return sentence"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"----- diversity: 0.2\n",
"---- Generating with seed: repeat chorus you're the one i really \n",
"generated: boy need couldn't it we k we watch boy watch r r is we here this \n"
]
}
],
"source": [
"\n",
"import random\n",
"\n",
"text = random.choice(X)\n",
"seq = tokenizer.texts_to_sequences([text])[0]\n",
"\n",
"for diversity in [0.2]:#[0.2, 0.5, 1.0, 1.2]:\n",
" print '----- diversity:', diversity\n",
"\n",
" seq = seq[:maxlen]\n",
" seed_ = sequence_to_word(tokenizer, seq)\n",
" print '---- Generating with seed:', seed_\n",
" \n",
" x = np.zeros((1, maxlen, nb_words), dtype=np.bool)\n",
" for t, word in enumerate(seq):\n",
" x[0, t, word] = 1\n",
"\n",
" generated = []\n",
" preds = sequence_autoencoder.predict(x, verbose=0)[0] \n",
" for i in range(preds.shape[0]):\n",
" next_word = sample(preds[i], diversity)\n",
" generated.append(next_word)\n",
" \n",
" sent = sequence_to_word(tokenizer, generated)\n",
" print \"generated:\", sent"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training history\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f0ba1b73d10>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\ngg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f0ba04d5210>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"print \"Training history\"\n",
"fig = plt.figure(figsize=(10,4))\n",
"ax1 = fig.add_subplot(1, 2, 1)\n",
"plt.plot(sequence_autoencoder.history.history['loss'])\n",
"ax1.set_title('loss')\n",
"ax2 = fig.add_subplot(1, 2, 2)\n",
"plt.plot(sequence_autoencoder.history.history['val_loss'])\n",
"ax2.set_title('validation loss')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment