【问题标题】:Dimension errors in neural network in KerasKeras神经网络中的维度错误
【发布时间】:2019-08-06 10:26:42
【问题描述】:

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

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 之后,这个错误就消失了,但后来我遇到了我在开头提到的另一个错误。

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

【问题讨论】:

  • input_shape=(100,60,4500) 更改为 (1, 60, 4500)

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


【解决方案1】:

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

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

【讨论】:

  • 我改变了形状,但后来我遇到了我之前提到的以下错误:** ValueError: Error when checks input: expected conv2d_13_input to have 4 dimensions, but got array with shape (100, 60, 4500)** 。我的图像形状现在是(100,1,60,4500),位置相同(100,4500)
  • 您是否也更改了input_shape
  • 这个虚拟数据对我有用:image = np.random.rand(100,1,60,4500)positions = np.random.rand(100,4500)Ytest = np.random.randint(2, size=(100,2))
【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2017-07-08
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多