私はこのエラーの解決策を見つけようとして数日間インターネットを検索してきましたが、特に当てはまるものは見つかりませんでした。
ValueError: Error when checking target: expected dense_2 to have shape (300,) but got array with shape (60,)
エラーを生成するコードは次のとおりです(データの前処理以外):
model = keras.Sequential([
keras.layers.Conv1D(5,input_shape=(1,60), kernel_size=12, padding='same'),
keras.layers.Conv1D(10, padding='same',activation=tf.nn.relu, kernel_size=10),
keras.layers.Conv1D(20, padding='same',activation=tf.nn.relu, kernel_size=6),
keras.layers.Conv1D(30, padding='same',activation=tf.nn.relu, kernel_size=5),
keras.layers.Flatten(),
keras.layers.Dense(70, activation="relu"),
keras.layers.Dense(300,activation="tanh")
])
model.compile(optimizer=tf.train.AdamOptimizer(0.001),
loss='mse',
metrics=['mae'])
model.fit(traindata,trainlabels, epochs=10, batch_size=int(len(traindata)/60))
このエラーの原因については正確にはわかりませんが、トラブルシューティングを行って可能性を絞り込みました。
私が最初に試みたのは、TensorFlow Webサイトから例の1つを実行してみることでした。ここにある、MNISTファッションの例を選択しました。
これはエラーなしで実行され、正常にトレーニングされたため、TensorFlowまたはPythonのダウンロードのエラーではないと思います。
次に、MNISTファッションの例で使用されたモデルをコピーして、モデルのエラーかどうかをテストしました。これはコードです:
model = keras.Sequential([
keras.layers.Flatten(input_shape=(60,)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer=tf.train.AdamOptimizer(),
loss = 'sparse_categorical_cross_entropy',
metrics = ['accuracy']
)
モデルに加えた唯一の変更は、最初のレイヤーへの入力シェイプでした。これにより、データを取り込むことができるようになりました。ただし、エラーは引き続き発生しました。
ValueError: Error when checking target: expected dense_1 to have shape (10,) but got array with shape (60,)
私が最後に試したのは、を介して作成されたダミーデータを取り込む独自の高密度モデルを作成することnp.random.random
でした。
これはファイル全体です:
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
data = np.random.random((50,60))
datalabels = np.random.random((50,60))
model = keras.Sequential([
keras.layers.Dense(128,input_shape=(60,), activation="relu"),
keras.layers.Dense(50, activation="relu"),
keras.layers.Dense(10, activation="tanh")
])
model.compile(optimizer=tf.train.AdamOptimizer(),
loss="mae",
metrics=['mse'])
model.fit(data, datalabels, epochs=5, batch_size=10)
これもエラーが発生し、理由がわかりませんが、ダミーデータの生成に関係しているのではないかと思います。
ValueError: Error when checking target: expected dense_2 to have shape (10,) but got array with shape (60,)
それが役立つ場合は、最後のモデルのすべてのレイヤーとその入力および出力の形状を印刷しました。
Layer: dense
input_shape: (None, 60)
output_shape: (None, 128)
Layer: dense_1
input_shape: (None, 128)
output_shape: (None, 50)
Layer: dense_2
input_shape: (None, 50)
output_shape: (None, 10)
このエラーについて私が最も困惑しているのは、出力レイヤーでのエラーのみであるということです。モデルの最後に別のレイヤーを追加すると、出力レイヤーのユニット数がモデルの入力の形状と等しくない限り、そのレイヤーはエラーになります(例:input_shape=(60,)
最後のレイヤーのユニット数が等しい場合) 60まで)。なぜこれが起こっているのか誰かが知っていますか?
を使用するmodel.summary()
と、各レイヤーの出力形状が表示されます。提供した最初の例では、最後のレイヤーの出力形状(モデルの出力形状でもあります)は(None, 300)
です。これは、形状のラベル(300,)
(つまり、各ラベルの形状)を期待することを意味します。しかし、それは呼び出し時に、あなたがモデルに提供ラベル配列と思われるfit
、すなわちtrainlabels
、の形状を有しています(num_samples, 60)
。一方、モデルの出力形状と一致している必要があるため、の形状は(num_samples, 300)
です。同じことが、あなたが言及した他のすべての失敗した例にも当てはまります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加