<jupyter_start><jupyter_text>Reference: https://qiita.com/everylittle/items/ba821e93d275a421ca2b    RNN(LSTM) を試す、列の総和を出力するモデル  可変長の場合<jupyter_code>import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Masking, LSTM
#from keras.layers.recurrent import LSTM
from tensorflow.keras.optimizers import Adam
import numpy as np
import random
input_dim = 1                # 入力データの次元数：実数値1個なので1を指定
output_dim = 1               # 出力データの次元数：同上
num_hidden_units = 128       # 隠れ層のユニット数
batch_size = 300             # ミニバッチサイズ
num_of_training_epochs = 100 # 学習エポック数
learning_rate = 0.001        # 学習率
num_training_samples = 1000  # 学習データのサンプル数
def create_data(nb_of_samples):
    # 長さを対数正規分布に従って決める
    leng = np.around(np.random.lognormal(np.log(5.0), 0.5, (nb_of_samples, 1))).astype("int")
    max_sequence_len = leng.max()
 
    # 乱数で {0.0, 1.0} の列を生成する
    X = np.random.randint(0, 2, (nb_of_samples, max_sequence_len)).astype("float32")

    # 長さを超えた部分を-1.0に置き換える
    X[np.arange(max_sequence_len).reshape((1, -1)) >= leng] = -1.0

    # 各行の-1.0を除いた総和を正解ラベルとする
    t = np.ma.array(X, mask=(X == -1.0)).sum(axis=1)

    # LSTMに与える入力は (サンプル, 時刻, 特徴量の次元) の3次元になる。
    return X.reshape((nb_of_samples, max_sequence_len, 1)), t
random.seed(0)
np.random.seed(0)
#tf.set_random_seed(0)
tf.random.set_seed(0)
X, t = create_data(num_training_samples)
print(X.shape)
print(t.shape)
X[0]
t[0]
#X.reshape(X.shape[:-1])

import pandas as pd
df = pd.DataFrame(X.reshape(X.shape[:-1]))
df.head()
df2 = pd.concat([df, pd.Series(t, name='t')], axis=1)
df2.tail()
model = Sequential()

# パディングの値を指定してMaskingレイヤーを作成する
model.add(Masking(input_shape=(None, input_dim), mask_value=-1.0))

model.add(LSTM(num_hidden_units, return_sequences=False))

model.add(Dense(output_dim))

model.compile(loss="mean_squared_error", optimizer=Adam(lr=learning_rate))

model.summary()
hist = model.fit(X,
                 t,
                 batch_size=batch_size,
                 epochs=num_of_training_epochs,
                 validation_split=0.1)
import pandas as pd

results = pd.DataFrame(hist.history)
results[['loss', 'val_loss']].plot()
test = np.array([1, 1, 1, 0, 1, 0, 1]).astype("float32")

# (a) 長さを変えずに入力
print(model.predict(test.reshape((1, -1, 1))))
# (b) 後ろに適当な数の-1.0を追加して入力
print(model.predict(np.pad(test, (0, 10), "constant", constant_values=-1.0).reshape((1, -1, 1))))<jupyter_output>[[4.8063693]]
{'fraction_non_alphanumeric': 0.1506568144499179, 'fraction_numerical': 0.042692939244663386, 'mean_word_length': 4.152219873150106, 'pattern_counts': {'":': 0, '<': 4, '<?xml version=': 0, '>': 5, 'https://': 1, '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': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '539663', 'license': 'MIT', 'n_tokens_mistral': 1187, 'n_tokens_neox': 1127, 'n_words': 165, 'path': 'scripts/rnn/lstm_sum_2.ipynb', 'repo_name': 'tayutaedomo/tensorflow-sandbox', 'size': '2436'}