赞
踩
1.定义训练测试数据:输入张量和目标张量。
2.定义网络(模型),将输入映射到目标。
3.配置学习过程:选择损失函数,优化器,和监控指标。
4.fit方法进行训练迭代。
5.evaluate测试。
6.predict评估。
1.定义数据:
2.定义网络:
1.Sequential类(层的线性堆叠)常用。
from keras import models
from keras import layers
model=models.Sequential()
model.add(layers.Dense(32,activation='relu',inpute_shape=(784,)))
(创建了一个层,只接受第一个维度大小为784 的 2D 张量(第0 轴是批量维度,其大小没有指定,因此可以任意取值)作为输入。这个层将返回一个张量,第一个维度的大小变成 了 32。 )
(,逗号从外往里数)
model.add(layers.Dense(10, activation='softmax')) //10为类别,10维向量
//如果要对 N 个类别的数据点进行分类,网络的最后一层应该是大小为 N 的 Dense 层。
//对于回归问题来说,只需要为1,不需要进行softmax。
2.函数式API(有向无环图).
3.配置学习过程:
model.compile(optimizer=optimizers.RMSprop(lr=0.001), / 或者:optimizer='rmsprop'
loss='mse'
metrics=['accuracy'] )
4.训练:
model.fit(input_tensor, target_tensor, batch_size=128, epochs=10)
5.测试:
results=model.evaluate(x_test,y_test)
6.预测:
model.predict(x_test)
简单的向量数据保存在 形状为 (samples, features) 的 2D 张量中,通常用密集连接层[densely connected layer,也 叫全连接层(fully connected layer)或密集层(dense layer),对应于Keras 的 Dense 类]来处理。序列数据保存在形状为 (samples, timesteps, features) 的 3D 张量中,通常用循环 层(recurrent layer,比如Keras 的 LSTM 层)来处理。图像数据保存在4D 张量中,通常用二维 卷积层(Keras 的 Conv2D)来处理。
损失函数:对于二分类问题,你可以使用二元交叉熵(binary crossentropy)损失函数;对于多分类问题,可以用分类交叉熵(categorical crossentropy)损失函数;对于回归 问题,可以用均方误差(mean-squared error)损失函数;对于序列学习问题,可以用联结主义 时序分类(CTC,connectionist temporal classification)损失函数。
无论你的问题是什么,rmsprop 优化器通常都是足够好的选择。
import matplotlib.pyplot as plt
import numpy as np
x=np.array([1,3,5,2,7])
y=np.array([2,5,7,9,0])
plt.clf() //清空图像
plt.plot(x,y,label='标签')
plt.title('测试')
plt.xlabel('横坐标')
plt.legend() //加图例
plt.show() //显示
定义:在没有标签的情况下找到数据的变换。
主要是进行数据分析,降维和聚类都是无监督学习方法。(原理都为函数的映射)
机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。
聚类:K-means:随机选取初始点,计算距离,归类,再重新划分中心。重复。
智能体(agent)接收有关其环境的信息,并学会选择使某种奖励最大化的行为。
原因在于开发模型时总是需要调节模型配置,比如选择层数或每层大小[这叫作模型的超 参数(hyperparameter),以便与模型参数(即权重)区分开]。这个调节过程需要使用模型在验 证数据上的性能作为反馈信号。这个调节过程本质上就是一种学习:在某个参数空间中寻找良 好的模型配置。因此,如果基于模型在验证集上的性能来调节模型配置,会很快导致模型在验 证集上过拟合,即使你并没有在验证集上直接训练模型也会如此。 会导致在新的数据上出现错误。
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) #卷积网络的接收形状为(H,W,C)
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.summary()#查看架构
宽度和高度会随着网络加深而变小。通道数则由传入的第一个参数设置。
model.add(layers.Flatten())#将3D张量展开为1D
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
密集连接(全连接)和卷积连接的最大区别就在于,前者学到的是全局样式,后者则为局部的样式。
卷积过程:
对于3*3,通道为32的卷积核来说,他的输入为32(上一层的输出),输入图像有几层通道,就有一个卷积和有几层通道,有一个卷积核输出就为一个,是不同通道的叠加。
以Le-net为例子,输入为灰度图像,通道数为1,与六个不同的卷积核进行卷积会得到六个feature map,然后在和16个卷积核进行卷积,每个卷积核的通道数为6,但是最后的结果则为一个feature map,所以会得到16个feature map。
对于VGG来说,输入图像是3层,通道数64 的卷积核,相当于64个3层的卷积,会得到64个Feature map。
将数据输入神经网络之前,应该将数据格式化为经过预处理的浮点数张量。现在,数据以JPEG 文件的形式保存在硬盘中,所以数据预处理步骤大致如下。
(1) 读取图像文件。
(2) 将JPEG 文件解码为RGB 像素网格。
(3) 将这些像素网格转换为浮点数张量。
(4) 将像素值(0~255 范围内)缩放到[0, 1] 区间(正如你所知,神经网络喜欢处理较小的输
入值)。
keras.preprocessing.image。特别地,它包含ImageDataGenerator 类,可以快速创建Python 生成器,能够将硬盘上的图像文件自动转换为预处理好的张量批量。
为了解决过拟合,我们需要将数据进行数据增强,主要是通过缩放,旋转等手段对数据进行处理,在生成器中使用即可。
- train_datagen=ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,)
- test_datagen=ImageDataGenerator(rescale=1./255)#不能增强验证数据
-
- train_generator=train_datagen.flow_from_directory(train_dir,target_size=(150,150),batch_size=32,class_mode='binary')
- validation_generator=test_datagen.flow_from_directory(validation_dir,target_size=(150,150),batch_size=32,class_mode='binary')
如果要使用GPU跑keras程序的话,需要安装对应gpu版本的tensorflow和keras,二者也是有对应版本的,比如tf1.5.0对应keras2.6.1.在安装好环境之后,要在程序里添加
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
就可以了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。