目录
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部分的代码,学习中不断了解术语及其背后的知识点,继续看几个例子。
有意思!