import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
from keras.layers import Conv2D,MaxPooling2D,Flatten
from keras.optimizers import SGD,Adam
from keras.utils import np_utils
from keras.datasets import mnist
def load_data():
(x_train,y_train),(x_test,y_test) = mnist.load_data()
print(x_train.shape) # (60000, 28, 28)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)
number = 10000
x_train = x_train[0:number] # (10000, 28, 28)
print(x_train.shape)
y_train = y_train[0:number]
x_train = x_train.reshape(number,28*28) #(10000, 784)
print(x_train.shape)
x_test = x_test.reshape(x_test.shape[0],28*28)
x_train = x_train.astype('float32') # 转换数组的数据类型
x_test = x_test.astype('float32')
y_train = np_utils.to_categorical(y_train,10) # 例如把6变为 0000001000
y_test = np_utils.to_categorical(y_test,10)
x_train = x_train
x_test = x_test
x_train = x_train/255
x_test = x_test/255
return (x_train,y_train),(x_test,y_test)
(x_train,y_train),(x_test,y_test) = load_data()
#print(x_train[0])
print(y_train[0])
model = Sequential()
model.add(Dense(input_dtype=28*28,units=689,activation='sigmoid'))
model.add(Dense(units=689,activation='sigmoid'))
for i in range(10):
model.add(Dense(units=689, activation='sigmoid'))
model.add(Dense(units=10,activation='softmax'))
model.compile(loss='mse',optimizer=SGD(lr=0.1),metrics=['accuracy'])
model.fit(x_train,y_train,batch_size=100,epochs=20)
result = model.evaluate(x_test,y_test)
print('\nTest Acc:', result[1])
先贴上源码。
导入模型部分我们暂且不提,首先先
(x_train,y_train),(x_test,y_test) = mnist.load_data()
通过mnist加载手写数据集。我们打印一下x_train等四个数据,可以发现,x_train是60000个数据,每个数据都是28*28像素的图像。y_train是一个一维数据,代表标签,表示该图像代表哪个数字。
x_train = x_train[0:number]
把前10000个数据提取出来,一共有60000个数据,我们只要前10000个。
x_train = x_train.reshape(number,28*28)
把数据重新排列,把代表每个图像的28*28的数组变为1*784的一维数据
y_train = np_utils.to_categorical(y_train,10)
然后该函数的作用:把数据变成一个十维的向量,因为我们是采用概率的思想进行计算(详见逻辑回归原理),例如如果是6,该函数将其转化为[0 0 0 0 0 0 1 0 0 0],第1个数据代表0,这里显示0 ,第7个数据代表6,这里显示1。
x_train = x_train/255
x_test = x_test/255
这里为什么要除以255,我首先验证了一下如果不除255,
左边是除以255以后的值,右边是不除255以后的值,我想了想,可能这就是个对数据特征的一次放缩罢了。
model = Sequential()
Sequential 表示是个顺序模型结构,是一个简单的线性结构,没有多余分支,是多个网络层的简单堆叠,即视频中描述的网络形状。
model.add
添加各种中间函数,可以用sigmoid,也可以用其他函数,随意。
model.compile(loss='mse',optimizer=SGD(lr=0.1),metrics=['accuracy'])
model.fit(x_train,y_train,batch_size=100,epochs=20)
result = model.evaluate(x_test,y_test)
然后我们把loss定义为mse,mse多用于回归问题,也可以用课本中将的crossentropy为交叉熵损失函数来实验。
之后我们定义每个batch里面有100个数据集,并定义20次epochs,即每次计算都要计算20*100个数据。