我建立了具有以下架构的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吗?
答案 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.
我在这里想念什么?