李宏毅机器学习 P17 Keras Demo 笔记

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/84477428

这里李教授用的是vim编辑器。我就直接用pycharm来写了,这样比较方便。

由于keras现在又更新了几次,更加人性化了,现在选取批训练样本和批测试样本都不需要自己来写一个函数取了,所以代码有一些改动。

注意数据集mnist直接用官方给的api很难下载,即使用了代理也一样,可以自己手动下载。

完整代码如下:

import os
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense
from keras.utils import np_utils
# 如果是第一次在keras中使用该数据集
from keras.datasets import mnist

os.environ['KERAS_BACKEND'] = 'tensorflow'
# 指定backend框架为tensorflow
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 想要不出现红字提示,则需要上面这一句
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
# 指定使用的GPU的编号,从0开始,如果使用tensorflow-gpu环境编译则需要上面这句

# 下载mnist数据集到路径'~/.keras/datasets/'如果是第一次在keras中使用该数据集
# X的shape=(60,000 28x28), y的shape=(10,000, ),注意x的数据要除以255进行标准化,y的数据要变成独热编码形式
# (train_x_data, train_y_data), (test_x_data, test_y_data) = mnist.load_data()
# 如果下载数据集失败,是因为网址被墙了。
# 手动从这里下载数据集:下载链接:https://pan.baidu.com/s/1jH6uFFC 密码: dw3d 把下载好的数据集放到.py所在目录下。
# 然后添加path='./mnist.npz'
# 再添加mnist_data = np.load(path)
path = './mnist.npz'
mnist_data = np.load(path)
train_x_data, train_y_data = mnist_data['x_train'], mnist_data['y_train']
test_x_data, test_y_data = mnist_data['x_test'], mnist_data['y_test']
mnist_data.close()

# 标准化
train_x_data = train_x_data.reshape(train_x_data.shape[0], -1) / 255.
test_x_data = test_x_data.reshape(test_x_data.shape[0], -1) / 255.
train_y_data = np_utils.to_categorical(train_y_data, num_classes=10)
test_y_data = np_utils.to_categorical(test_y_data, num_classes=10)

# 测试
# print(train_x_data[0], train_y_data[0])
# print(test_x_data[0], test_y_data[0])
# print(train_x_data.shape, train_y_data.shape)
# print(test_x_data.shape, test_y_data.shape)


train_batch_size = 100
test_batch_size = 100

# 创建一个模型
model = Sequential()

# 添加一个神经元层,用于处理输入,input_dim指输入的单个样本的维数,units代表本层神经元数目
model.add(Dense(input_dim=784, units=1024, activation='relu'))  # input_layer写确定输入维数
# 添加一个隐藏层,输入默认是用前面一层的输出,units代表本层神经元数目
model.add(Dense(units=512, activation='sigmoid'))
# 再添加一个隐藏层,输入默认是用前面一层的输出,units代表本层神经元数目
model.add(Dense(units=256, activation='sigmoid'))
# 添加一个输出层,输出层的units必须和类的数目一致
model.add(Dense(units=10, activation='softmax'))

# 使用方差为loss函数,SGD优化算法
model.compile(loss='mse', optimizer='sgd', metrics=['accuracy'])

# 设置要用来训练的样本,batch_size=train_batch_size, epochs=20
# keras每次自动从总体样本train_x_data和train_y_data中随机选出train_batch_size个样本用来训练
model.fit(train_x_data, train_y_data, batch_size=train_batch_size, epochs=20)

# 最后用model在测试集上测试
# keras每次自动从总体样本test_x_data, test_y_data中随机选出test_batch_size个样本用来测试
loss_and_metrics = model.evaluate(test_x_data, test_y_data, batch_size=test_batch_size)
print("Test Acc", loss_and_metrics[1])

最后运行结果如下:

之所以准确率这么低是因为分类问题应该用交叉熵作为损失函数。

李教授举这个Demo的例子是说调参时胡乱调参很难调,花了很多时间都做不出结果,最后就从入门到放弃了。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/84477428
今日推荐