python - 警告:tensorflow:Model は入力 Tensor("input_5:0",shape=(20, 37, 42), dtype=float32) に対してshape (20, 37, 42) で構築されましたが、

okwaves2024-01-25  5

警告:tensorflow:Model は入力 Tensor("input_5:0"、shape=(20, 37, 42), dtype=float32) のshape (20, 37, 42) で構築されましたが、呼び出されました。互換性のない形状の入力 (なし、37)。

こんにちは!深層学習の初心者です...LSTM レイヤーの使用に問題があります。 入力は、2 つの float を含む長さ 37 の float 配列と、float に変換された長さ 35 のワンホット配列です。出力は、0 と 1 を含む長さ 19 の配列です。タイトルが示すように、モデルに適合するように入力データを再形成するのに苦労しています。また、どの入力ディメンションが「互換性がある」とみなされるのかさえわかりません。

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers


import random
inputs, outputs = [], []
for x in range(10000):
    tempi, tempo = [], []
    tempi.append(random.random() - 0.5)
    tempi.append(random.random() - 0.5)
    for x2 in range(35):
        if random.random() > 0.5:
            tempi.append(1.)
        else:
            tempi.append(0.)
    for x2 in range(19):
        if random.random() > 0.5:
            tempo.append(1.)
        else:
            tempo.append(0.)
    inputs.append(tempi)
    outputs.append(tempo)

batch = 20
timesteps = 42
training_units = 0.85

cutting_point_i = int(len(inputs)*training_units)
cutting_point_o = int(len(outputs)*training_units)
x_train, x_test = np.asarray(inputs[:cutting_point_i]), np.asarray(inputs[cutting_point_i:])
y_train, y_test = np.asarray(outputs[:cutting_point_o]), np.asarray(outputs[cutting_point_o:])

input_layer = keras.Input(shape=(37,timesteps),batch_size=batch)
dense = layers.LSTM(150, activation="sigmoid", return_sequences=True)
x = dense(input_layer)
hidden_layer_2 = layers.LSTM(150, activation="sigmoid", return_sequences=True)(x)
output_layer = layers.Dense(10, activation="softmax")(hidden_layer_2)
model = keras.Model(inputs=input_layer, outputs=output_layer, name="my_model"

コード内の x = dense(input_layer) とは何ですか?

– アニケット・ボテ

2020 年 9 月 3 日 11:19

フォーマットは、tensorflow.org/guide/keras/functional の公式関数 API からのものです。私はそれをコピー&ペーストしてそこから作業しましたが、確かになぜそこにあるのかはわかりません。 API は、「この入力オブジェクトでレイヤーを呼び出すことにより、レイヤーのグラフに新しいノードを作成します:」と述べています。

– スターゲイザー

9月2020 年 3 月 11:34

1

スタンドアロン コードを追加して、直面している問題を再現できますか?生成されたデータをモデル入力として使用できます。

– アニケット・ボテ

2020 年 9 月 3 日 12:19

追加されました。 (文字数制限のパディング)

– スターゲイザー

2020 年 9 月 3 日 13:11

入力とは何ですか?

– ニコラ・ジェルヴェ

2020 年 9 月 3 日 13:15



------------------------

ここにはいくつかの問題があります。

入力にはタイム ステップがありませんでした。入力形状 (n、タイム ステップ、特徴) が必要です。 input_shape では、タイム ステップのディメンションが最後ではなく最初に来ます。 最後の LSTM レイヤーはシーケンスを返したので、0 と 1 と比較することはできません

私がやったこと:

データに時間ステップを追加しました (7) input_shape の寸法を並べ替えました 最終的な return_sequences=False を設定しました

生成されたデータを使用して完全に修正された例:

import numpy as np
from tensorflow import keras
from tensorflow.keras import layers

batch = 20
n_samples = 1000
timesteps = 7
features = 10

x_train = np.random.rand(n_samples, timesteps, features)
y_train = keras.utils.to_categorical(np.random.randint(0, 10, n_samples))

input_layer = keras.Input(shape=(timesteps, features),batch_size=batch)
dense = layers.LSTM(16, activation="sigmoid", return_sequences=True)(input_layer)
hidden_layer_2 = layers.LSTM(16, activation="sigmoid", return_sequences=False)(dense)
output_layer = layers.Dense(10, activation="softmax")(hidden_layer_2)
model = keras.Model(inputs=input_layer, outputs=output_layer, name="my_model")

model.compile(loss='categorical_crossentropy', optimizer='adam')

history = model.fit(x_train, y_train)
Train on 1000 samples
  20/1000 [..............................] - ETA: 2:50 - loss: 2.5145
 200/1000 [=====>........................] - ETA: 14s - loss: 2.3934 
 380/1000 [==========>...................] - ETA: 5s - loss: 2.3647 
 560/1000 [===============>..............] - ETA: 2s - loss: 2.3549
 740/1000 [=====================>........] - ETA: 1s - loss: 2.3395
 900/1000 [==========================>...] - ETA: 0s - loss: 2.3363
1000/1000 [==============================] - 4s 4ms/sample - loss: 2.3353



------------------------

モデルの正しい入力は (20, 37, 42) です。 注: ここで 20 は、明示的に指定したバッチサイズです。

コード:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

batch = 20
timesteps = 42
training_units = 0.85

x1 = tf.constant(np.random.randint(50, size =(1000,37, 42)), dtype = tf.float32)
y1 = tf.constant(np.random.randint(10, size =(1000,)), dtype = tf.int32)
 

input_layer = keras.Input(shape=(37,timesteps),batch_size=batch)
dense = layers.LSTM(150, activation="sigmoid", return_sequences=True)
x = dense(input_layer)
hidden_layer_2 = layers.LSTM(150, activation="sigmoid", return_sequences=True)(x)
hidden_layer_3 = layers.Flatten()(hidden_layer_2)
output_layer = layers.Dense(10, activation="softmax")(hidden_layer_3)
model = keras.Model(inputs=input_layer, outputs=output_layer, name="my_model")

model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
tf.keras.utils.plot_model(model, 'my_first_model.png', show_shapes=True)

モデルのアーキテクチャ:

入力サイズがはっきりとわかります。

実行するコード:

model.fit(x = x1, y = y1, batch_size = batch, epochs = 10)

注: どのバッチ サイズを指定しても、model.fit() コマンドで同じバッチ サイズを指定する必要があります。

出力:

Epoch 1/10
50/50 [==============================] - 4s 89ms/step - loss: 2.3288 - accuracy: 0.0920
Epoch 2/10
50/50 [==============================] - 5s 91ms/step - loss: 2.3154 - accuracy: 0.1050
Epoch 3/10
50/50 [==============================] - 5s 101ms/step - loss: 2.3114 - accuracy: 0.0900
Epoch 4/10
50/50 [==============================] - 5s 101ms/step - loss: 2.3036 - accuracy: 0.1060
Epoch 5/10
50/50 [==============================] - 5s 99ms/step - loss: 2.2998 - accuracy: 0.1000
Epoch 6/10
50/50 [==============================] - 4s 89ms/step - loss: 2.2986 - accuracy: 0.1170
Epoch 7/10
50/50 [==============================] - 4s 84ms/step - loss: 2.2981 - accuracy: 0.1300
Epoch 8/10
50/50 [==============================] - 5s 103ms/step - loss: 2.2950 - accuracy: 0.1290
Epoch 9/10
50/50 [==============================] - 5s 106ms/step - loss: 2.2960 - accuracy: 0.1210
Epoch 10/10
50/50 [==============================] - 5s 97ms/step - loss: 2.2874 - accuracy: 0.1210

0

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。