[英]ValueError: Error when checking input: expected conv3d_1_input to have 5 dimensions, but got array with shape (7, 9, 384, 1)
[英]ValueError: Error when checking input: expected conv1d_29_input to have 3 dimensions, but got array with shape (150, 1320)
momentum_rate = 0.5
learning_rate = 0.1
neurons = 30
def convolutional_neural_network(x, y):
print("Hyper-parameter values:\n")
print('Momentum Rate =',momentum_rate,'\n')
print('learning rate =',learning_rate,'\n')
print('Number of neurons =',neurons,'\n')
model = Sequential()
#model.summary()
model.add(Conv1D(input_shape=(X.shape[1],X.shape[0]),activation='relu',kernel_size = 1,filters = 64))
model.add(Flatten())
model.add(Dense(neurons,activation='relu')) # first hidden layer
model.summary()
model.add(Dense(neurons, activation='relu'))
model.summary()# second hidden layer
model.add(Dense(neurons, activation='relu'))
model.summary()
model.add(Dense(neurons, activation='relu'))
model.summary()
model.add(Dense(10, activation='softmax'))
model.summary()
sgd = optimizers.SGD(lr=learning_rate, decay=1e-6, momentum=momentum_rate, nesterov=True)
model.summary()
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy',tensorflow.keras.metrics.Precision()])
model.summary()
history = model.fit(X, y, validation_split=0.2, epochs=10)
model.summary()
print("\nTraining Data Statistics:\n")
print("CNN Model with Relu Hidden Units and Cross-Entropy Error Function:")
print(convolutional_neural_network(X,y))
X 的形状是 (150, 1320) y 的形状是 (150,)
这是我得到的输出:
Model: "sequential_36"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d_30 (Conv1D) (None, 1320, 64) 9664
_________________________________________________________________
flatten_21 (Flatten) (None, 84480) 0
_________________________________________________________________
dense_106 (Dense) (None, 30) 2534430
_________________________________________________________________
dense_107 (Dense) (None, 30) 930
_________________________________________________________________
dense_108 (Dense) (None, 30) 930
_________________________________________________________________
dense_109 (Dense) (None, 30) 930
_________________________________________________________________
dense_110 (Dense) (None, 10) 310
=================================================================
Total params: 2,547,194
Trainable params: 2,547,194
Non-trainable params: 0
ValueError: Error when checking input: expected conv1d_30_input to have 3 dimensions, but got array with shape (150, 1320)
Conv1D
需要一个input_shape
形式的(steps, input_dim)
( 参见文档)。 现在,如果我正确理解您的input_dim=1
因为 1320 是样本数,150 是数组的长度。 在这种情况下,更改input_shape=(X.shape[1], X.shape[2])
。
编辑:目前还不清楚你想做什么。 下面的代码正在运行,并显示了您网络的预期形状。 但请注意,我更改了 y 维度以匹配行数和输出层。 我不确定 y 形状 (150,) 代表什么。
X = tf.random.normal((1320,150,1))
y = tf.random.uniform((1320,10))
momentum_rate = 0.5
learning_rate = 0.1
neurons = 30
def convolutional_neural_network(x, y):
print("Hyper-parameter values:\n")
print('Momentum Rate =',momentum_rate,'\n')
print('learning rate =',learning_rate,'\n')
print('Number of neurons =',neurons,'\n')
model = Sequential()
#model.summary()
model.add(Conv1D(input_shape=(X.shape[1], X.shape[2]),activation='relu',kernel_size = 1,filters = 64))
model.add(Flatten())
model.add(Dense(neurons,activation='relu')) # first hidden layer
model.add(Dense(neurons, activation='relu'))
model.add(Dense(neurons, activation='relu'))
model.add(Dense(neurons, activation='relu'))
model.add(Dense(10, activation='softmax'))
sgd = optimizers.SGD(lr=learning_rate, decay=1e-6, momentum=momentum_rate, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'] )
history = model.fit(X, y, validation_split=0.2, epochs=10)
model.summary()
print("\nTraining Data Statistics:\n")
print("CNN Model with Relu Hidden Units and Cross-Entropy Error Function:")
print(convolutional_neural_network(X,y))
由于您的错误反映了您的输入形状是(150, 1320)
。 在评论中你说你有 1320 个样本(行)和 150 个特征(列)。
让我们制作一些具有上述形状的临时数据作为X
和y
:
X = tf.random.uniform((150,1320))
y = tf.random.uniform((1320,10))
#10 label for each sample which maybe a little strange, take care of it
现在我们有X
与形状(150,1320)
和y
与形状(1320,10)
由于我们有 1320 个样本,它应该是第一个轴,我们必须将它转置:
X = tf.transpose(X)
现在 X 形状将是(1320,150)
而不是(150,1320)
。
由于Conv1D 层需要输入为batch_shape + (steps, input_dim)
,我们需要添加一个新维度。 所以:
X = tf.expand_dims(X,axis=2)
print(X.shape, y.shape) # X.shape=(1320, 150, 1) y.shape=(1320,10)
然后,我们的 X 形状为(1320,150,1)
现在,让我们在Conv1D
层中指定输入形状:
model.add(Conv1D(input_shape=(X.shape[1:]),activation='relu',kernel_size = 1,filters = 64))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.