Keras入门之二:Hello Keras on CNN with Lena

2023-11-09 12:48
文章标签 入门 之二 cnn keras hello lena

本文主要是介绍Keras入门之二:Hello Keras on CNN with Lena,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是第二个Keras的例子。是介绍了如何使用Keras构建一个卷积神经网络。
通过这个例子,我之前在图像处理上固有的观念导致对卷积网络的工作原理有了稍微的误差,从而修正过来了。

这种错误主要是对卷积之后网络变厚的理解,之前我总以为一个卷积核将3通道的图像卷积后仍然是3个通道。这是以前做图像处理的时候固有的想法,而不是神经网络工作的模式。神经网络的卷积实际上更多的是要从网络连接上来考虑这种卷积实现。
时间关系先上代码,以后再修改
#=================== Test 2    Hello Keras on CNN ==============================================================================
# 这是一个简单的卷积神经网络的例子。from PIL import Image
from keras.models import Sequential  # 采用贯序模型
from keras.layers import Input, Dense, Dropout, Activation
from keras.layers import Convolution2D, ZeroPadding2D, MaxPooling2D
from keras.models import Model
from keras.optimizers import SGD
from keras.datasets import mnist
import numpy as np
import matplotlib.pyplot as plt  # 显示图片tBatchSize = 128def Kernels2Weight(Kernels, chl):weight_Num = Kernels.shape[0]weight_row = Kernels.shape[1]weight_col = Kernels.shape[2]ConvKernels = []for r in range(0,weight_row):CK_CHL= [] # 通道CKRow = []for c in  range(0,weight_col):CK_Item = []CK_Item2= []for n in range(0, weight_Num):CK_Item2.append(Kernels[n][r][c])for ch in range(0, chl):CK_Item.append(CK_Item2)  # 每个通道都是一样的CKRow.append(CK_Item)ConvKernels.append(CKRow)ConvKernels2 = []ConvKernels2.append(ConvKernels)return ConvKernels2'''第1步:准备数据'''
##打开图片
img = Image.open("Z:/Lenna.jpg",)
imgChl = 3
# img= img.convert("L")  # 转为灰度图像
# imgChl = 1(img_width, img_height) = img.size
print("image Size = ",img_width, img_height)##把图片转换成数组形式
arr = np.asarray(img,dtype="float32") #RGB:(w, h, 3)   Gray:(w,h)
if imgChl == 3:arr = np.rollaxis(arr, 2, 0)  #输入数据的维度轴转换次序
data = np.empty((1,imgChl, img_width,img_height),dtype="float32") # 'channels_last' for TF
data[0,:,:,:] = arr'''第2步:构建模型'''
model = Sequential() # 采用贯序模型'''构建权重(卷积核)'''
#增加一个横向的sobel卷积核 一个纵向的sobel卷积核
Kernels = []
sobel_h = [[-1,0,1], [-2, 0, 2], [-1, 0, 1]]
sobel_v = [[-1,-2,-1], [0, 0, 0], [1, 2, 1]]
Kernels.append(sobel_h)
Kernels.append(sobel_v)
Kernels = np.asarray(Kernels)weights = Kernels2Weight(Kernels, chl=imgChl)
# 显示权重结构
# print('Kernels2Weight:\r\n',weights)'''##第一次卷积'''
# ZeroPadding2D 的作用:对2D输入(如图片)的边界填充0,以控制卷积以后特征图的大小
# “channels_last”对应原本的“tf”,“channels_first”对应原本的“th”
#        ‘channels_first’模式下,形如(samples,channels,first_axis_to_pad,second_axis_to_pad)的4D张量
#        ‘channels_last’模式下,形如(samples,first_axis_to_pad,second_axis_to_pad, channels)的4D张量
strFormat = 'channels_first'  # 这里应该是因为data的初始化维度用的th
model.add(ZeroPadding2D(padding=(0,0), data_format = strFormat, batch_input_shape=(1,imgChl, img_width, img_height)))
#  filters:卷积核的数目(即输出的维度)  ### 是该卷积层输出的厚度,而不是输入图像的通道数*卷积核数。 一定要与图像处理区分开
#  kernel_size:整数或由单个整数构成的list/tuple,卷积核的空域或时域窗长度
#  strides:整数或由单个整数构成的list/tuple,为卷积的步长。任何不为1的strides均与任何不为1的dilation_rate均不兼容
#  padding:补0策略,为“valid”(缩小), “same” 或“causal”(膨胀) 缩小或膨胀卷积核的一半
#  activation:激活函数 卷积激活常用的是'relu' 参考 http://keras-cn.readthedocs.io/en/latest/other/activations/
model.add(Convolution2D(filters=2,kernel_size=(3,3),strides=(1,1), padding='same', activation='relu', name='conv1_1', data_format = strFormat))
model.set_weights(weights)  # 这相当于设置了卷积核# 显示权重结构
# w = model.layers[1].get_weights() #返回该层的权重
# print('weight:\r\n', w)'''##第二次卷积(这是继续卷积的实现。为了看提取边缘的效果,所以先注释了)'''
# model.add(ZeroPadding2D((0, 0)))
# model.add(Convolution2D(filters=2,kernel_size=(3,3),strides=(1,1), activation='relu', name='conv1_2',data_format = strFormat))
# w = model.layers[3].get_weights() #返回该层的权重
# print('weight:\r\n', w)
# model.set_weights(weights)##池化操作
model.add(ZeroPadding2D((0, 0)))
model.add(MaxPooling2D(pool_size=(2,2), strides=None, data_format = strFormat))'''第3步:设置优化参数,编译网络(本例中并没有训练)'''
# 优化函数,设定学习率(lr)等参数
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
# 使用mse作为loss函数
model.compile(loss='mse', optimizer=sgd) #class_mode='categorical''''第4步:执行结果'''
'''这里只进行了卷积/池化,并没有分类等'''print('data-shape = ', data.shape)
result = model.predict(data,batch_size=3,verbose=0)
print('result shape = ', result.shape)'''显示图片,卷积的结果'''
fig = plt.figure()
img_new1 = Image.fromarray(result[0][0]).convert('L')
print(img_new1.size)
ax0 = fig.add_subplot(121)
ax0.imshow(img_new1)img_new2 = Image.fromarray(result[0][1]).convert('L')
print(img_new2.size)
ax0 = fig.add_subplot(122)
ax0.imshow(img_new2)
plt.show()

原图是迷人的Lena,就不用贴了。512x512的尺寸。
两个sobel卷积核,结果是纵向边缘和横向边缘。经过池化之后,为256大小的图像。
这里是进行了固定权重(卷积核)进行的图像处理,下一步就可以将卷积网络连上数据去训练了。

这篇关于Keras入门之二:Hello Keras on CNN with Lena的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/376173

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By