tensorflow CNN模型训练+优化参数+实战

训练线性函数
在这里插入图片描述

import numpy as np
import tensorflow.keras as keras
# 构建模型
model = keras.Sequential([keras.layers.Dense(units=1,input_shape=[1])])
# optimizer优化,loss损失
model.compile(optimizer='sgd', loss='mean_squared_error')
#准备训练数据
xs=np.array([-1.0,0,1,2,3,4],dtype=float)
ys=np.array([-3,-1,1,3,5,7],dtype=float)
#训练模型,epochs是训练次数
model.fit(xs,ys,epochs=500)
#使用模型,用模型去检测10
print(model.predict([10.0]))

计算机视觉
在这里插入图片描述

import tensorflow as tf
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()

#构造神经元模型,是全连接网络
#输入是28*28,最后一层需要分10类,中间有128个神经元,激活函数是relu
#最后一层是输出层
model=keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(128,activation=tf.nn.relu))
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))

model.summary()
#图片是784个像素,128层神经元,+1是每一层都有一个bias,100480个param
(784+1)*128
#输出层是10个神经元,输出是(128+1)*10

在这里插入图片描述

import tensorflow as tf
import numpy as np
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()

#构造神经元模型
#输入是28*28,最后一层需要分10类,中间有128个神经元,激活函数是relu
#最后一层是输出层
model=keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(128,activation=tf.nn.relu))
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))

#model.summary()
#图片是784个像素,128层神经元,+1是每一层都有一个bias,100480个param
(784+1)*128
#输出层是10个神经元,输出是(128+1)*10

#让他变成0-1之间的数,准确率会更高
train_images=train_images/255
#指定优化的方法,
model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=['accuracy'])
#用训练数据集训练
model.fit(train_images,train_labels,epochs=5)

test_images_scale=test_images/255
#评估模型效果
model.evaluate(test_images_scale,test_labels)

#用模型判断单张图片的方法
print(np.argmax(model.predict([[test_images[0]/255]])))
print(test_labels[0])

自动终止训练
用到的是callback,每次训练以后都会使用callback,例子是loss小于0.4终止
步骤就是定义类,生成实例

import tensorflow as tf
import numpy as np
from tensorflow import keras
#定义callback,也就是loss小于0.4的时候终止
class myCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self,epoch,logs={}):
        if(logs.get('loss')<0.4):
            print('\nLoss is low so cancelling training!')
            self.model.stop_training=True

#调用实例
callbacks=myCallback()
fashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()
train_images_scaled=train_images/255.0
test_labels_scaled=test_labels/255.0
model=keras.Sequential()
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(512,activation=tf.nn.relu))
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))
model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=['accuracy'])
model.fit(train_images_scaled,train_labels,epochs=5,callbacks=[callbacks])

卷积神经网络结合
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
max pooling是为了增加区域特征
在这里插入图片描述

卷积神经网络的程序

import tensorflow as tf
import numpy as np
from tensorflow import keras

fashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()
train_images_scaled=train_images/255.0
test_labels_scaled=test_labels/255.0

model=tf.keras.models.Sequential([
    #卷积层,过滤器有64个,每个过滤器是3*3个像素,输入图片灰度值
    tf.keras.layers.Conv2D(64,(3,3),activation='relu',
                           input_shape=(28,28,1)),
    #卷积之后增强特征,原来的输出会小一半
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(64,(3,3),activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128,activation='relu'),
    tf.keras.layers.Dense(10,activation='softmax')
])
model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=['accuracy'])
#如果有维度问题可以加reshape
model.fit(train_images_scaled.reshape(-1,28,28,1),train_labels,epochs=5)

可以用model.summary()来查看神经网络的结构
在这里插入图片描述
图片原尺寸是2828,经过33的过滤器变成了2626,一张图片变成了64张,maxpooling将照片剪成1/4,后面同理
param (3
3+1)*64=640

#查看网络结构
layer_outputs=[layer.output for layer in model.layers]
activation_model=tf.keras.models.Model(inputs=model.input,outputs=layer_outputs)
pred=activation_model.predict(test_images[0].reshape(1,28,28,1))
#可以查看过滤器之后的小图片
plt.imshow(pred[0][0,:,:,2])

项目实战
准备训练数据,构建模型,训练模型,优化参数
数据结构
在这里插入图片描述
真实数据的特点
图片尺寸大小不一,需要裁剪成一样大小
数据量比较大,不能一下子装入内存
经常需要修改数据

加载数据

from tensorflow.keras.preprocessing.image import ImageDataGenerator
#创建两个数据生成器,指定scaling范围0-1
train_datagen=ImageDataGenerator(rescale=1/255)
validation_datagen=ImageDataGenerator(rescale=1/255)

#指向训练数据文件夹
train_generator=train_datagen.flow_from_directory(
    'E:/tf神经网络练习/horse-or-human/',#训练数据所在文件夹
    target_size=(300,300),  #指定输出尺寸
    batch_size=32,
    class_mode='binary' #指定二分类
 )

#指向测试数据文件夹
validation_generator=validation_datagen.flow_from_directory(
    'E:/tf神经网络练习/validation-horse-or-human',#训练数据所在文件夹
    target_size=(300,300),  #指定输出尺寸
    batch_size=32,
    class_mode='binary' #指定二分类
 )


模型及训练

model=tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16, (3, 3), activation='relu',
                           input_shape=(150, 150, 3)),
    # 卷积之后增强特征,原来的输出会小一半
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss="binary_crossentropy",optimizer="adam",metrics=['acc'])

history=model.fit(
    train_generator,
    epochs=15,
    verbose=1,
    validation_data=validation_generator,
    validation_steps=8
    )

对模型的各种参数进行优化

from kerastunter.engine.hyperparameters import Hyperpaeameters
hp=hyperpaeameters()
def build_model(hp):
    model=tf.keras.models.Sequential()
    #调整过滤器函数
    model.add(tf.keras.layers.Conv2D(hp.Choice('num_filters_layer0',values=[16,64],default=16), (3, 3), activation='relu',
                               input_shape=(150, 150, 3)))
    model.add(tf.keras.layers.MaxPooling2D(2, 2))
    for i in range(hp.Int("num_conv_layers",1,3)):
        model.add(tf.keras.layers.Conv2D(hp.Choice(f'num_filters_layer{i}',values=[16,64],default=16),  (3, 3), activation='relu'))
        model.add(tf.keras.layers.MaxPooling2D(2, 2))
    model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(tf.keras.layers.MaxPooling2D(2, 2))
    model.add(tf.keras.layers.Flatten())
    #调整神经元
    model.add(tf.keras.layers.Dense(hp.Int("hidden_units",128,512,step=32), activation='relu'))
    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
    model.compile(model.compile(loss="binary_crossentropy",optimizer="adam",metrics=['acc']))
    return model
tuner=Hyperband(
    build_model,
    objective='val_acc',
    max_epochs=15,
    diretory='horse_human_params',
    hyperparameters=hp,
    project_name='my_hourse_human_project'
)
#查看调参过程
tuner.search(train_generator,epochs=10,validation_data=validation_generator)

best_hps=tuner.get_best_hyperparametera(1)[0]
print(best_hps.values)
#获取最好参数把模型构建出来
model=tuner.hypermodel.build(best_hps)
model.summary()

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TensorFlow是一种开源的机器学习框架,具有广泛的应用领域,其中之一就是计算机视觉。通过使用TensorFlowCNN(卷积神经网络)模型,我们可以进行AI图像处理,并进入计算机视觉领域。 首先,CNN是一种在图像处理中非常常用的深度学习模型。它的核心思想是通过多层的卷积、池化和全连接层来提取图像的特征,并用于分类、目标检测、图像生成等任务。TensorFlow作为一种流行的深度学习框架,提供了丰富的API和工具,使得构建和训练CNN模型变得更加容易。 使用TensorFlow进行CNN实战图像处理,我们可以利用其强大的计算能力和高效的图像处理算法,实现许多有趣的应用。例如,我们可以使用CNN对图像进行分类,将其归类为不同的物体或场景。我们可以使用已经训练好的模型,也可以通过自定义网络结构进行训练,以适应我们的具体任务。 另外,利用CNN进行目标检测也是计算机视觉中非常重要的任务之一。目标检测可以帮助我们在图像中定位和识别特定目标的位置。通过使用TensorFlowCNN模型,我们可以训练一个高效的检测器,并在实际应用中实现各种目标检测需求。 此外,TensorFlow还提供了许多其他的图像处理工具和技术,如图像增强、图像生成和图像分割等。通过利用这些工具,我们可以更好地理解和处理图像数据,并探索更多有趣的图像处理应用领域。 总之,TensorFlowCNN模型为我们进入计算机视觉领域提供了丰富的工具和技术,使我们能够实战AI图像处理。无论是图像分类、目标检测还是其他图像处理任务,通过深入学习和实践,我们可以在这个领域取得更多的成果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值