2

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

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) 的数组

在谷歌搜索后,我发现它也需要 # of channels 作为输入。在我添加 # of channel 之后,这个错误就消失了,但后来我遇到了我在开头提到的另一个错误。

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

4

2 回答 2

2

Sequential混合和不是一个好习惯Functional 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()

注意的形状i1shape=(1, 60, 4500)。您已data_format='channels_first'在 Conv2D 层中设置,因此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)
于 2019-03-15T11:11:56.300 回答
1

您的样本数量(批量大小)应该始终是第一个维度。因此,您的数据应该具有(100, 1, 60, 4500)图像和(100, 4500)位置的形状。Conv2D 层的参数channels_first意味着通道是第一个非批量维度。

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

于 2019-03-15T11:05:52.710 回答