我正在尝试实现一个神经网络,其中我将一个完全连接的神经网络与卷积神经网络合并/连接。但是当我拟合模型时,出现以下错误:
ValueError:所有输入数组(x)的数量应相同 样品。得到的阵列形状:[(1,100,60,4500),(100,4500)]
我有两个不同的输入:
图像(尺寸:1,100,60,4500),其中1是通道,100:样本数量,60 * 4500(我的图像尺寸)。这进入我的卷积神经网络
位置(尺寸: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)
在进行谷歌搜索后,我发现它也希望将通道数作为输入。在添加频道#之后,该错误消失了,但随后遇到了我在开头提到的另一个错误。
那么有人可以告诉我如何解决错误(我一开始指定的错误)吗?帮助将不胜感激。
答案 0 :(得分: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()
请注意,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)
。