t_fkkm
@t_fkkm

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

kerasでのLSTM実装時のエラーについて

解決したいこと

kerasでLSTMを実装していますが,下記のようなエラーが出てしまっています。
機械学習もkerasも初心者のため,ブラックボックスとなっているmodelの中身についてのエラーがよくわからないです。
「レイヤーmodel_2は1入力を期待しているが,7つの入力テンソルを受け取った」とエラーにありますが、モデルの内容を確認するmodel.summary()を使用してもmodel_2というものが見つからず,あまりよくわかりませんでした...
知っている方がいればよろしくお願いいたします。
また、プログラムは以下の質問の回答を参考にしました。
https://teratail.com/questions/bvu8a6iqi02wp4

発生している問題・エラー

ValueError: in user code:


    ValueError: Layer model_2 expects 1 input(s), but it received 7 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(None, 130) dtype=float32>, <tf.Tensor 'IteratorGetNext:1' shape=(None, 130) dtype=float32>, <tf.Tensor 'IteratorGetNext:2' shape=(None, 130) dtype=float32>, <tf.Tensor 'IteratorGetNext:3' shape=(None, 130) dtype=float32>, <tf.Tensor 'IteratorGetNext:4' shape=(None, 130) dtype=float32>, <tf.Tensor 'IteratorGetNext:5' shape=(None, 130) dtype=float32>, <tf.Tensor 'IteratorGetNext:6' shape=(None, 130) dtype=float32>]

該当するソースコード

import os
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from matplotlib import pyplot as plt

import tensorflow as tf
from tensorflow.python.keras.layers import Conv1D, Reshape, LSTM, Dense, Input
from tensorflow.python.keras.models import Model
from tensorflow.keras.utils import plot_model
import pandas as pd

def make_dataset():
    for i in range(1,20):
        for j in range(13,21):
            path="E:\\最強データ2_フレーム揃え\\喜び_13~20\\Actor_"+str(i)+"\\合体"+str(j)+".csv"
            df=pd.read_csv(path,index_col=0,header=0)
            df.pop("AU12_r")
            yy=df["AU06_r"]
            df.apply(lambda x: (x-x.min())/(x.max() - x.min()), axis=0)
            yyy=yy.values.astype(float)
            preprocessing.minmax_scale(yyy)
            data = df.values.astype(float)
            
            x.append(data)
            y.append(yyy)
    
    return x,y


x=list()
y=list()
x,y= make_dataset()
x_train, x_valid, y_train, y_valid = train_test_split(x, y, test_size = 8)
print("3次元リストの要素数: " + str(len(x)))
print("3次元リストの中にある2次元リストの要素数: " + str(len(x[1])))
print("3次元リストの中にあるリストの要素数: " + str(len(x[0][2])))
print("2次元リストの要素数: " + str(len(y)))
print("2次元リストの中にあるリストの要素数: " + str(len(y[2])))

#データの種類(160)*データの長さ(108)*説明変数(130)
inputs=Input(shape=(108,130))
x = Reshape((130, 108))(inputs)
x = LSTM(108, return_sequences = True)(x)
x = Reshape((108, 130))(x)
x = Conv1D(1, 3, padding = "same", activation = "linear")(x)
model = Model(inputs, x)


model.compile(
    optimizer = "adam",
    loss = "mse",
    metrics = ["mae"]
)
print(model.summary())
plot_model(model)
model.fit(
    x_train, y_train,
    epochs = 64,
    batch_size = 32,
    validation_data = (x_valid, y_valid)
)
# 結果の確認
pred = model.predict(x_valid)
for i in range(10):
    t = x_valid[i][:, 0]
    plt.figure(figsize = (8, 4))
    plt.plot(t, pred[i], label = "predict")
    plt.plot(t, wave(t, *x_valid[i][0, 1:]), label = "grandtruth")
    plt.ylim([0, 1])
    plt.grid()
    plt.legend()
    plt.show()
#print("\n",model.summary())
0

1Answer

レイヤーmodel_2は1入力を期待しているが,7つの入力テンソルを受け取った

多分,データ数がfor j in range(13,21):によってx.append(data)が7回実行されてあるのでこのようなエラーになっています.make_data()の最後,teratailの回答と同様にreturn np.array(x), np.array(y)にしたら治ると思います.

また,そのteratailの回答ですが,ユニット数の扱いを間違えているので,LSTMの実装まわりを修正する必要があります.引数名がunitsで非常に紛らわしいですがLSTMの第一引数は単一ユニットの扱うパラメータ数になっています.したがって,次のように直すと良いでしょう.

inputs = Input(shape = (108, 130))
x = LSTM(130, return_sequences = True)(inputs) # 一応unitsは入力パラメータ数に合わせておく
x = Conv1D(1, 3, padding = "same", activation = "linear")(x)
model = Model(inputs, x)
0Like

Your answer might help someone💌