In [3]:
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.layers import Embedding
from keras.layers import Conv1D, GlobalMaxPool1D
from keras.datasets import imdb
In [4]:
max_features = 5000
maxlen = 400
batch_size = 32
embedding_dims = 50
filters = 250
kernel_size = 3
hidden_dims = 250
epochs = 2
感情 (肯定/否定) のラベル付けをされた,25,000のIMDB映画レビューのデータセット.レビューは前処理済みで,各レビューは単語のインデックス(整数)のシーケンスとしてエンコードされています.便宜上,単語はデータセットにおいての出現頻度によってインデックスされています.そのため例えば,整数"3"はデータの中で3番目に頻度が多い単語にエンコードされます.これによって"上位20個の頻出語を除いた,上位10,000個の頻出語についてのみ考える"というようなフィルタリング作業を高速に行うことができます. 慣例として,"0"は特定の単語を表さずに,未知語にエンコードされます.
In [27]:
print('Loading data...')
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
In [30]:
print(len(x_train), 'train sequences')
print(len(x_test), 'test sequences')
In [31]:
# 最大の単語数は2494
lens = []
for i in range(25000):
lens.append(len(x_train[i]))
print(max(lens))
In [33]:
print('Pad sequences (sample x time)')
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
print('x_train shape:', x_train.shape)
print('x_test shape:', x_test.shape)
In [36]:
x_train[0]
Out[36]:
In [48]:
print('Build model...')
model = Sequential()
# 単語IDを密ベクトルに変換する層
# Embedding(input_dim, output_dim, input_length)
# input_dim : 語彙数 = 5000
# output_dim: 密ベクトルの次元数 = 50
# input_length: 入力の系列長 = 400
model.add(Embedding(max_features, embedding_dims, input_length=maxlen))
model.add(Dropout(0.2))
model.add(Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1))
# 各フィルタごとに最大値を出力する
model.add(GlobalMaxPool1D())
model.add(Dense(hidden_dims))
model.add(Dropout(0.2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
In [49]:
model.summary()
In [51]:
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
In [53]:
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))
Out[53]:
In [96]:
import numpy as np
from keras.layers import Input
from keras.models import Model
In [84]:
inputs = Input(shape=(10, 4))
In [86]:
inputs
Out[86]:
In [66]:
c1 = Conv1D(2, 3, padding='valid', activation='linear', strides=1)
In [93]:
y = c1(inputs)
In [94]:
y
Out[94]:
In [97]:
model = Model(inputs=inputs, outputs=y)
In [98]:
model.summary()
In [99]:
model.predict(x)
Out[99]:
In [106]:
model.layers[1].get_weights()[0].shape
Out[106]:
In [107]:
w = model.layers[1].get_weights()[0]
In [113]:
x[0][:3]
Out[113]:
In [125]:
# model.predict(x)の1行目と一致する
print(x[0][:3].shape)
print(w.shape)
print(np.sum(x[0][:3] * w[:, :, 0]))
print(np.sum(x[0][:3] * w[:, :, 1]))
In [126]:
# xは1つずらす(strides=1)
# model.predict(x)の2行目と一致する
print(np.sum(x[0][1:4] * w[:, :, 0]))
print(np.sum(x[0][1:4] * w[:, :, 1]))
In [ ]: