用CNN替换MLP

时间:2020-01-27 12:23:56

标签: python keras neural-network conv-neural-network

我建立了具有以下架构的NN:

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

print(X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)
(1901, 456, 3) (476, 456, 3) (1901, 3, 3) (476, 3, 3)

model = Sequential()

model.add(Flatten(input_shape=(456,3)))

model.add(Dense(64, activation='relu'))

model.add(Dense(32, activation='relu'))

model.add(Dense(3 * 3))

model.add(Reshape((3, 3)))

model.compile('adam', 'mse')

history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=100)

现在,我想用一个功能相同的模拟CNN代替这种架构;但是当尝试实现这一点时,我总是会遇到不同层的尺寸问题。我的错误总是这样

ValueError:检查输入时出错:预期conv2d_3_input具有4维,但数组的形状为(x,x,x)

数据集保持不变,只是NN体系结构发生了变化,这是我的第一种方法:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
             activation='relu',
             input_shape=(1901,456,3)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

有人可以帮助我将我的第一个NN替换为CNN吗?

2 个答案:

答案 0 :(得分:2)

您的网络定义正确,您在fit操作期间遇到的错误是。为什么会这样呢?

Conv2D正在寻找4D形状的数据,如您在此处看到的:doc

X_train的形状必须为(samples, channels, rows, cols)

当您提供input_shape=(1901,456,3)时,您不必指定样本数。

但是在fit操作期间,您需要将数据塑造为(samples, channels, rows, cols)

现在您看到自己有问题。为什么X_train的形状像这样,似乎只有一张图像。您可以通过使用:

X_train = X_train.reshape((1, 1901, 456, 3))

但是,这似乎很奇怪,您只将一张图像提供给网络。

编辑:在对注释进行澄清后,在这种情况下conv1D会更好,这是如何做到的:

model = Sequential()
model.add(Conv1D(32, kernel_size=3,
             activation='relu',
             input_shape=(456,3)))
model.add(Conv1D(64, 3, activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3 * 3, activation='softmax'))
model.add(Reshape((3, 3))

答案 1 :(得分:-1)

现在一切都在架构上工作了,编译NN也没有问题;

batch_size = 128
epochs = 12


model.compile(
 optimizer='rmsprop',
 loss=tf.keras.losses.MeanSquaredError(),
 metrics=['mse'],
 )

 model.fit(X_test, Y_train,
      batch_size=batch_size,
      epochs=epochs,
      verbose=1,
      validation_data=(X_test, Y_test))
 score = model.evaluate(X_test, Y_test, verbose=0)

但是当尝试适应时,出现以下错误:

ValueError: Input arrays should have the same number of samples as target 
arrays. Found 476 input samples and 1901 target samples.

我在这里想念什么?