Keras中神经网络的尺寸误差

时间:2019-03-15 10:50:19

标签: python-3.x machine-learning keras neural-network conv-neural-network

我正在尝试实现一个神经网络,其中我将一个完全连接的神经网络与卷积神经网络合并/连接。但是当我拟合模型时,出现以下错误:

  

ValueError:所有输入数组(x)的数量应相同   样品。得到的阵列形状:[(1,100,60,4500),(100,4500)]

我有两个不同的输入:

  1. 图像(尺寸:1,100,60,4500),其中1是通道,100:样本数量,60 * 4500(我的图像尺寸)。这进入我的卷积神经网络

  2. 位置(尺寸:100,4500):其中100是指样本。

我的输出尺寸为100,2。

我的神经网络的代码是:

###Convolution neural network
b1 = Sequential()
b1.add(Conv2D(128*2, kernel_size=3,activation='relu',data_format='channels_first',
              input_shape=(100,60,4500)))
b1.add(Conv2D(128*2, kernel_size=3, activation='relu'))
b1.add(Dropout(0.2))

b1.add(Conv2D(128*2, kernel_size=4, activation='relu'))
b1.add(Dropout(0.2))


b1.add(Flatten())
b1.summary()

###Fully connected feed forward neural network
b2 = Sequential()
b2.add(Dense(64, input_shape = (4500,), activation='relu'))
b2.add(Dropout(0.1))
b2.summary()

model = Sequential()

###Concatenating the two networks
concat = concatenate([b1.output, b2.output], axis=-1)

x = Dense(256, activation='relu', kernel_initializer='normal')(concat)
x = Dropout(0.25)(x)
output = Dense(2, activation='softmax')(x)

model = Model([b1.input, b2.input], [output])

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adam(),
              metrics=['accuracy'])

history = model.fit([image, positions], Ytest, batch_size=10,
              epochs=1,
              verbose=1)

此外,我的“图像”数组是4维的原因是因为一开始它只是(100,60,4500),但随后我遇到了以下错误:

  

ValueError:检查输入时出错:预期的conv2d_10_input为   有4个维度,但数组的形状分别为(100,60,4500)

在进行谷歌搜索后,我发现它也希望将通道数作为输入。在添加频道#之后,该错误消失了,但随后遇到了我在开头提到的另一个错误。

那么有人可以告诉我如何解决错误(我一开始指定的错误)吗?帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

混合使用SequentialFunctional API不是一个好习惯。

您可以像这样实现模型

i1 = Input(shape=(1, 60, 4500))

c1 = Conv2D(128*2, kernel_size=3,activation='relu',data_format='channels_first')(i1)
c1 = Conv2D(128*2, kernel_size=3, activation='relu')(c1)
c1 = Dropout(0.2)(c1)
c1 = Conv2D(128*2, kernel_size=4, activation='relu')(c1)
c1 = Dropout(0.2)(c1)
c1 = Flatten()(c1)

i2 = Input(shape=(4500, ))
c2 = Dense(64, input_shape = (4500,), activation='relu')(i2)
c2 = Dropout(0.2)(c2)

c = concatenate([c1, c2])

x = Dense(256, activation='relu', kernel_initializer='normal')(c)
x = Dropout(0.25)(x)
output = Dense(2, activation='softmax')(x)

model = Model([i1, i2], [output])

model.summary()

请注意,i1的形状为shape=(1, 60, 4500)。您已在Conv2D图层中设置了data_format='channels_first',因此一开始需要1

像这样编译模型

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

占位符数据

import numpy as np

X_img = np.zeros((100, 1, 60, 4500))
X_pos = np.ones((100, 4500))
Y = np.zeros((100, 2))

培训

history = model.fit([X_img, X_pos], Y, batch_size=1,
              epochs=1,
              verbose=1)

答案 1 :(得分:1)

您的样本数量(批次大小)应始终为第一维。因此,您的数据的图像形状应为(100, 1, 60, 4500),位置的形状应为(100, 4500)。 Conv2D层的参数channels_first表示通道是第一个非批处理尺寸。

您还需要在第一个Conv2D层中将输入形状更改为(1, 60, 4500)