<jupyter_start><jupyter_text>感情 (肯定/否定) のラベル付けをされた，25,000のIMDB映画レビューのデータセット．レビューは前処理済みで，各レビューは単語のインデックス（整数）のシーケンスとしてエンコードされています．便宜上，単語はデータセットにおいての出現頻度によってインデックスされています．そのため例えば，整数"3"はデータの中で3番目に頻度が多い単語にエンコードされます．これによって"上位20個の頻出語を除いた，上位10,000個の頻出語についてのみ考える"というようなフィルタリング作業を高速に行うことができます． 慣例として，"0"は特定の単語を表さずに，未知語にエンコードされます．<jupyter_code>print('Loading data...')
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)<jupyter_output>Loading data...<jupyter_text>- 25000文章- 各文章は単語列のlistからなると<jupyter_code>print(len(x_train), 'train sequences')
print(len(x_test), 'test sequences')
# 最大の単語数は2494
lens = []
for i in range(25000):
    lens.append(len(x_train[i]))
print(max(lens))
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)<jupyter_output>Pad sequences (sample x time)
x_train shape: (25000, 400)
x_test shape: (25000, 400)<jupyter_text>- maxlenより長いシーケンスは切り捨てられる- maxlenより短いシーケンスは前半部分が0パディングされる<jupyter_code>x_train[0]
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'))
model.summary()
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))<jupyter_output>Train on 25000 samples, validate on 25000 samples
Epoch 1/2
25000/25000 [==============================] - 207s - loss: 0.3849 - acc: 0.8233 - val_loss: 0.2812 - val_acc: 0.8825
Epoch 2/2
25000/25000 [==============================] - 211s - loss: 0.2360 - acc: 0.9064 - val_loss: 0.2673 - val_acc: 0.8910<jupyter_text>Conv1Dの実装確認<jupyter_code>import numpy as np
from keras.layers import Input
from keras.models import Model
inputs = Input(shape=(10, 4))
inputs
c1 = Conv1D(2, 3, padding='valid', activation='linear', strides=1)
y = c1(inputs)
y
model = Model(inputs=inputs, outputs=y)
model.summary()
model.predict(x)
model.layers[1].get_weights()[0].shape
w = model.layers[1].get_weights()[0]
x[0][:3]
# 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]))
# 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]))<jupyter_output>-0.185855683969
0.201001819528
{'fraction_non_alphanumeric': 0.17955706984667802, 'fraction_numerical': 0.07018739352640545, 'mean_word_length': 7.738095238095238, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '364172', 'license': 'MIT', 'n_tokens_mistral': 1579, 'n_tokens_neox': 1435, 'n_words': 182, 'path': 'keras/170704-imdb-cnn.ipynb', 'repo_name': 'aidiary/notebooks', 'size': '2935'}