我的神经网络出错,我不知道为什么

My neural network gives an error and I don't know why

我对神经网络编程还比较陌生,在决定尝试使用我所学的知识自行编写神经网络程序之前,我一直在学习一些有关它的教程。我一直在尝试编写一个基本的神经网络程序,这样我就可以了解它是如何工作的,但它一直给我一个错误。如果有人能提供帮助,我将不胜感激。

这是我的代码:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D

import pickle

pickle_in = open("X.pickle","rb")
X = pickle.load(pickle_in)

pickle_in = open("y.pickle","rb")
y = pickle.load(pickle_in)

X = X/255.0

model = Sequential()
model.add(Conv2D(8,(5, 5),padding="same",activation='relu',input_shape=(784,)))
model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(Flatten())
model.add(Dense(1))
model.add(Activation('linear'))
model.add(Dense(y.shape[1]))
model.add(Activation('linear'))

model.summary()
model.compile(loss='mean_squared_error',optimizer='adam',metrics=['mae','mse', 'accuracy'])

model.fit(X, y, epochs=20, batch_size=10,verbose=2)

这是我收到的错误消息:

str(x.shape.as_list()))
ValueError: Input 0 of layer conv2d is incompatible with the layer: expected ndim=4, found ndim=2. Full shape received: [None, 784]

提前致谢!

错误是因为 Conv2D 期望输入形状为 4 维,即 [batch_size、高度、宽度、通道]。您可以做一件事,即重塑您对模型的输入。

X = X.reshape(-1, 28, 28, 1) # incase of single channel (grayscale)
# OR
X = X.reshape(-1, 28, 28, 3) # incase of RGB
# and then change the input shape of your `Conv2D` layer accordingly to
model = Sequential()
model.add(Conv2D(8,(5, 5),padding="same",activation='relu',input_shape=(28,28,1)))
# OR
model = Sequential()
model.add(Conv2D(8,(5, 5),padding="same",activation='relu',input_shape=(28,28,3)))