keras – 如何在使用Lambda层时避免维度错误

我在使用基于TensorFlow的Keras和Python时,尝试使用Lambda层,但一直遇到相同的错误。我检查了模型的摘要,一切看起来都正常。错误仅在训练时发生。

from keras.datasets import mnist from keras.layers import Dense, Input, concatenate,subtract, Lambdafrom keras.losses import binary_crossentropyfrom keras.optimizers import SGD(train_x, train_y), (test_x, test_y) = mnist.load_data()train_x = (train_x / 255.0).reshape(-1, 28*28) test_x = (test_x / 255.0).reshape(-1, 28*28)inp1 = Input(shape=(28*28,))inp2 = Input(shape=(28*28,))l1 = Dense(100, activation="relu")a1 = l1(inp1)a2 = l1(inp2)l2 = Dense(100, activation="relu")b1 = l2(a1)b2 = l2(a2)output = Lambda(lambda inputs: inputs[0]-inputs[1], output_shape=(100,))([b1, b2])model = Model([inp1, inp2], [output])model.compile(loss=binary_crossentropy, optimizer=SGD())y = train_y[:1]model.fit([train_x[:1], train_x[:1]], y)

我得到的错误是

检查目标时出错:期望lambda_13的形状为(100,),但得到的数组形状为(1,)

当对相同数据使用model.predict时,它可以无错误地进行预测。这里有什么问题?谢谢


回答:

问题在于你期望模型预测的形状为(100,),而你尝试拟合的数据形状为(1,)。这里,如果你想使用当前的y,output_shape=(100,) 应该改为1。

另外,如果你想对形状为(1,)的输出进行数字分类。你还需要将model.compile(loss=binary_crossentropy, optimizer=SGD())更改为model.compile(loss=sparse_categorical_crossentropy, optimizer=SGD())。关于sparse_categorical_crossentropy的更多信息,你可以查看Keras文档。你还可以在这里找到categorical_crossentropysparse_categorical_crossentropy之间的区别这里

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注