繁体   English   中英

Tensorflow ValueError:形状 (64, 1) 和 (1, 1) 不兼容

[英]Tensorflow ValueError: Shapes (64, 1) and (1, 1) are incompatible

我正在尝试构建一个 Siamese 神经网络来分析 MNIST 数据集,但是当尝试将 model 拟合到数据集时,我遇到了这个问题,据此我有训练数据和标签形状不匹配。 我尝试更改损失 function 并尝试压缩标签数组,但“解决方案”均无效。

以下是火车和标签数组的形状:

pairTrain shape: (120000, 2, 28, 28, 1)
labelTrain shape: (120000, 1)

这是我的 model:

def build_model(input_shape, embedDim=48):
    inputs = Input(input_shape)

    x = Conv2D(64, (2, 2), padding="same", activation="relu", input_shape=input_shape)(inputs)
    x = MaxPooling2D()(x)
    x = Dropout(0.3)(x)

    x = Conv2D(32, (2, 2), padding="same", activation="relu")(x)
    x = MaxPooling2D()(x)
    x = Dropout(0.3)(x)

    x = Conv2D(16, (2, 2), padding="same", activation="relu")(x)
    x = MaxPooling2D()(x)
    x = Dropout(0.3)(x)

    outputs = Flatten()(x)
    outputs = Dense(embedDim)(outputs)

    model = Model(inputs, outputs)

    return model

最后是产生错误的代码:


imgA = Input(shape=(28, 28, 1))
imgB = Input(shape=(28, 28, 1))

featA = build_model((28, 28, 1))(imgA)
featB = build_model((28, 28, 1))(imgB)

distance = Lambda(euclidean_distance)([featA, featB])
output = Dense(1, activation="sigmoid")(distance)

model = Model([imgA, imgB], output)

model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
history = model.fit(
    [pairTrain[:, 0], pairTrain[:, 1]], labelTrain,
    validation_data=[[pairTest[:, 0], pairTest[:, 1]], labelTest],
    batch_size=64,
    epochs=10
)

model.save("output/siamese_model")

请帮助我解决问题。

我无法使用以下代码重现错误。 我怀疑您的标签形状与您报告的不同,或者它不包含严格的二进制数据(0 和 1)。

此外,您应该使用tf.keras.losses.BinaryCrossentropy而不是tf.keras.losses.CategoricalCrossentropy因为您的标签应该是二进制的,并且在最后一层中使用sigmoid激活。

from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Input, Flatten, Dense, Lambda
from tensorflow.keras.models import Model
import tensorflow as tf

def build_model(input_shape, embedDim=48):
    inputs = Input(input_shape)

    x = Conv2D(64, (2, 2), padding="same", activation="relu", input_shape=input_shape)(inputs)
    x = MaxPooling2D()(x)
    x = Dropout(0.3)(x)

    x = Conv2D(32, (2, 2), padding="same", activation="relu")(x)
    x = MaxPooling2D()(x)
    x = Dropout(0.3)(x)

    x = Conv2D(16, (2, 2), padding="same", activation="relu")(x)
    x = MaxPooling2D()(x)
    x = Dropout(0.3)(x)

    outputs = Flatten()(x)
    outputs = Dense(embedDim)(outputs)

    model = Model(inputs, outputs)

    return model

imgA = Input(shape=(28, 28, 1))
imgB = Input(shape=(28, 28, 1))

featA = build_model((28, 28, 1))(imgA)
featB = build_model((28, 28, 1))(imgB)

distance = Lambda(lambda x: x[0]-x[1])([featA, featB])
output = Dense(1, activation="sigmoid")(distance)

model = Model([imgA, imgB], output)

pairTrain =  tf.random.uniform((10, 2, 28, 28, 1))
labelTrain = tf.random.uniform(shape=(10, 1), minval=0, maxval=2, dtype=tf.int32)

pairTest =  tf.random.uniform((10, 2, 28, 28, 1))
labelTest = tf.random.uniform(shape=(10, 1), minval=0, maxval=2, dtype=tf.int32)

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
history = model.fit(
    [pairTrain[:, 0], pairTrain[:, 1]], labelTrain,
    validation_data=[[pairTest[:, 0], pairTest[:, 1]], labelTest],
    batch_size=64,
    epochs=10
)

model.save("output/siamese_model")
Epoch 1/10
1/1 [==============================] - 2s 2s/step - loss: 0.7061 - accuracy: 0.5000 - val_loss: 0.6862 - val_accuracy: 0.7000
Epoch 2/10
1/1 [==============================] - 0s 80ms/step - loss: 0.7882 - accuracy: 0.4000 - val_loss: 0.6751 - val_accuracy: 0.6000
Epoch 3/10
1/1 [==============================] - 0s 81ms/step - loss: 0.6358 - accuracy: 0.5000 - val_loss: 0.6755 - val_accuracy: 0.6000
Epoch 4/10
1/1 [==============================] - 0s 79ms/step - loss: 0.7027 - accuracy: 0.5000 - val_loss: 0.6759 - val_accuracy: 0.6000
Epoch 5/10
1/1 [==============================] - 0s 82ms/step - loss: 0.6970 - accuracy: 0.4000 - val_loss: 0.6752 - val_accuracy: 0.6000
Epoch 6/10
1/1 [==============================] - 0s 83ms/step - loss: 0.7564 - accuracy: 0.4000 - val_loss: 0.6779 - val_accuracy: 0.6000
Epoch 7/10
1/1 [==============================] - 0s 73ms/step - loss: 0.7123 - accuracy: 0.6000 - val_loss: 0.6818 - val_accuracy: 0.6000

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM