小言_互联网的博客

Kaggle---Digit Recognizer

314人阅读  评论(0)

用下面的程序可以达到0.918的精度

先得出数据


import pandas as pd
import numpy as np
import tensorflow as tf
 
# 1 加载数据集,把对输入和结果分开
train = pd.read_csv('./train.csv')
images_train = train.iloc[:,1:].values
labels_train = train.iloc[:,0].values
 
test = pd.read_csv('./test.csv')
images_test = test.iloc[:,:].values
 
# 2 对输入进行处理
images_train = images_train.astype(np.float)
images_train = np.multiply(images_train,1.0/255)
images_test = images_test.astype(np.float)
images_test = np.multiply(images_test,1.0/255)
 
images_size = images_train.shape[1]
 
images_width = images_height = np.ceil(np.sqrt(images_size)).astype(np.uint8)
 
# 3 对结果进行处理
labels_count = np.unique(labels_train).shape[0]
 
# 进行one-hot编码
def dense_to_ont_hot(labels_dense,num_classes):
    num_labels = labels_dense.shape[0]
    index_offset = np.arange(num_labels) * num_classes
    labels_one_hot = np.zeros((num_labels,num_classes))
    labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
    return labels_one_hot
 
labels = dense_to_ont_hot(labels_train,labels_count)
labels = labels.astype(np.uint8)
 
# 4 对训练集进行分批
batch_size = 64
n_batch = int(len(images_train)/batch_size)
 
# 5 创建一个简单的神经网络用来对图片进行识别
x = tf.placeholder('float',shape=[None,images_size])
y = tf.placeholder('float',shape=[None,labels_count])
 
weights = tf.Variable(tf.zeros([784,10]))
biases = tf.Variable(tf.zeros([10]))
result = tf.matmul(x, weights) + biases
predictions = tf.nn.softmax(result)
 
# 6 创建损失函数,以交叉熵的平均值为衡量
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=predictions))
 
# 7 用梯度下降法优化参数
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
 
# 8 初始化变量
init = tf.global_variables_initializer()
 
# 9 计算预测值
with tf.Session() as sess:
    # 初始化
    sess.run(init)
    # 循环50轮
    for epoch in range(50):
        for batch in range(n_batch-1):
            batch_x = images_train[batch*batch_size:(batch+1)*batch_size] 
            batch_y = labels[batch*batch_size:(batch+1)*batch_size]
            # 进行训练
            sess.run(train_step,feed_dict={x:batch_x,y:batch_y})
        batch_x = images_train[n_batch*batch_size:]
        batch_y = labels[n_batch*batch_size:]
        sess.run(train_step,feed_dict={x:batch_x,y:batch_y})
        # 计算预测
    myPrediction = sess.run(predictions,feed_dict={x:images_test})
 
label_test = np.argmax(myPrediction,axis=1)
pd.DataFrame(label_test).to_csv('output.csv')  

将数据改成需要提交的格式

import pandas as pd
import numpy as np

df1 = pd.read_csv("G:\Machine learn\digit_recognizer_1\output1.csv")
df1.loc[:,["ImageId"]]=df1.loc[:,["ImageId"]]+1
pd.DataFrame(df1).to_csv('output11.csv',columns=["ImageId","Label"],index=False)

 

尝试增加隐藏层后,有输出,但格式不太对了,需要进一步优化

import pandas as pd
import numpy as np
import tensorflow as tf





# 1 加载数据集,把对输入和结果分开
train = pd.read_csv('G:\Machine learn\digit_recognizer_1\data\\train.csv')
images_train = train.iloc[:, 1:].values
labels_train = train.iloc[:, 0].values

test = pd.read_csv('G:\Machine learn\digit_recognizer_1\data\\test.csv')
images_test = test.iloc[:, :].values

# 2 对输入进行处理
images_train = images_train.astype(np.float)
images_train = np.multiply(images_train, 1.0 / 255)
images_test = images_test.astype(np.float)
images_test = np.multiply(images_test, 1.0 / 255)

images_size = images_train.shape[1]

images_width = images_height = np.ceil(np.sqrt(images_size)).astype(np.uint8)

# 3 对结果进行处理
labels_count = np.unique(labels_train).shape[0]


# 进行one-hot编码
def dense_to_ont_hot(labels_dense, num_classes):
	num_labels = labels_dense.shape[0]
	index_offset = np.arange(num_labels) * num_classes
	labels_one_hot = np.zeros((num_labels, num_classes))
	labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
	return labels_one_hot


labels = dense_to_ont_hot(labels_train, labels_count)
labels = labels.astype(np.uint8)

# 4 对训练集进行分批
batch_size = 64
n_batch = int(len(images_train) / batch_size)

# 5 创建一个简单的神经网络用来对图片进行识别
x = tf.placeholder('float', shape=[None, images_size])
y = tf.placeholder('float', shape=[None, labels_count])

# weights = tf.Variable(tf.zeros([784, 10]))
# biases = tf.Variable(tf.zeros([10]))

# ----------------添加隐藏层-------------------------------------
W1 = tf.Variable(tf.truncated_normal([784, 50], stddev=0.1), name='W1')
b1 = tf.Variable(tf.zeros([50]) + 0.1, name='b1')
L1 = tf.nn.tanh(tf.matmul(x, W1) + b1, name='L1')

W2 = tf.Variable(tf.truncated_normal([50, 30], stddev=0.1), name='W2')
b2 = tf.Variable(tf.zeros([30]) + 0.1, name='b2')
L2 = tf.nn.tanh(tf.matmul(L1, W2) + b2, name='L2')

W3 = tf.Variable(tf.truncated_normal([30, 10], stddev=0.1), name='W3')
b3 = tf.Variable(tf.zeros([10]) + 0.1, name='b3')

# result = tf.matmul(x, weights) + biases
predictions = tf.nn.softmax(tf.matmul(L2, W3) + b3)
# ---------------------------------------------------------------


# 6 创建损失函数,以交叉熵的平均值为衡量
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=predictions))


# 7 用梯度下降法优化参数
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)


# 8 初始化变量
init = tf.global_variables_initializer()


# 9 计算预测值
with tf.Session() as sess:
	# 初始化
	sess.run(init)
	# 循环50轮
	for epoch in range(50):
		for batch in range(n_batch - 1):
			batch_x = images_train[batch * batch_size:(batch + 1) * batch_size]
			batch_y = labels[batch * batch_size:(batch + 1) * batch_size]
			# 进行训练
			sess.run(train_step, feed_dict={x: batch_x, y: batch_y})
		batch_x = images_train[n_batch * batch_size:]
		batch_y = labels[n_batch * batch_size:]
		sess.run(train_step, feed_dict={x: batch_x, y: batch_y})
	# 计算预测
	myPrediction = sess.run(predictions, feed_dict={x: images_test})

label_test = np.argmax(myPrediction, axis=1)
pd.DataFrame(label_test).to_csv('output1.csv')

# df1 = pd.read_csv("output.csv")
# df1.loc[:,["ImageId"]]=df1.loc[:,["ImageId"]]+1
# pd.DataFrame(df1).to_csv('output11.csv',columns=["ImageId","Label"],index=False)
#


# arr1 = np.array(output.csv)
# print(arr1.shape)

#print(label_test.shape)

 


转载:https://blog.csdn.net/qq_42198024/article/details/102489282
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场