题意:
给你每个图片的dataframe类型的数据,让你预测出每个图片可能是多少。
数据处理
1.首先把数据从dadaframe转换成numpy,数据类型改为float32,并且并且展开为1维的28×28×1的形状,也就是28宽28高灰色通道。并且都要/255,因为灰度值是0-255,把灰度值压缩成0-1。
2.把train的image和label分开,然后split成训练集合和验证集合。
建立模型:
Sequential(),构建顺序模型,选择按层顺序堆叠。
添加卷积层,32个卷积核,内核为3×3,线性处理。
添加池化层,池化窗口2×2,步长为2。
添加卷积层,32个卷积核,内核为3×3,线性处理。
添加池化层,池化窗口2×2,步长为2。
Flatten(),将二维特征图展平为一维向量。
128个全神经元,relu激活函数。
输出层10个神经元对应10个答案,softmax激活函数进行分类。
代码:
import sys
import pandas as pd
import torch
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
if __name__ == "__main__":
data_train = pd.read_csv("train.csv")
data_test = pd.read_csv("test.csv")
X = data_train.drop(['label'],axis=1).values.reshape(-1, 28, 28, 1).astype('float32')
Y = data_train['label'].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=2)
X_train /= 255.0
X_test /= 255.0
data_test = data_test.values.reshape(-1, 28, 28, 1).astype('float32')/255.0
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), padding='valid', activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2, padding='valid'))
model.add(Conv2D(32, kernel_size=(3, 3), padding='valid', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2, padding='valid'))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(
loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
history = model.fit(X_train, Y_train, epochs=10, validation_split=0.2)
y_pred =model.predict(data_test).argmax(axis=1)
anw = pd.DataFrame({"ImageId": range(1,len(y_pred)+1), "Label": y_pred})
anw.to_csv("Submission.csv", index=False)