Keras_深度学习_MNIST数据集手写数字识别之各种调参

注:这里的代码是听台大李宏毅老师的ML课程敲的相应代码。
  • 先各种import
import numpy as np
np.random.seed(1337)

# https://keras.io/
!pip install -q keras
import keras

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers import Convolution2D, MaxPooling2D, Flatten
from keras.optimizers import SGD, Adam
from keras.utils import np_utils
from keras.datasets import mnist
#categorical_crossentropy


  • 再定义函数load_data()
def load_data():
  (x_train, y_train), (x_test, y_test) = mnist.load_data()
  
  number = 10000
  x_train = x_train[0 : number]
  y_train = y_train[0 : number]
  
  x_train = x_train.reshape(number, 28*28)
  x_test = x_test.reshape(x_test.shape[0], 28*28)
  
  x_train = x_train.reshape(number, 28*28)
  x_test = x_test.reshape(x_test.shape[0], 28*28)
  
  x_train = x_train.astype('float32')
  x_test = x_train.astype('float32')
  
  #convert class vectors to binary class matrices
  
  y_train = np_utils.to_categorical(y_train, 10)
  y_test = np_utils.to_categorical(y_test, 10)
  x_train = x_train
  x_test = x_test
  
  #x_test = np.random.normal(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()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'sigmoid'))
model.add(Dense(units = 689, activation = 'sigmoid'))
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_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\nTest Acc:', result[1])


运行结果如下:

说明training的时候就没有train好。

  • 修改1:把loss由mse改为categorical_crossrntropy

#修改1:把loss由mse改为categorical_crossrntropy

(x_train, y_train), (x_test, y_test) = load_data()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'sigmoid'))
model.add(Dense(units = 689, activation = 'sigmoid'))
model.add(Dense(units = 689, activation = 'sigmoid'))

model.add(Dense(units = 10, activation = 'softmax'))

#这里做了修改
model.compile(loss = 'categorical_crossentropy', optimizer = SGD(lr = 0.1), metrics = ['accuracy']) 

model.fit(x_train, y_train, batch_size = 100, epochs = 20)

result = model.evaluate(x_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\nTest Acc:', result[1])

运行结果如下:

training的结果由11%提升到85%(test acc却更小了)。

  • 修改2:在修改1的基础上,fit时的batch_size由100调整为10000(这样GPU能发挥它平行运算的特点,会计算的很快)
(x_train, y_train), (x_test, y_test) = load_data()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'sigmoid'))
model.add(Dense(units = 689, activation = 'sigmoid'))
model.add(Dense(units = 689, activation = 'sigmoid'))

model.add(Dense(units = 10, activation = 'softmax'))

model.compile(loss = 'categorical_crossentropy', optimizer = SGD(lr = 0.1), metrics = ['accuracy'])

model.fit(x_train, y_train, batch_size = 10000, epochs = 20) #这里做了修改

result = model.evaluate(x_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\nTest Acc:', result[1])

运行结果如下:

performance很差。

  • 修改3:在lossfunc用crossentropy的基础上,fit时的batch_size由10000调整为1(这样GPU就不能发挥它平行运算的效能,会计算的很慢)
(x_train, y_train), (x_test, y_test) = load_data()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'sigmoid'))
model.add(Dense(units = 689, activation = 'sigmoid'))
model.add(Dense(units = 689, activation = 'sigmoid'))

model.add(Dense(units = 10, activation = 'softmax'))

model.compile(loss = 'categorical_crossentropy', optimizer = SGD(lr = 0.1), metrics = ['accuracy'])

model.fit(x_train, y_train, batch_size = 1, epochs = 20) #这里做了修改

result = model.evaluate(x_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\nTest Acc:', result[1])

没有等到运行结果出来……


  • 修改4:在修改1的基础上,改成deep,再加10层


#修改4:现在改成deep,再加10层

(x_train, y_train), (x_test, y_test) = load_data()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'sigmoid'))
model.add(Dense(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 = 'categorical_crossentropy', optimizer = SGD(lr = 0.1), metrics = ['accuracy'])

model.fit(x_train, y_train, batch_size = 100, epochs = 20)

result = model.evaluate(x_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\n Test Acc:', result[1])

运行结果如下:

还是training就很差。


  • 修改5:在修改4的基础上,把sigmoid都改成relu
#修改5:在修改4的基础上,把sigmoid都改成relu

(x_train, y_train), (x_test, y_test) = load_data()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))

for i in range(10):
  model.add(Dense(units = 689, activation = 'relu'))

model.add(Dense(units = 10, activation = 'softmax'))

model.compile(loss = 'categorical_crossentropy', optimizer = SGD(lr = 0.1), metrics = ['accuracy'])

model.fit(x_train, y_train, batch_size = 100, epochs = 20)

result = model.evaluate(x_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\n Test Acc:', result[1])

运行结果如下:

training效果非常好,但是test效果依然很差劲。


  • 修改6:在修改5的基础上。load_data函数中,第26行和第27行,是除以255做normalize,如果把这两行注释掉:
# 修改6:load_data函数中,第26行和第27行,是除以255做normalize,如果把这两行注释掉,会发现又做不起来了
def load_data():
  (x_train, y_train), (x_test, y_test) = mnist.load_data()
  
  number = 10000
  x_train = x_train[0 : number]
  y_train = y_train[0 : number]
  
  x_train = x_train.reshape(number, 28*28)
  x_test = x_test.reshape(x_test.shape[0], 28*28)
  
  x_train = x_train.reshape(number, 28*28)
  x_test = x_test.reshape(x_test.shape[0], 28*28)
  
  x_train = x_train.astype('float32')
  x_test = x_train.astype('float32')
  
  #convert class vectors to binary class matrices
  
  y_train = np_utils.to_categorical(y_train, 10)
  y_test = np_utils.to_categorical(y_test, 10)
  x_train = x_train
  x_test = x_test
  
  #x_test = np.random.normal(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()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))

for i in range(10):
  model.add(Dense(units = 689, activation = 'relu'))

model.add(Dense(units = 10, activation = 'softmax'))

model.compile(loss = 'categorical_crossentropy', optimizer = SGD(lr = 0.1), metrics = ['accuracy'])

model.fit(x_train, y_train, batch_size = 100, epochs = 20)

result = model.evaluate(x_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\n Test Acc:', result[1])

运行结果如下:

training效果又变得很好。

  • 修改7:取消修改6中的操作,并把添加的10层注释掉再来一次

# 修改7:取消修改6中的操作,并把添加的10层注释掉再来一次
def load_data():
  (x_train, y_train), (x_test, y_test) = mnist.load_data()
  
  number = 10000
  x_train = x_train[0 : number]
  y_train = y_train[0 : number]
  
  x_train = x_train.reshape(number, 28*28)
  x_test = x_test.reshape(x_test.shape[0], 28*28)
  
  x_train = x_train.reshape(number, 28*28)
  x_test = x_test.reshape(x_test.shape[0], 28*28)
  
  x_train = x_train.astype('float32')
  x_test = x_train.astype('float32')
  
  #convert class vectors to binary class matrices
  
  y_train = np_utils.to_categorical(y_train, 10)
  y_test = np_utils.to_categorical(y_test, 10)
  x_train = x_train
  x_test = x_test
  
  #x_test = np.random.normal(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()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))

# for i in range(10):
#   model.add(Dense(units = 689, activation = 'relu'))

model.add(Dense(units = 10, activation = 'softmax'))

model.compile(loss = 'categorical_crossentropy', optimizer = SGD(lr = 0.1), metrics = ['accuracy'])

model.fit(x_train, y_train, batch_size = 100, epochs = 20)

result = model.evaluate(x_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\n Test Acc:', result[1])

运行结果如下:

training效果又变得很好。

  • 修改8: 换一下gradient descent strategy ,把SGD换为adam

# 修改8: 换一下gradient descent strategy ,把SGD换为adam

(x_train, y_train), (x_test, y_test) = load_data()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))

# for i in range(10):
#   model.add(Dense(units = 689, activation = 'relu'))

model.add(Dense(units = 10, activation = 'softmax'))

model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

model.fit(x_train, y_train, batch_size = 100, epochs = 20)

result = model.evaluate(x_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\n Test Acc:', result[1])

此时虽然最后收敛得差不多,但是最后上升的速度加快了。

  • 修改9:在testing set每个image故意加上noise。 

#修改9:在testing set每个image故意加上noise。 现在效果更差了。。。
def load_data():
  (x_train, y_train), (x_test, y_test) = mnist.load_data()
  
  number = 10000
  x_train = x_train[0 : number]
  y_train = y_train[0 : number]
  
  x_train = x_train.reshape(number, 28*28)
  x_test = x_test.reshape(x_test.shape[0], 28*28)
  
  x_train = x_train.reshape(number, 28*28)
  x_test = x_test.reshape(x_test.shape[0], 28*28)
  
  x_train = x_train.astype('float32')
  x_test = x_train.astype('float32')
  
  #convert class vectors to binary class matrices
  
  y_train = np_utils.to_categorical(y_train, 10)
  y_test = np_utils.to_categorical(y_test, 10)
  x_train = x_train
  x_test = x_test
  
  #x_test = np.random.normal(x_test)
  
  x_train = x_train/255
  x_test = x_test/255
  
  x_test = np.random.normal(x_test)
  
  return (x_train, y_train), (x_test, y_test)

(x_train, y_train), (x_test, y_test) = load_data()

model = Sequential()

model.add(Dense(input_dim = 28*28, units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))
model.add(Dense(units = 689, activation = 'relu'))

# for i in range(10):
#   model.add(Dense(units = 689, activation = 'relu'))

model.add(Dense(units = 10, activation = 'softmax'))

model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

model.fit(x_train, y_train, batch_size = 100, epochs = 20)

result = model.evaluate(x_train, y_train, batch_size = 10000)
print('\nTrain Acc:', result[1])  

result = model.evaluate(x_test, y_test, batch_size = 10000)
print('\n Test Acc:', result[1])

运行结果如下:

现在效果更差了。。。












好的,我可以为你提供一个使用Keras实现手写数字识别的简单示例。 首先,你需要安装Keras和NumPy库。然后,你可以使用MNIST数据集来训练模型,该数据集包含大量手写数字图像。 下面是一个使用Keras实现手写数字识别的示例代码: ```python import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 将图像数据转换为4D张量 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test = x_test.reshape(x_test.shape[0], 28, 28, 1) input_shape = (28, 28, 1) # 将图像数据转换为浮点数并归一化 x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 # 将标签转换为One-hot编码 y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) # 构建模型 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) # 训练模型 batch_size = 128 epochs = 10 model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) # 评估模型 score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 这个示例代码使用了一个卷积神经网络来训练模型,这种网络结构能够有效地识别图像中的特征。你可以根据你的需求对模型进行调整,比如增加更多的卷积层、池化层或全连接层等,以提高模型的准确率。 当你运行这个代码时,模型将会被训练并评估。在训练完成后,模型将对测试集中的图像进行预测,并输出测试准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值