题目描述
近期老师布置了一个作业,实现服装分类问题,数据集在来自zalando Research。算法主要通过预测一张图片中的服装种类。在时装数据集中,共有60000张时装图片,每张图片表示一个28*28的像素灰度矩阵,并有一个标签,时装种类一共有10种。
数据集
数据集在网站或者《机器学习算法导论》github网站上可以找到,为方便,我已经将数据集防止在此,可以免费下载使用。
地址:(审核通过后补充)
代码实现
首先需要将数据集放在和这个python一个文件夹下
import pandas as pd
import tensorflow as tf
from matplotlib import pyplot as plt
from sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder
tf = tf.compat.v1
tf.disable_v2_behavior()
from sklearn.model_selection import train_test_split
import numpy as np
def get_data():
df=pd.read_csv("./fashion-mnist_train.csv")
y=df['label'].values
df.drop(['label'],1,inplace=True)
X=df.values
return X,y
def process_feature(X):
scaler=StandardScaler()
X=scaler.fit_transform(X)
scaler=MinMaxScaler(feature_range=(-1,1))
X=scaler.fit_transform(X)
return X
n_hidden1 = 300
n_hidden2 = 100
n_input = 28 * 28
n_class = 10
X = tf.placeholder(tf.float32, shape=(None, n_input))
y = tf.placeholder(tf.float32, shape=None)
hidden1 = tf.layers.dense(X, n_hidden1, activation=tf.nn.relu) # 第一层
hidden2 = tf.layers.dense(hidden1, n_hidden2, activation=tf.nn.relu) # 第二层
outputs = tf.layers.dense(hidden2, n_class) # 第三层,默认使用的是identity函数作为激活函数
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=outputs) # 计算交叉熵
loss = tf.reduce_mean(cross_entropy) # 交叉熵取平均值作为最终函数
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(loss) # 随机梯度下降算子
correct = tf.equal(tf.argmax(y, 1), tf.argmax(outputs, 1))
accuracy_score = tf.reduce_mean(tf.cast(correct, tf.float32))
with tf.Session() as sess: # 计算图的开始
tf.global_variables_initializer().run()
X_data,y_data=get_data()
encoder = OneHotEncoder()
y_data = encoder.fit_transform(y_data.reshape(-1, 1)).toarray()
X_train, X_test,y_train,y_test=train_test_split(X_data,y_data,test_size=0.5,random_state=0)
X_train = process_feature(X_train)
X_test = process_feature(X_test)
for t in range(5000): # 随机梯度下降算法
i = np.random.randint(0, len(X_train))
X_i = X_train[i].reshape(1, -1)
y_i = y_train[i].reshape(1, -1)
sess.run(train_op, feed_dict={X: X_i, y: y_i})
accuracy = accuracy_score.eval(feed_dict={X: X_test, y: y_test})
print("accuracy={}".format(accuracy))
一开始一直报错,折腾了挺久,结果通过和同学交流,发现是少了两句话
encoder = OneHotEncoder()
y_data = encoder.fit_transform(y_data.reshape(-1, 1)).toarray()
忘了将其编码了,多元分类问题记着一定要编码(画超大的重点)
错误提醒如下所示:
?最终运行结果如下:
?由于用的模型较低级,因此准确率并不高,还有待提升,共同学习,共同学习。
|