【keras代码实现】cnn-conv2D

本博客得代码来自一位b站分享技术得up,我觉得视频特别关注初学者,讲的非常细。希望分享给大家,视频传送门玩转Keras卷积神经网络Mnist数据集 ,代码传送门cnn代码

这篇博文分享一下使用Keras实现的cnn神经网络的代码

代码文件结构如下,CNN_Conv2d_train.py是用来训练这个模型的,CNN_Conv2d_predict.py是用于将我们自己的图片输入进去,用于预测的,Predict_image文件夹是用来放置我们用来预测的图片的。

我们先来介绍一下CNN_Conv2d_train.py文件中的代码

import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Convolution2D, Activation, MaxPool2D, Flatten, Dense
from keras.optimizers import Adam

第一部分是导入各个包,numpy是用于科学计算的包,第二行用于导入minst数据集,第四行用于导入model,第五行用于导入层,这里涉及到二维卷积层,激活层,最大池化层,flatten层(用于将卷积得到的矩阵变成一个很大的一维向量),dense层全连接层,最后一行用于导入一个优化函数“adam”

nb_class = 10
nb_epoch = 4
batchsize = 1024

第二部分是定义一些参数,nb_class这个参数用于定义最终被分的类别的个数(本例是10类),nb_epoch这个参数是整个数据集被训练多少次(本例是四次),batchsize这个参数用于定义一次进入网络有多少张图片(本例是一次进入网络1024张图片)

# Prepare your data mnist, MAC /.Keras/datasets linux home .keras/datasets
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

第三部分是导入这个数据集,就是将mnist数据集导入内存中

# setup data shape
X_train = X_train.reshape(-1, 28, 28, 1)  # TFchannel last theano (1,28,28)
X_test = X_test.reshape(-1, 28, 28, 1)
Y_train = X_train.astype('float32')
Y_test = Y_test.astype('float32')

第四部分用来建立数据的形状,第一行定义训练集图片的形状,每一个图片都是(28,28,1)形状,第一个参数-1的作用是“未知多少张图片”就是无论多少张图片都将其定义成(28,28,1)形式

第二行将训练集的图片也定义成(28,28,1)形式

第三行用于把训练集的标签转化为float32类型,同理,第四行用于将测试集的标签转化为float32类型

X_train = X_train/255.0
X_test = X_test/255.0

这一部分用于将训练集和测试集的图片矩阵值浮点化,并且归一化,除以255.0就是同时进行浮点化和归一化,这样这个矩阵的值就变成了零到一之间的一个小数。

# One-hot [0,0,0,0,0,1,0,0,0] =5

Y_train = np_utils.to_categorical(Y_train, nb_class)
Y_test = np_utils.to_categorical(Y_test, nb_class)

这部分用于将训练集和测试集的标签变为one-hot类型的

# setup model

model = Sequential()

# 1st Conv2D layer
model.add(Convolution2D(
    filters=32,
    kernel_size=[5, 5],
    padding='same',
    input_shape=(28, 28, 1)
))
model.add(Activation('relu'))

model.add(MaxPool2D(
    pool_size=(2, 2),
    strides=(2, 2),
    padding="same",
))

# 2nd Conv2D layer
model.add(Convolution2D(
    filters=64,
    kernel_size=(5, 5),
    padding='same',
))

model.add(Activation('relu'))
model.add(MaxPool2D(
    pool_size=(2, 2),
    strides=(2, 2),
    padding="same",
))

#1st Fully connected Dense
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))

#2nd Fully connected Dense
model.add(Dense(10))
model.add(Activation('softmax'))

这部分用于定义这个模型,首先对这个添加一个Convolution2D层(二维卷积层),其中有三十二个卷积核,卷积核的大小是(5,5),加入一个padding层,因为是第一层所以定义一个input_shape(之后就不用了);之后连接一个激活层,激活层使用的激活函数是relu,之后连接一个maxpooling层,其中pool_size的意思是2*2的区间行驶池化,strides的意思是每两个池化之间差两个,同时也在池化层中加入一个padding;之后再添加一个卷积层,但是卷积核的个数变为了64,添加激活层和池化层。

之后用Flatten层,把卷积得到的矩阵变为一个很长的向量,

之后加入全连接层Dense层,第一个Dense层的输出结果是一个1024维的向量,激活函数使用relu;第二个Dense层的输出是一个十维的向量,激活函数使用softmax(最后使用分类所以使用softmax)

这样整个模型就被定义完成了

#Define Optimizer and setup Parameter
adam = Adam(lr=0.0001)

#compile model
model.compile(
    optimizer=adam,
    loss='categorical_crossentropy',
    metrics=['accuracy'],
)

这一部分用来定义优化器和模型的参数,优化器使用adam,损失函数使用的是categorical_crossentropy loss(交叉熵损失函数)

#Run/Fireup network

model.fit(x=X_train,
          y=Y_train,
          epochs=nb_epoch,
          batch_size=batchsize,
          verbose= 1,
          validation_data=(X_test,Y_test),
          )

这一部分用于跑完整个model,其中先定义了测试集的数据,测试集的标签,定义整个训练集要被训练多少次,定义一次放多少数据到神经网络。verbos这个变量的作用是定义要不要添加测试集,最后定义了测试集的数据都有什么

至此,模型训练部分就结束了。

下面,开始我们模型预测部分:

import numpy as np
from keras.models import load_model
import matplotlib.pyplot as plt
import matplotlib.image as processimage

第一部分还是导包,

#load trained model
model = load_model('model_name.h5')

这一部分用于存储这个模型。

class MainPredictImg(object):
    def __init__(self):
        pass

    def pred(self,filename):
        #np array
        pred_img = processimage.imread(filename) #read image
        pred_img = np.array(pred_img) #tranfer to array np
        pred_img = pred_img.reshape(-1,28,28,1) #reshape into network needed shape
        prediction = model.predict(pred_img) #predict
        Final_prediction = [result.argmax() for result in prediction][0] #[1,2,3,1,3,2,2,]
        a = 0
        for i in prediction[0]:
            print a
            print 'Percent:{:.30%}'.format(i)
            a = a+1

        return Final_prediction

这一部分定义一个类MainPredictImg用于做预测只用。先是一个构造器,之后定义pred方法用于预测。方法中首先是读取图片,之后是将图片转化为numpy数组,之后是将这个导入的图片转化为(28,28,1)的图片,之后对这个图片进行预测,之后对预测结果取周瑜打的,,最后把每一个预测值输出。

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Keras搭建的CNN-BiLSTM进行图像分类的Python代码示例: ```python from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, LSTM, Bidirectional from keras.optimizers import Adam from keras.utils import to_categorical # 定义CNN-BiLSTM模型 def create_model(input_shape, num_classes): model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Bidirectional(LSTM(128, return_sequences=False))) model.add(Dense(num_classes, activation='softmax')) optimizer = Adam(lr=0.001, decay=1e-6) model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy']) return model # 加载数据集并进行预处理 (x_train, y_train), (x_test, y_test) = load_data() x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test = x_test.reshape(x_test.shape[0], 28, 28, 1) y_train = to_categorical(y_train, num_classes=10) y_test = to_categorical(y_test, num_classes=10) # 创建CNN-BiLSTM模型 model = create_model(input_shape=(28, 28, 1), num_classes=10) # 训练模型 model.fit(x_train, y_train, batch_size=128, epochs=10, verbose=1, validation_data=(x_test, y_test)) # 评估模型 score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 在这个示例中,我们使用了MNIST数据集进行图像分类,该数据集包含手写数字的图像。我们首先定义了一个名为`create_model`的函数,该函数创建CNN-BiLSTM模型。然后,我们加载了MNIST数据集并进行了必要的预处理。最后,我们使用`fit`方法训练模型,并使用`evaluate`方法评估模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值