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 WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE