学习记录3

 

目录

 

Opencv

python基础

元组

paddle一个线性网络

需要继续解释的术语

训练使用的函数

几种优化方法

对比两端模型代码

总结


Opencv

python基础

元组

 元组与列表类似,区别在于元组不可更改,列表可更改,元组使用括号,列表使用方括号。

初始化空元组
emptyTuple = ()##括号内为空
emptyTuple = tuple()##或使用元组函数
z = (3, 7, 4, 2)##有具体值的元组
z = 3, 7, 4, 2
tup1 = ('Michael',)##仅含一个值的元组要加,
tup2 = 'Michael', 
notTuple = ('Michael')##字符串,非元组

tup3 = z + tup1 ##即使元组是不可变的,也可以采用现有元组的一部分来创建新的元组。
访问元组
与列表相同,零索引,正负索引,虽然有括号的区别,但是引用索引print的时候,都使用方括号
z = (3, 7, 4, 2)
a = [3,3]
print(z[0])
print(a[0])
z[0:2]
a[0:2]####分别访问元组和列表的12元素,只是要显示元组,只能用print

结果如下
(3, 7)
[2, 3]
[2, 3]
animals = ('lama', 'sheep', 'lama', 48)
对元组进行操作
print(animals.index('lama'))##索引方法,用元素得到索引
print(animals.count('lama'))##数一个元素出现的次数

for item in ('lama', 'sheep', 'lama', 48):
    print(item)  ##遍历元组
a, b = (7, 10);
print("Value of a is {}.".format(a, b)) ##对序列解包    


结果
0
2
lama
sheep
lama
48
Value of a is 7.
元组的枚举
friends = ('Steve', 'Rachel', 'Michael', 'Monica')
for index, friend in enumerate(friends):
    print(index,friend)

结果
(0, 'Steve')
(1, 'Rachel')
(2, 'Michael')
(3, 'Monica')

元组可以作为字典键,而列表不可以。

paddle一个线性网络

机器学习的过程在于给出数据集,设置一个模型,进行训练,然后用模型来进行预测。我们从一个线性网络来复现这个过程。

import paddle
import numpy as np

paddle.__version__  ##用来看版本

# 定义训练和测试数据
x_data = np.array([[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
                   [2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
                   [3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
                   [4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
                   [5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32')
y_data = np.array([[3.0], [5.0], [7.0], [9.0], [11.0]]).astype('float32')
test_data = np.array([[6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32')
##5个数据,每个数据有13个项目,相当于一张图片有13个像素,这是全连接层参数为13,100的原因

##定义一个简单的线性网络即定义一个模型,矩阵模型或者卷积网络模型,即全连接层与卷积层两种不同的隐层
[输入层] --> [隐层] --> [激活函数] --> [输出层]

net = paddle.nn.Sequential(
    paddle.nn.Linear(13, 100),  
    paddle.nn.ReLU(),  
    paddle.nn.Linear(100, 1) 
)

# 定义训练使用的优化方法
optimizer = paddle.optimizer.SGD(learning_rate=0.01, parameters=net.parameters())
##使用的是随机梯度下降法(SGD),还有Momentum、Adagrad、Adagrad

## 将numpy类型数据转换成tensor之后才能用于模型训练
inputs = paddle.to_tensor(x_data)
labels = paddle.to_tensor(y_data)

# 开始训练10个pass
for pass_id in range(10):
    out = net(inputs)
    loss = paddle.mean(paddle.nn.functional.square_error_cost(out, labels))##平方差损失函数

    loss.backward()
    optimizer.step()
    optimizer.clear_grad()

    print("Pass:%d, Cost:%0.5f" % (pass_id, loss))


##模型训练好后开始预测
predict_inputs = paddle.to_tensor(test_data)
result = net(predict_inputs)

print("当x为6.0时,y为:%0.5f" % result) ##0.5f表示这个float至少占0个字符,小数点后有5位

训练结果:损失值不断减小,模型收敛

Pass:0, Cost:0.02406
Pass:1, Cost:0.02354
Pass:2, Cost:0.02302
Pass:3, Cost:0.02252
Pass:4, Cost:0.02202
Pass:5, Cost:0.02154
Pass:6, Cost:0.02107
Pass:7, Cost:0.02061
Pass:8, Cost:0.02016
Pass:9, Cost:0.01972

需要继续解释的术语

训练使用的函数

神经网络模型的效果及优化的目标(分类还是回归)是通过损失函数(即代价函数)来定义的。当神经元的实际输出与我们的期望输出差距越大,代价就越高,我们需要它更小。

平方差损失函数

交叉熵损失函数

SVM Hinge Loss

softmax

几种优化方法

随机梯度下降法(SGD),还有Momentum、Adagrad、Adagrad 

对比两端模型代码

对应[输入层] --> [隐层] --> [激活函数] --> [输出层]的模型,可以看出矩阵模型或者卷积网络模型,即全连接层与卷积层两种不同的隐层之间的区别。

#创建模型
def create_matrix_model(input_size,input_channel,output_size):
        model_input = Input(shape = (input_size,input_size,input_channel),name = "in")##输入层
        cell = Flatten()(model_input)##数据一维化
        cell = Dense(120, activation='relu')(cell)##全连接
        cell = Dense(84, activation='relu')(cell)##全连接
        outputs = Dense(output_size,activation='softmax')(cell) ##输出层,自定义大小

        model = Model(inputs=[model_input],outputs=[outputs])
        return model
#创建模型
def create_cnn_model(input_size,input_channel,output_size):
        model_input = Input(shape = (input_size,input_size,input_channel),name = "in")##输入层
        cell = Conv2D(6, kernel_size=(5, 5), activation='relu')(model_input)##6通道5*5大小卷积核进行卷积
        cell = MaxPool2D(pool_size = (2,2),strides = 2,padding = 'valid')(cell)##池化,缩小尺寸,步长为2,池化后特征数据的大小区别于原数据
        cell = Conv2D(16, kernel_size=(5, 5), activation='relu')(cell)##16通道5*5大小卷积核进行卷积
        cell = MaxPool2D(pool_size = (2,2),strides = 2,padding = 'valid')(cell)
        cell = Flatten()(cell)##一维化
        cell = Dense(120, activation='relu')(cell)##全连接层
        cell = Dense(84, activation='relu')(cell)
        outputs = Dense(output_size,activation='softmax')(cell)##输出层

        model = Model(inputs=[model_input],outputs=[outputs])
        return model

总结

对深度学习的流程有了进一步了解,主要是理解了创建模型的部分。

接下来分析train和predict部分的代码,学习中不断了解术语及其背后的知识点,继续看几个例子。

有意思!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值