Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow Keras输出层形状错误_Tensorflow_Keras - Fatal编程技术网

Tensorflow Keras输出层形状错误

Tensorflow Keras输出层形状错误,tensorflow,keras,Tensorflow,Keras,总的来说,我对TF、Keras和ML是相当陌生的。 我试图实现一个非常简单的MLP,输入形状为(batch\u size,3,2),输出形状为(batch\u size,3),也就是说(如果我做得对的话):对于每个3x2特性,都有一个对应的3值数组标签 以下是我创建模型的方式: model = tf.keras.Sequential([ tf.keras.layers.Dense(50,tf.keras.activations.relu,input_shape=((3,2)),

总的来说,我对TF、Keras和ML是相当陌生的。 我试图实现一个非常简单的MLP,输入形状为
(batch\u size,3,2)
,输出形状为
(batch\u size,3)
,也就是说(如果我做得对的话):对于每个3x2特性,都有一个对应的3值数组标签

以下是我创建模型的方式:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(50,tf.keras.activations.relu,input_shape=((3,2)),
    tf.keras.layers.Dense(3)
])
这些是X和y形状:

X_train.shape,y_train.shape

TensorShape([64,3,2]),TensorShape([64,3])
model.fit
上,我遇到了一个我无法理解的奇怪错误:

ValueError: Dimensions must be equal, but are 3 and 32 for ... with input shapes: [32,3,3] and [32,3]
我不知道发生了什么,我知道批量大小是32,但这是从哪里来的

此外,如果从原来的64,我将X\u列和y\u列的数量(形状)降低到:
(19,3,2)
(19,3)
,我会得到以下错误:

InvalidArgumentError: required broadcastable shapes at loc(unknown)
对我来说更奇怪的是,如果我为输出(最后一个)层指定一个单位,而不是像这样指定3个单位:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(50,tf.keras.activations.relu,input_shape=((3,2)),
    tf.keras.layers.Dense(1)
])
model.fit
有效,但预测的形状是(1,3,1),而不是我预期的(3,)


我很困惑。

如果您对整个模型中的数据过程一无所知,请使用
model.summary()
查看详细信息以及每一层中数据的形状会发生什么变化

在本例中,输入是2D数组,输出是1D数组,您只使用了密集层。密集层无法处理自然界中的二维特征。例如,对于作为输入的图像,不能将其直接馈送到密集层。相反,在将数据馈送到密集层之前,应该使用其他层,如Conv2D或展平输入(使其为1D)。否则,您将在输出中获得另一个维度


推断:如果输入维度和输出维度不同,则需要在模型中的某个位置更改形状。最常见的方法是使用
plant
层或
GlobalAveragePooling
等等。

如果您对整个模型中的数据过程一无所知,请使用
model.summary()
查看详细信息以及每个层中的数据形状发生了什么变化

在本例中,输入是2D数组,输出是1D数组,您只使用了密集层。密集层无法处理自然界中的二维特征。例如,对于作为输入的图像,不能将其直接馈送到密集层。相反,在将数据馈送到密集层之前,应该使用其他层,如Conv2D或展平输入(使其为1D)。否则,您将在输出中获得另一个维度


推断:如果输入维度和输出维度不同,则需要在模型中的某个位置更改形状。最常用的方法是使用
展平
层或
全局平均池
等等。

将输入传递到密集层时,应首先展平输入。有两种方法可以解决此问题:

方式1:添加展平输入作为模型的第一层

model = Sequential()
model.add(Flatten(input_shape=(3,2)))
model.add(Dense(50, 'relu'))
model.add(Dense(3))
X_train = tf.reshape(X_train, shape=([6]))
方式2:在将输入传递到模型之前,将2D数组转换为1D

model = Sequential()
model.add(Flatten(input_shape=(3,2)))
model.add(Dense(50, 'relu'))
model.add(Dense(3))
X_train = tf.reshape(X_train, shape=([6]))

然后将第一层的输入形状更改为:

model.add(Dense(50, 'relu', input_shape=(6,))

将输入传递到密集层时,应首先展平输入。有两种方法可以解决此问题:

方式1:添加展平输入作为模型的第一层

model = Sequential()
model.add(Flatten(input_shape=(3,2)))
model.add(Dense(50, 'relu'))
model.add(Dense(3))
X_train = tf.reshape(X_train, shape=([6]))
方式2:在将输入传递到模型之前,将2D数组转换为1D

model = Sequential()
model.add(Flatten(input_shape=(3,2)))
model.add(Dense(50, 'relu'))
model.add(Dense(3))
X_train = tf.reshape(X_train, shape=([6]))

然后将第一层的输入形状更改为:

model.add(Dense(50, 'relu', input_shape=(6,))

因为您的输入是2D,但输出是1D,并且您没有展平输入。为输入添加一个展平层,如下所示:
tf.keras.layers.Flatten(input_shape=(3,2))
作为第一层,并从密集层中删除
input_shape
参数。检查
model.summary()
以查看详细信息。@Kaveh ok。。这是否意味着输入和输出必须以某种方式具有相同的形状?不。您可以使用2D输入,然后将其移动到各个层,最后是1D输出,但密集层不能处理2D数据,您可以使用Conv2D层。在这种情况下,您只使用了密集层,在将数据馈送到密集层之前,应该将其展平。否则,您将在输出处看到尺寸。因为您的输入是2D,但输出是1D,并且您没有展平输入。为输入添加一个展平层,如下所示:
tf.keras.layers.Flatten(input_shape=(3,2))
作为第一层,并从密集层中删除
input_shape
参数。检查
model.summary()
以查看详细信息。@Kaveh ok。。这是否意味着输入和输出必须以某种方式具有相同的形状?不。您可以使用2D输入,然后将其移动到各个层,最后是1D输出,但密集层不能处理2D数据,您可以使用Conv2D层。在这种情况下,您只使用了密集层,在将数据馈送到密集层之前,应该将其展平。否则,您将在输出中看到维度。谢谢,我不知道您可以查看此存储库,其中包含tensorflow中最先进的神经网络实现:谢谢,我不知道您可以查看此存储库,其中包含tensorflow中最先进的神经网络实现: