【笔记】机器学习 - 李宏毅 - 11 - Keras Demo2 & Fizz Buzz
1. Keras Demo2
前节的Keras Demo代码:
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
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()
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.astype('float32')
x_test=x_test.astype('float32')
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_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=633,activation='sigmoid'))
model.add(Dense(units=633,activation='sigmoid'))
model.add(Dense(units=633,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('TEST ACC:',result[1])
Keras Demo中的结果不是很好,看一下在Training Data上的结果:
result= model.evaluate(x_test,y_test)
result2 = model.evaluate(x_train,y_train,batch_size=10000)
print('TEST ACC:',result[1])
print('TRAIN ACC:',result2[1])
结果如下:
TEST ACC: 0.1135
TRAIN ACC: 0.1128000020980835
说明在Training Data上结果也不好,接下来开始调参:
loss function
分类问题mse不适合,将loss mse function 改为categorical_crossentropy
model.compile(loss='categorical_crossentropy',optimizer=SGD(lr=0.1),metrics=['accuracy'])
结果如下:
TEST ACC: 0.8488
TRAIN ACC: 0.8611000180244446
batch_size
batch_size从100改为10000,得到的结果不好。
model.fit(x_train,y_train,batch_size=10000,epochs=20)
结果如下:
TEST ACC: 0.101
TRAIN ACC: 0.10320000350475311
改为1,无法并行,速度变得很慢。
model.fit(x_train,y_train,batch_size=1,epochs=20)
deep layer
加10层,没有train起来。
for _ in range(10):
model.add(Dense(units=689,activation='sigmoid'))
结果如下:
TEST ACC: 0.101
TRAIN ACC: 0.10320000350475311
activation functon
把sigmoid都改为relu,发现现在train的accuracy就爬起来了,接近100%,在Test Data上也表现很好。
结果如下:
TEST ACC: 0.9556
TRAIN ACC: 0.9998000264167786
normalize
如果不进行normalize,把255去掉,得到的结果又不好了,这些细节也很重要。
# x_train=x_train/255
# x_test=x_test/255
结果如下:
TEST ACC: 0.098
TRAIN ACC: 0.10010000318288803
optimizer
把SGD(lr=0.1)改为Adam,然后再跑一次,用adam的时候最后收敛的地方差不多,但是上升的速度变快了。
结果如下:
TEST ACC: 0.9667
TRAIN ACC: 1.0
Random noise
加上noise之后,结果不好,overfitting了。
x_test=np.random.normal(x_test)
结果如下:
TEST ACC: 0.4986
TRAIN ACC: 0.9991000294685364
dropout
dropout 加在每个hidden layer之后,dropout加入之后,train的效果会变差,然而test的正确率提升了。
model.add(Dense(input_dim=28*28,units=689,activation='relu'))
model.add(Dropout(0.7))
model.add(Dense(units=689,activation='relu'))
model.add(Dropout(0.7))
model.add(Dense(units=689,activation='relu'))
model.add(Dropout(0.7))
model.add(Dense(units=10,activation='softmax'))
结果如下:
TEST ACC: 0.594
TRAIN ACC: 0.9894000291824341
2. FizzBuzz
题目描述:
给你100以内的数. 如果这个数被3整除,打印fizz.
如果这个数被5整除,打印buzz.
如果这个数能同时被3和5整除,打印fizz buzz.
FizzBuzz是一个很有意思的题目,如果用深度学习的方法来做的话,可以用如下代码实现。
数据准备:
对数字101到1000都做了数据标注,即训练数据xtrain.shape=(900,10),
每一个数字都是用二进位来表示,第一个数字是101,用二进位来表示即为[1,0,1,0,0,1,1,0,0,0],
每一位表示\(2^{n-1}\),\(n\)表示左数第几位。现在一共有四个case,[一般,Fizz,Buzz,Fizz Buzz],所以y_train.shape=(900,10),对应的维度用1表示,其他都为0。
from keras.layers.normalization import BatchNormalization
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
from keras.optimizers import SGD,Adam
import numpy as np
def fizzbuzz(start, end):
x_train, y_train=[],[]
for i in range(start, end+1):
num = i
tmp = [0]*10
j = 0
while num:
tmp[j] = num & 1
num = num >> 1
j += 1
x_train.append(tmp)
if i % 3 == 0 and i % 5 == 0:
y_train.append([0,0,0,1])
elif i % 3 == 0:
y_train.append([0,1,0,0])
elif i % 5 == 0:
y_train.append([0,0,1,0])
else:
y_train.append([1,0,0,0])
return np.array(x_train), np.array(y_train)
x_train,y_train = fizzbuzz(101, 1000) #打标记函数
x_test,y_test = fizzbuzz(1, 100)
model = Sequential()
model.add(Dense(input_dim=10, output_dim=100))
model.add(Activation('relu'))
model.add(Dense(output_dim=4))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=20, nb_epoch=100)
result = model.evaluate(x_test, y_test, batch_size=1000)
print('Acc:',result[1])
最后的结果不是100%,所以我们将hidden neure从100改为1000,结果就是100%了。
model.add(Dense(input_dim=10, output_dim=1000))
【笔记】机器学习 - 李宏毅 - 11 - Keras Demo2 & Fizz Buzz的更多相关文章
- 【笔记】机器学习 - 李宏毅 - 9 - Keras Demo
3.1 configuration 3.2 寻找最优网络参数 代码示例: # 1.Step 1 model = Sequential() model.add(Dense(input_dim=28*28 ...
- 李宏毅 Tensorflow解决Fizz Buzz问题
提出问题 一个网友的博客,记录他在一次面试时,碰到面试官要求他在白板上用TensorFlow写一个简单的网络实现异或(XOR)功能.这个本身并不难,单层感知器不能解决异或问题是学习神经网络中的一个常识 ...
- [LeetCode] Fizz Buzz 嘶嘶嗡嗡
Write a program that outputs the string representation of numbers from 1 to n. But for multiples of ...
- LeetCode 412. Fizz Buzz
Problem: Write a program that outputs the string representation of numbers from 1 to n. But for mult ...
- LeetCode Fizz Buzz
原题链接在这里:https://leetcode.com/problems/fizz-buzz/ 题目: Write a program that outputs the string represe ...
- [重构到模式-Chain of Responsibility Pattern]把Fizz Buzz招式重构到责任链模式
写一段程序从1打印到100,但是遇到3的倍数时打印Fizz,遇到5的倍数时打印Buzz,遇到即是3的倍数同时也是5的倍数时打印FizzBuzz.例如: 1 2 Fizz 4 Buzz Fizz 7 8 ...
- [Swift]LeetCode412. Fizz Buzz
Write a program that outputs the string representation of numbers from 1 to n. But for multiples of ...
- LeetCode算法题-Fizz Buzz(Java实现)
这是悦乐书的第221次更新,第233篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第88题(顺位题号是412). 编写一个程序,输出从1到n的数字的字符串表示.但对于三的 ...
- 9. Fizz Buzz 问题
Description Given number n. Print number from 1 to n. But: when number is divided by 3, print " ...
随机推荐
- 18、DHCP
Dynamic Host Configuration Protocol DHCP的前身:Bootstrap DHCP的封装 DHCP基本知识点 1 .DHCP协议在RFC2131中定义,使用udp协议 ...
- 把"重试"抽象出来做个工具类吧
背景介绍 我们在工作中难免会写一些重复性的代码,所以需要我们具备一定的抽象能力,比如把共同的逻辑抽取到抽象类中,也可以通过一些工具类来避免冗余代码 今天这篇文章就是把一个调用服务的重试功能抽取出一个工 ...
- 高软期末考试 B2C模式
一.软件工程知识点 简要总结 1.软件基础知识 瀑布模型: 我感觉整个<软件工程>书的布局就是按照瀑布模型来的,上面右图少个运维. 2.UML图 2.1 用例图 UseCase Diagr ...
- bootstrap 表单类
bootstrap 表单类 表单美化 用法: 向父元素 <form role="form"></form> 添加 role="form&q ...
- Entity Framework 实体状态
从今天开始我们开始讲解EF中的实体状态和数据操作,这篇文章先讲解实体状态. 我们通过前面的学习,知道EF通过上下位负责跟踪实体的状态,实体状态的位置是在命名空间 System.Dat.Entity 里 ...
- 【题解】P1908 逆序对——归并算法
先吐槽 这题做了两天,昨天讲分治,老师用归并讲了一遍,今天又用树状数组讲了一遍 归并不难,啊啊啊我居然才调出来 思路 归并两个数组时,对于第二个数组的元素a[c2],它与第一个数组中目前还没归到总数组 ...
- 用赋值表达式作为bool值
enum Status { stOk, stQuit, stError }; int main() { Status status; int n; bool b1 = (status = stOk); ...
- 使用java基础实现一个简陋的web服务器软件
使用java基础实现一个简陋的web服务器软件 1.写在前面 大学已经过了一年半了,从接触各种web服务器软件已经有一年多了,从大一上最开始折腾Windows电脑自带的IIS开始,上手了自己的第一个静 ...
- sql 忘记密码 解决方法(window cmd命令解决)
cd wamp\bin\mysql\mysql5.6.17\bin mysqld --skip-grant-tables
- ASP.NET Core 借助 Helm 部署应用至K8S
前言 玩K8S也有一段时间了,借助云服务提供商的K8S控制台,已经可以很方便的快速部署应用至K8S.通过简单的点击,可以一次性帮忙创建K8S 对象:Deployment.Service.Ingress ...