import numpy as np from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding, LSTM, Dense from tensorflow.keras.optimizers import Adam from sklearn.model_selection import train_test_split # サンプルの製品特徴データ product_features = [ “コンパクトなデザイン”, “高性能なプロセッサ”, “大容量のストレージ”, “高解像度のディスプレイ”, “バッテリーの持続時間が長い” ] # テキストのトークン化とシーケンス化 tokenizer = Tokenizer() tokenizer.fit_on_texts(product_features) sequences = tokenizer.texts_to_sequences(product_features) # パディング maxlen = max([len(x) for x in sequences]) padded_sequences = pad_sequences(sequences, maxlen=maxlen) # ラベルデータ(次の単語の予測) labels = np.roll(padded_sequences, -1, axis=1) # モデルの構築 model = Sequential() model.add(Embedding(input_dim=len(tokenizer.word_index)+1, output_dim=32, input_length=maxlen)) model.add(LSTM(64, return_sequences=True)) model.add(LSTM(64)) model.add(Dense(len(tokenizer.word_index)+1, activation=’softmax’)) # モデルのコンパイル model.compile(optimizer=Adam(), loss=’sparse_categorical_crossentropy’) # モデルの学習 model.fit(padded_sequences, labels, epochs=100, verbose=2) # 製品特徴の自動生成 def generate_product_description(seed_text, length=10): for _ in range(length): sequence = tokenizer.texts_to_sequences([seed_text])[0] padded_sequence = pad_sequences([sequence], maxlen=maxlen, padding=’pre’) predicted_index = model.predict_classes(padded_sequence, verbose=0) next_word = tokenizer.index_word.get(predicted_index[0], ”) seed_text += ‘ ‘ + next_word return seed_text # 製品特徴の自動生成(サンプルの開始テキスト: “コンパクトなデザイン”) generated_description = generate_product_description(“コンパクトなデザイン”) print(“Generated Product Description:”, generated_description) これを修正して

次の変更を加えて、モデルの学習中にvalidationデータを用いるように修正します。

  1. データの分割: 訓練データと検証データに分割する。
  2. fit()メソッドの引数にvalidation_dataを追加: 検証データを指定する。

修正後のコードは以下のようになります。

python
import numpy as np from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding, LSTM, Dense from tensorflow.keras.optimizers import Adam from sklearn.model_selection import train_test_split # サンプルの製品特徴データ product_features = [ "コンパクトなデザイン", "高性能なプロセッサ", "大容量のストレージ", "高解像度のディスプレイ", "バッテリーの持続時間が長い" ] # テキストのトークン化とシーケンス化 tokenizer = Tokenizer() tokenizer.fit_on_texts(product_features) sequences = tokenizer.texts_to_sequences(product_features) # パディング maxlen = max([len(x) for x in sequences]) padded_sequences = pad_sequences(sequences, maxlen=maxlen) # ラベルデータ(次の単語の予測) labels = np.roll(padded_sequences, -1, axis=1) # データの分割 X_train, X_val, y_train, y_val = train_test_split(padded_sequences, labels, test_size=0.2, random_state=42) # モデルの構築 model = Sequential() model.add(Embedding(input_dim=len(tokenizer.word_index)+1, output_dim=32, input_length=maxlen)) model.add(LSTM(64, return_sequences=True)) model.add(LSTM(64)) model.add(Dense(len(tokenizer.word_index)+1, activation='softmax')) # モデルのコンパイル model.compile(optimizer=Adam(), loss='sparse_categorical_crossentropy') # モデルの学習 model.fit(X_train, y_train, epochs=100, validation_data=(X_val, y_val), verbose=2) # 製品特徴の自動生成 def generate_product_description(seed_text, length=10): for _ in range(length): sequence = tokenizer.texts_to_sequences([seed_text])[0] padded_sequence = pad_sequences([sequence], maxlen=maxlen, padding='pre') predicted_index = model.predict_classes(padded_sequence, verbose=0) next_word = tokenizer.index_word.get(predicted_index[0], '') seed_text += ' ' + next_word return seed_text # 製品特徴の自動生成(サンプルの開始テキスト: "コンパクトなデザイン") generated_description = generate_product_description("コンパクトなデザイン") print("Generated Product Description:", generated_description)

この修正後のコードでは、訓練データと検証データに分割し、validation_data引数を使ってモデルの学習中に検証データを与えることができます。

未分類

Posted by ぼっち