第一个 CNN 和形状错误
First CNN and shapes error
我刚开始构建我的第一个 CNN。我正在练习 MNIST 数据集,这是我刚刚编写的代码:
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, Dropout, Flatten, Dense
from tensorflow.keras.losses import categorical_crossentropy
from tensorflow.keras.optimizers import Adam
from sklearn.preprocessing import RobustScaler
import os
import numpy as np
import matplotlib.pyplot as plt
# CONSTANTS
EPOCHS = 300
TIME_STEPS = 30000
NUM_CLASSES = 10
# Loading data
print('Loading data:')
(train_X, train_y), (test_X, test_y) = mnist.load_data()
print('X_train: ' + str(train_X.shape))
print('Y_train: ' + str(train_y.shape))
print('X_test: ' + str(test_X.shape))
print('Y_test: ' + str(test_y.shape))
print('------------------------------')
# Splitting train/val
print('Splitting training/validation set:')
X_train = train_X[0:TIME_STEPS, :]
X_val = train_X[TIME_STEPS:TIME_STEPS*2, :]
print('X_train: ' + str(X_train.shape))
print('X_val: ' + str(X_val.shape))
# Normalizing data
print('------------------------------')
print('Normalizing data:')
X_train = X_train/255
X_val = X_val/255
print('X_train: ' + str(X_train.shape))
print('X_val: ' + str(X_val.shape))
# Building model
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=5, input_shape=(28, 28)))
model.add(Conv1D(filters=16, kernel_size=4, activation="relu"))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(NUM_CLASSES, activation='softmax'))
model.compile(optimizer=Adam(), loss=categorical_crossentropy, metrics=['accuracy'])
model.summary()
model.fit(x=X_train, y=X_train, batch_size=10, epochs=EPOCHS, shuffle=False)
我要解释一下我做了什么,任何更正都会有帮助,这样我就可以了解更多信息:
- 我做的第一件事是将训练集分成两部分:训练部分和验证部分,我想在测试集上进行测试之前对其进行训练。
- 然后,我将数据归一化(这是我们处理图像时的标准吗?)
- 然后我用一个简单的结构构建了我的 CNN:第一层是获取输入的层(尺寸为 28x28),我选择了 32 个过滤器,这些过滤器应该足以在这个数据集上表现良好。内核大小是我不理解的那个,因为我认为内核相当于过滤器。我选择了一个较低的数字以避免出现问题。第二层和上层类似,不过现在有激活函数(relu,不过我不服气,我想着用一个softmax把一组概率传递给全连接层)。
- 最后3层是全连接层得到输出。
在 fit 函数中,我使用了 10 的批量大小,我认为这可能是我收到错误的原因之一:
ValueError: Shapes (10, 28, 28) and (10, 10) are incompatible
即使删除它,我仍然收到以下错误:
ValueError: Shapes (None, 28, 28) and (None, 10) are incompatible
我是不是漏掉了什么重要的东西?
您两次传入 X_train
变量,一次作为 x
参数,一次作为 y
参数。与其将 X_train
作为 .fit()
中的 y
参数传入,不如传入一组您尝试预测的值。鉴于您使用的是 MNIST,假设您正在尝试预测写入的数字,因此您的 y 数组的形状应该是 (n_samples, 10)
,并且数字是单热编码的。
我刚开始构建我的第一个 CNN。我正在练习 MNIST 数据集,这是我刚刚编写的代码:
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, Dropout, Flatten, Dense
from tensorflow.keras.losses import categorical_crossentropy
from tensorflow.keras.optimizers import Adam
from sklearn.preprocessing import RobustScaler
import os
import numpy as np
import matplotlib.pyplot as plt
# CONSTANTS
EPOCHS = 300
TIME_STEPS = 30000
NUM_CLASSES = 10
# Loading data
print('Loading data:')
(train_X, train_y), (test_X, test_y) = mnist.load_data()
print('X_train: ' + str(train_X.shape))
print('Y_train: ' + str(train_y.shape))
print('X_test: ' + str(test_X.shape))
print('Y_test: ' + str(test_y.shape))
print('------------------------------')
# Splitting train/val
print('Splitting training/validation set:')
X_train = train_X[0:TIME_STEPS, :]
X_val = train_X[TIME_STEPS:TIME_STEPS*2, :]
print('X_train: ' + str(X_train.shape))
print('X_val: ' + str(X_val.shape))
# Normalizing data
print('------------------------------')
print('Normalizing data:')
X_train = X_train/255
X_val = X_val/255
print('X_train: ' + str(X_train.shape))
print('X_val: ' + str(X_val.shape))
# Building model
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=5, input_shape=(28, 28)))
model.add(Conv1D(filters=16, kernel_size=4, activation="relu"))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(NUM_CLASSES, activation='softmax'))
model.compile(optimizer=Adam(), loss=categorical_crossentropy, metrics=['accuracy'])
model.summary()
model.fit(x=X_train, y=X_train, batch_size=10, epochs=EPOCHS, shuffle=False)
我要解释一下我做了什么,任何更正都会有帮助,这样我就可以了解更多信息:
- 我做的第一件事是将训练集分成两部分:训练部分和验证部分,我想在测试集上进行测试之前对其进行训练。
- 然后,我将数据归一化(这是我们处理图像时的标准吗?)
- 然后我用一个简单的结构构建了我的 CNN:第一层是获取输入的层(尺寸为 28x28),我选择了 32 个过滤器,这些过滤器应该足以在这个数据集上表现良好。内核大小是我不理解的那个,因为我认为内核相当于过滤器。我选择了一个较低的数字以避免出现问题。第二层和上层类似,不过现在有激活函数(relu,不过我不服气,我想着用一个softmax把一组概率传递给全连接层)。
- 最后3层是全连接层得到输出。
在 fit 函数中,我使用了 10 的批量大小,我认为这可能是我收到错误的原因之一:
ValueError: Shapes (10, 28, 28) and (10, 10) are incompatible
即使删除它,我仍然收到以下错误:
ValueError: Shapes (None, 28, 28) and (None, 10) are incompatible
我是不是漏掉了什么重要的东西?
您两次传入 X_train
变量,一次作为 x
参数,一次作为 y
参数。与其将 X_train
作为 .fit()
中的 y
参数传入,不如传入一组您尝试预测的值。鉴于您使用的是 MNIST,假设您正在尝试预测写入的数字,因此您的 y 数组的形状应该是 (n_samples, 10)
,并且数字是单热编码的。