我有一个数据集,其中x_train的形状是(34650,10,1),y_train的形状是(34650,),x_test的形状是(17067,10,1),y_test的形状是(17067,)。
我正在构建一个简单的CNN模型 –
input_layer = Input(shape=(10, 1))conv2 = Conv1D(filters=64, kernel_size=3, strides=1, activation='relu')(input_layer)pool1 = MaxPooling1D(pool_size=1)(conv2)drop1 = Dropout(0.5)(pool1)pool2 = MaxPooling1D(pool_size=1)(drop1)conv3 = Conv1D(filters=64, kernel_size=3, strides=1, activation='relu')(pool2)drop2 = Dropout(0.5)(conv3)conv4 = Conv1D(filters=64, kernel_size=3, strides=1, activation='relu')(drop2)pool3 = MaxPooling1D(pool_size=1)(conv4)conv5 = Conv1D(filters=64, kernel_size=3, strides=1, activation='relu')(pool3)output_layer = Dense(1, activation='sigmoid')(conv5)model_2 = Model(inputs=input_layer, outputs=output_layer)
但是当我尝试拟合模型时
model_2.compile(loss='mse',optimizer='adam')model_2 = model_2.fit(x_train, y_train, batch_size=128, epochs=2, verbose=1, validation_data=(x_test, y_test))
我得到了这个错误
---------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython-input-177-aee9b3241a20> in <module>() 4 epochs=2, 5 verbose=1,----> 6 validation_data=(x_test, y_test))2 frames/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 133 ': expected ' + names[i] + ' to have ' + 134 str(len(shape)) + ' dimensions, but got array '--> 135 'with shape ' + str(data_shape)) 136 if not check_batch_axis: 137 data_shape = data_shape[1:]ValueError: Error when checking target: expected dense_14 to have 3 dimensions, but got array with shape (34650, 1)
x_train和x_test的形状已经是三维的,那么为什么会显示这个错误呢?
回答:
这是因为你的输入是三维的,而你的目标是二维的。在你的网络内部,没有任何东西可以让你从三维转换到二维。要做到这一点,你可以使用全局池化或扁平化。下面是一个例子
n_sample = 100X = np.random.uniform(0,1, (n_sample,10,1))y = np.random.randint(0,2, n_sample)input_layer = Input(shape=(10, 1))conv2 = Conv1D(filters=64, kernel_size=3, strides=1, activation='relu')(input_layer)pool1 = MaxPooling1D(pool_size=1)(conv2)drop1 = Dropout(0.5)(pool1)pool2 = MaxPooling1D(pool_size=1)(drop1)conv3 = Conv1D(filters=64, kernel_size=3, strides=1, activation='relu')(pool2)drop2 = Dropout(0.5)(conv3)conv4 = Conv1D(filters=64, kernel_size=3, strides=1, activation='relu')(drop2)pool3 = MaxPooling1D(pool_size=1)(conv4)conv5 = Conv1D(filters=64, kernel_size=3, strides=1, activation='relu')(pool3)x = GlobalMaxPool1D()(conv5) # =====> 从三维转换到二维(也可以使用GlobalAvg1D或Flatten)output_layer = Dense(1, activation='sigmoid')(x)model_2 = Model(inputs=input_layer, outputs=output_layer)model_2.compile('adam', 'binary_crossentropy')model_2.fit(X,y, epochs=3)