「文法」に従う一連の文字があります。また、トレーニング セットには、文字列が「文法」に従っているかどうかのブール ラベルがあります。基本的に、私のモデルは、文字列が規則に従っているかどうかを判断しようとしています。かなり簡単な問題です(教科書から出てきました)。
次のようにデータセットを生成しています。
def generate_dataset(size):
good_strings = [string_to_ids(generate_string(embedded_reber_grammar))
for _ in range(size // 2)]
bad_strings = [string_to_ids(generate_corrupted_string(embedded_reber_grammar))
for _ in range(size - size // 2)]
all_strings = good_strings + bad_strings
X = tf.ragged.constant(all_strings, ragged_rank=1)
# X = X.to_tensor(default_value=0)
y = np.array([[1.] for _ in range(len(good_strings))] +
[[0.] for _ in range(len(bad_strings))])
return X, y
行に注意してくださいX = X.to_tensor(default_value=0)
。この行がコメントアウトされている場合、私のモデルは問題なく学習します。ただし、コメントアウトされていない場合、学習に失敗し、検証セットは偶然 (50-50) と同じように実行されます。
これが私の実際のモデルです:
np.random.seed(42)
tf.random.set_seed(42)
embedding_size = 5
model = keras.models.Sequential([
keras.layers.InputLayer(input_shape=[None], dtype=tf.int32, ragged=True),
keras.layers.Embedding(input_dim=len(POSSIBLE_CHARS) + 1, output_dim=embedding_size),
keras.layers.GRU(30),
keras.layers.Dense(1, activation="sigmoid")
])
optimizer = keras.optimizers.SGD(lr=0.02, momentum = 0.95, nesterov=True)
model.compile(loss="binary_crossentropy", optimizer=optimizer, metrics=["accuracy"])
history = model.fit(X_train, y_train, epochs=5, validation_data=(X_valid, y_valid))
0
密なテンソルのデフォルト値として使用しています。はstrings_to_ids
どの値にも 0 を使用しませんが、代わりに 1 から始まります。また、高密度テンソルの使用に切り替えると、私が使用したように、高密度テンソルをragged=True
使用False.
するとモデルが失敗する理由がわかりません同様の演習の前の密なテンソル。