73650


3次元のデータと1次元の正解データをLSTMで学習させようとしているが、エラーが出てしまします。  
どうすればよいでしょうか？  
コードに問題があったため少し変更しました。  
参考にしたものはこちらです。  
<http://sweng.web.fc2.com/ja/program/python/time-series-forecast-lstm.html>

[code]

    import numpy as np
    from keras.models import Sequential
    from keras.layers import Dense, LSTM, RepeatVector, TimeDistributed
    
    #3次元
    train_value = [[[0.4, 0.1, 0.2],[0.2, 0.1,0.4]], [[0.4, 0.1, 0.2],[0.2, 0.1,0.4]]]
    # 1次元
    train_label_list = [1.0, 2.0]
    
    # [[0.4, 0.1, 0.2],[0.2, 0.1,0.4]]を入力すると1.0が返ってくるようにしたい
    
    x_train = np.array(train_value)
    y_train = np.array(train_label_list)
    
    x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], x_train.shape[2]))
    y_train = y_train.reshape(y_train.shape[0])
    
    model = Sequential()
    model.add(LSTM(100, activation='relu', input_shape=(2, 3)))
    model.add(RepeatVector(1))
    model.add(LSTM(100, activation='relu', return_sequences=True))
    model.add(TimeDistributed(Dense(1)))
    model.compile(optimizer='adam', loss='mse')
    model.fit(x_train, y_train, epochs=1000, verbose=0)
    
    test_value = [[0.2, 0.1, 0.2],[0.2, 0.3,0.4]]
    
    x_test = np.array(test_value)
    x_test = x_test.reshape((x_test.shape[0], x_test.shape[1], 1))
    
    yhat = model.predict(x_test)
    
    print(yhat)
    
[/code]

エラー内容

[code]

    ValueError: Input 0 is incompatible with layer sequential: expected shape=(None, None, 3), found shape=[None, 3, 1]
    
[/code]


CC BY-SA 4.0
2021-01-28T10:38:19.837
73647
2021-01-28T11:49:38.727
2021-01-28T11:49:38.727
3060
40856
question
python 機械学習 keras
KerasでLSTMをしようとしているが、エラーが出てしまう。


`fit`や`predict`に渡すデータは `(サンプル数, データの次元0, データの次元1, ... データの次元n)` の形で渡します。  
今データの次元は `(2, 3)` なので、`shape=(サンプル数, 2, 3)` となるようにします。  
`predict`で確認したいサンプルは一つなので、`shape=(1, 2, 3)`です。

なので、

[code]

    test_value = [[0.2, 0.1, 0.2], [0.2, 0.3, 0.4]]
    x_test = np.array(test_value)
    print(x_test.shape)  # (2, 3)
    
    x_test = x_test.reshape(1, 2, 3)
    print(x_test.shape)  # (1, 2, 3): サンプル数1, 次元 (2, 3)
    
    yhat = model.predict(x_test)
    print(yhat)
    
[/code]

もしくは

[code]

    test_value = [[0.2, 0.1, 0.2], [0.2, 0.3, 0.4]]
    x_test = np.array(test_value)
    print(x_test.shape)  # (2, 3)
    
    x_test = x_test[np.newaxis, :, :]
    print(x_test.shape)  # (1, 2, 3): サンプル数1, 次元 (2, 3)
    
    yhat = model.predict(x_test)
    print(yhat)
    
[/code]

で通ります。

参考:  
[NumPy配列ndarrayに次元を追加するnp.newaxis,
np.expand_dims()](https://note.nkmk.me/python-numpy-newaxis/)

`test_value`を直書きしてるなら単に

[code]

    test_value = [[[0.2, 0.1, 0.2], [0.2, 0.3, 0.4]]]
    x_test = np.array(test_value)
    print(x_test.shape)  # (1, 2, 3)
    
[/code]

でもいいです。


CC BY-SA 4.0
2021-01-28T11:46:54.773
73650
2021-01-28T11:48:22.427
2021-01-28T11:48:22.427
3060
20885
73647
answer