keras学习笔记(2)

1.卷积神经网络卫星图片识别

import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import pandas as pd
import pathlib#面向对象的路径管理工具,类似os

data_dir='./2_class'

data_root=pathlib.Path(data_dir)#创建路径对象

data_root#WindowsPath('2_class')

#对目录迭代
for item in data_root.iterdir():#对象的提取目录方法
    print(item)#2_classairplane, 2_classlake

#提取出所有路径,对象的提取所有文件方法
all_image_path=list(data_root.glob('*/*'))#正则,提取出所有目录下的所有文件

image_count=len(all_image_path)#一共1400张

all_image_path[:3]

all_image_path[-3:]

#设置路径,变成纯正路径

all_image_path=[str(path) for path in all_image_path]

#图片路径乱序
import random
random.shuffle(all_image_path)

#设置标签
label_names=sorted(item.name for item in data_root.glob('*/'))#,提取路径的左右目录,两个文件夹的名字

label_names

label_to_index=dict((name,index) for index,name in enumerate(label_names))#将标签(文件名)换成数字

label_to_index



all_image_label=[label_to_index[pathlib.Path(p).parent.name] for p in all_image_path]

all_image_label[:5]

all_image_path[:5]

import IPython.display as display

index_to_label=dict((v,k )for k,v in label_to_index.items())

index_to_label

for n in range(3):
    image_index=random.choice(range(len(all_image_path)))
    display.display(display.Image(all_image_path[image_index]))
    print(index_to_label[all_image_label[image_index]])
    print()

img_path=all_image_path[0]

img_path

img_raw=tf.io.read_file(img_path)#tensor类型的图片二进制文件

#图片解码
img_tensor=tf.image.decode_image(img_raw)

print(img_tensor.shape)

img_tensor.dtype

img_tensor

#图片标准化
img_tensor=tf.cast(img_tensor,tf.float32)
img_tensor=img_tensor/255

img_tensor.numpy().max()

img_tensor.numpy().min()

#写成与i个函数
def load_preprosess_image(img_path):
    img_raw=tf.io.read_file(img_path)
    img_tensor=tf.image.decode_jpeg(img_raw,channels=3)
    img_tensor=tf.image.resize(img_tensor,[256,256])
    img_tensor=tf.cast(img_tensor,tf.float32)
    img=img_tensor/255
    return img

plt.imshow(load_preprosess_image(all_image_path[100]))#取第100张图片看一下

path_ds=tf.data.Dataset.from_tensor_slices(all_image_path)

path_ds

image_dataset=path_ds.map(load_preprosess_image)#图片数据

#标签数据
label_dataset=tf.data.Dataset.from_tensor_slices(all_image_label)

for label in label_dataset.take(10):
    print(label.numpy())

image_dataset

for img in image_dataset.take(1):
    print(img)

#数据标签合并成一个数据
dataset=tf.data.Dataset.zip((image_dataset,label_dataset))

dataset

#划分数据集
test_count=int(image_count*0.2)
train_count=image_count-test_count

test_count,train_count

train_dataset=dataset.skip(test_count)

test_dataset=dataset.take(test_count)

BATCH_SIZE=32

#repeat方法可以使dataset源源不断的产生数据
train_dataset=train_dataset.repeat().shuffle(buffer_size=train_count).batch(BATCH_SIZE)

test_dataset=test_dataset.batch(BATCH_SIZE)

#构造模型
model=tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(64,(3,3),input_shape=(256,256,3),activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(256,(3,3),activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Conv2D(256,(3,3),activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(512,(3,3),activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(512,(3,3),activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(1024,(3,3),activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(1024,activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Dense(256,activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Dense(10,activation='sigmoid'))

model.summary()

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

steps_per_epoch=train_count//BATCH_SIZE
validation_steps=test_count//BATCH_SIZE

history=model.fit(train_dataset,epochs=1,steps_per_epoch=steps_per_epoch,validation_data=test_dataset,validation_steps=validation_steps)

history

 2.序列问题,电影评论数据

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

(x_train,y_train),(x_test,y_test)=keras.datasets.imdb.load_data(num_words=10000)#每条评论的单词对应的索引不超过10000

x_train.shape

x_train[0]

y_train.shape

[len(x) for x in x_train]#每条评论的长度

x_train=keras.preprocessing.sequence.pad_sequences(x_train,300)#每条评论填充成300个单词长
x_test=keras.preprocessing.sequence.pad_sequences(x_test,300)

[len(x) for x in x_train]#每条评论的长度

test='i am a student'
dict((word,test.split().index(word)) for word in test.split())

model=keras.models.Sequential()


model.add(layers.Embedding(10000,50,input_length=300))#输入数据最大10000,映射成维50的密集向量(25000,300)>>>>>>(25000,300,50)

#model.add(layers.Flatten())#(25000,300,50)>>>>>>>>>(25000,300*50)


model.add(layers.GlobalAveragePooling1D())#可以代替Flatten层,#(25000,300,50)>>>>>>>>>(25000,50)

model.add(layers.Dense(128,activation='relu'))

model.add(layers.Dropout(0.3))

model.add(layers.Dense(1,activation='sigmoid'))

model.summary()

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001),loss='binary_crossentropy',metrics=['acc'])

history=model.fit(x_train,y_train,epochs=10,batch_size=256,validation_data=(x_test,y_test))

history.history.keys()

import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(history.epoch,history.history['loss'],'r')
plt.plot(history.epoch,history.history['val_loss'],'b--')

plt.plot(history.epoch,history.history['acc'],'r')
plt.plot(history.epoch,history.history['val_acc'],'b--')

 3.猫狗数据集 图片数据增强

import keras
from keras import layers
import numpy as np
import os
import shutil

base_dir = './dataset/cat_dog'
train_dir = os.path.join(base_dir , 'train')
train_dir_dog = os.path.join(train_dir , 'dog')
train_dir_cat = os.path.join(train_dir , 'cat')

test_dir = os.path.join(base_dir , 'test')
test_dir_dog = os.path.join(test_dir , 'dog')
test_dir_cat = os.path.join(test_dir , 'cat')
dc_dir = './dataset/dc/train'

if not os.path.exists(base_dir):
    os.mkdir(base_dir)
    os.mkdir(train_dir)
    os.mkdir(train_dir_dog)
    os.mkdir(train_dir_cat)
    os.mkdir(test_dir)
    os.mkdir(test_dir_dog)
    os.mkdir(test_dir_cat)

    fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]
    for fname in fnames:
        s = os.path.join(dc_dir, fname)
        d = os.path.join(train_dir_cat, fname)
        shutil.copyfile(s, d)

    fnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)]
    for fname in fnames:
        s = os.path.join(dc_dir, fname)
        d = os.path.join(test_dir_cat, fname)
        shutil.copyfile(s, d)

    fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]
    for fname in fnames:
        s = os.path.join(dc_dir, fname)
        d = os.path.join(train_dir_dog, fname)
        shutil.copyfile(s, d)

    fnames = ['dog.{}.jpg'.format(i) for i in range(1000, 1500)]
    for fname in fnames:
        s = os.path.join(dc_dir, fname)
        d = os.path.join(test_dir_dog, fname)
        shutil.copyfile(s, d)

(1) 读取图片

(2)将图片解码

(3)预处理图片,大小

(4)图片归一化

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1/255,
                                  rotation_range=40,
                                  width_shift_range=0.2,      
                                  height_shift_range=0.2,
                                  brightness_range=(0.6, 1),
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    vertical_flip=True)
test_datagen = ImageDataGenerator(rescale=1/255)

train_generator = train_datagen.flow_from_directory(train_dir,
                                                    target_size=(200, 200),
                                                    batch_size=20,
                                                    class_mode='binary'
)

import matplotlib.pyplot as plt
%matplotlib inline

for im_batch in train_generator:
    for im in im_batch:
        plt.imshow(im[0])
        break
    break

test_generator = test_datagen.flow_from_directory(test_dir,
                                                    target_size=(200, 200),
                                                    batch_size=20,
                                                    class_mode='binary'
)





model = keras.Sequential()

model.add(layers.Conv2D(64, (3, 3), activation="relu", input_shape=(200, 200, 3)))
model.add(layers.Conv2D(64, (3, 3), activation="relu"))
model.add(layers.MaxPooling2D())
model.add(layers.Dropout(0.25))

model.add(layers.Conv2D(64, (3, 3), activation="relu"))
model.add(layers.Conv2D(64, (3, 3), activation="relu"))
model.add(layers.MaxPooling2D())
model.add(layers.Dropout(0.25))

model.add(layers.Conv2D(64, (3, 3), activation="relu"))
model.add(layers.Conv2D(64, (3, 3), activation="relu"))
model.add(layers.MaxPooling2D())
model.add(layers.Dropout(0.25))

model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dropout(0.5))

model.add(layers.Dense(1, activation='sigmoid'))

model.summary()

model.compile(optimizer=keras.optimizers.Adam(lr),
              loss='binary_crossentropy',
              metrics=['acc']
)

history = model.fit_generator(
    train_generator,
    epochs=30,
    steps_per_epoch=100,
    validation_data=test_generator,
    validation_steps=50
)

keras.optimizers

 4.Eager模式

import tensorflow as tf

tf.executing_eagerly()

x=[[2,]]

m=tf.matmul(x,x)#矩阵相乘

m#Tensor的两个属性:shape,dtype。不可变

m.numpy()#tensor的方法

a=tf.constant([[1,2],[3,4]])

a

b=tf.add(a,1)

b

c=tf.multiply(a,b)#对应元素相乘

c

num=tf.convert_to_tensor(10)#数字转换成tensor类型,tensor不仅可以在cpu工作,也可以在gpu工作

num

for i in range(num.numpy()):
    i=tf.constant(i)
    if int(i%2)==0:#tenor对象应用numpy的计算方法时,会自动地转换成numpu类型,ndarray和tensor可以直接运算
        print('even')
    else:
        print('odd')

v=tf.Variable(0.0)#定义变量

v+1

v.assign(5)#改变变量的值

v.assign_add(1)#变量加1

#读取变量、
v.read_value()

#记录运算过程,方便求解梯度,跟踪变量运算,必须是float类型
w=tf.Variable([[1.0]])
with tf.GradientTape() as t:
    loss=w*w

grad=t.gradient(loss,w)

grad

#跟踪常量运算
w=tf.constant(3.0)
with tf.GradientTape() as t:
    t.watch(w)
    loss=w*w

dloss_dw=t.gradient(loss,w)

dloss_dw

w=tf.constant(3.0)
with tf.GradientTape(persistent=True) as t:#持久性记忆
    t.watch(w)
    y=w*w
    z=y*y

dy_dw=t.gradient(y,w)

dy_dw

dz_dw=t.gradient(z,w)

dz_dw

(train_image,train_labels),(test_image,test_labels)=tf.keras.datasets.mnist.load_data()

train_image.shape

train_labels

#扩张图像的维度
train_image=tf.expand_dims(train_image,-1)#最后一维扩张

test_image=tf.expand_dims(test_image,-1)

train_image.shape

#改变数据类型,float
train_image=tf.cast(train_image/255,tf.float32)

test_image=tf.cast(test_image/255,tf.float32)

#转换标签数据类型
train_labels=tf.cast(train_labels,tf.int64)

test_labels=tf.cast(test_labels,tf.int64)

#作为tf.data加载进来
dataset=tf.data.Dataset.from_tensor_slices((train_image,train_labels))#输入必须时元组类型

#作为tf.data加载进来
test_dataset=tf.data.Dataset.from_tensor_slices((test_image,test_labels))#输入必须时元组类型

dataset

dataset=dataset.shuffle(10000).batch(32)#数据混洗

test_dataset=test_dataset.batch(32)

dataset

model=tf.keras.Sequential([tf.keras.layers.Conv2D(16,[3,3],activation='relu',input_shape=(None,None,1)),
                          tf.keras.layers.Conv2D(32,[3,3],activation='relu'),
                          tf.keras.layers.GlobalMaxPooling2D(),
                          tf.keras.layers.Dense(10)])

model.trainable_variables

#自定义循环
optimizer=tf.keras.optimizers.Adam()

loss_func=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

features,labels=next(iter(dataset))

features.shape

labels.shape

predictions=model(features)

predictions.shape

tf.argmax(predictions,axis=1)#每行的最大值下标

def loss(model,x,y):
    y_=model(x)
    return loss_func(y,y_)

train_loss=tf.keras.metrics.Mean('train_loss')
train_accuracy=tf.keras.metrics.SparseCategoricalAccuracy('train_accuracy')

test_loss=tf.keras.metrics.Mean('test_loss')
test_accuracy=tf.keras.metrics.SparseCategoricalAccuracy('test_accuracy')



def train_step(model,images,labels):
    with tf.GradientTape() as t:
        pred=model(images)
        loss_step=loss_func(labels,pred)
    grads=t.gradient(loss_step,model.trainable_variables)
    optimizer.apply_gradients(zip(grads,model.trainable_variables))
    train_loss(loss_step)
    train_accuracy(labels,pred)

def test_step(model,images,labels):

    pred=model(images)
    loss_step=loss_func(labels,pred)

    test_loss(loss_step)
    test_accuracy(labels,pred)

def train():
    for epoch in range(10):
        for (batch,(images,labels)) in enumerate(dataset):
            train_step(model,images,labels)
        print('Epoch{} loss is {},acc is{}'.format(epoch,train_loss.result(),train_accuracy.result()))
        for (batch,(images,labels)) in enumerate(test_dataset):
            test_step(model,images,labels)
            print('Epoch{} test_loss is {},acc is{}'.format(epoch,test_loss.result(),test_accuracy.result()))
        train_loss.reset_states()
        train_accuracy.reset_states()
        test_loss.reset_states()
        test_accuracy.reset_states()

train()

#tf.keras.metrics汇总计算模块
m=tf.keras.metrics.Mean('acc')#初始化求均值对象m.result(),m.reset_states()重置

a=tf.keras.metrics.SparseCategoricalAccuracy('acc')
a(labels,model(features))

 5.Tensorboard可视化

import tensorflow  as tf
import datetime

tf.__version__

(train_image, train_labels), (test_image, test_labels) = tf.keras.datasets.mnist.load_data()

train_image.shape

train_image = tf.expand_dims(train_image, -1)

test_image = tf.expand_dims(test_image, -1)

train_image.shape

train_image = tf.cast(train_image/255, tf.float32)

test_image = tf.cast(test_image/255, tf.float32)

train_labels = tf.cast(train_labels, tf.int64)

test_labels = tf.cast(test_labels, tf.int64)

dataset = tf.data.Dataset.from_tensor_slices((train_image, train_labels))

test_dataset = tf.data.Dataset.from_tensor_slices((test_image, test_labels))

dataset

dataset = dataset.repeat(1).shuffle(60000).batch(128)

test_dataset = test_dataset.repeat(1).batch(128)

dataset

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(16, [3,3], activation='relu', input_shape=(None, None, 1)),
    tf.keras.layers.Conv2D(32, [3,3], activation='relu'),
    tf.keras.layers.GlobalMaxPooling2D(),
    tf.keras.layers.Dense(10, activation='softmax')
])

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

import datetime
import os

log_dir=os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)

file_writer = tf.summary.create_file_writer(log_dir + "/metrics")
file_writer.set_as_default()

def lr_schedule(epoch):
    """
    Returns a custom learning rate that decreases as epochs progress.
    """
    learning_rate = 0.2
    if epoch > 5:
        learning_rate = 0.02
    if epoch > 10:
        learning_rate = 0.01
    if epoch > 20:
        learning_rate = 0.005

    tf.summary.scalar('learning rate', data=learning_rate, step=epoch)
    return learning_rate

lr_callback = tf.keras.callbacks.LearningRateScheduler(lr_schedule)

model.fit(dataset,
          epochs=5,
          steps_per_epoch=60000//128,
          validation_data=test_dataset,
          validation_steps=10000//128,
          callbacks=[tensorboard_callback])

%load_ext tensorboard
%matplotlib inline

%tensorboard --logdir logs
'''SCALARS 面板主要用于记录诸如准确率、损失和学习率等单个值的变化趋势。在代码中用 tf.summary.scalar() 来将其记录到文件中

每个图的右下角都有 3 个小图标,第一个是查看大图,第二个是是否对 y 轴对数化,第三个是如果你拖动或者缩放了坐标轴,再重新回到原始位置。

GRAPHS 面板展示出你所构建的网络整体结构,显示数据流的方向和大小,也可以显示训练时每个节点的用时、耗费的内存大小以及参数多少。默认显示的图分为两部分:主图(Main Graph)和辅助节点(Auxiliary Nodes)。其中主图显示的就是网络结构,辅助节点则显示的是初始化、训练、保存等节点。我们可以双击某个节点或者点击节点右上角的 + 来展开查看里面的情况,也可以对齐进行缩放

DISTRIBUTIONS 主要用来展示网络中各参数随训练步数的增加的变化情况,可以说是 多分位数折线图 的堆叠。

HISTOGRAMS 和 DISTRIBUTIONS 是对同一数据不同方式的展现。与 DISTRIBUTIONS 不同的是,HISTOGRAMS 可以说是 频数分布直方图 的堆叠。

# 记录自定义标量

重新调整回归模型并记录自定义学习率。这是如何做:

使用创建文件编写器tf.summary.create_file_writer()。

定义自定义学习率功能。这将被传递给Keras LearningRateScheduler回调。

在学习率功能内,用于tf.summary.scalar()记录自定义学习率。

将LearningRateScheduler回调传递给Model.fit()。

通常,要记录自定义标量,您需要使用tf.summary.scalar()文件编写器。文件编写器负责将此运行的数据写入指定的目录,并在使用时隐式使用tf.summary.scalar()。
'''
model.fit(dataset,
          epochs=30,
          steps_per_epoch=60000//128,
          validation_data=test_dataset,
          validation_steps=10000//128,
          callbacks=[tensorboard_callback, lr_callback])





# 自定义训练中使用Tensorboard

optimizer = tf.keras.optimizers.Adam()

loss_func = tf.keras.losses.SparseCategoricalCrossentropy()

def loss(model, x, y):
    y_ = model(x)
    return loss_func(y, y_)

train_loss = tf.keras.metrics.Mean('train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy('train_accuracy')

test_loss = tf.keras.metrics.Mean('test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy('test_accuracy')

def train_step(model, images, labels):
    with tf.GradientTape() as t:
        pred = model(images)
        loss_step = loss_func(labels, pred)
    grads = t.gradient(loss_step, model.trainable_variables)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))
    train_loss(loss_step)
    train_accuracy(labels, pred)

def test_step(model, images, labels):
    pred = model(images)
    loss_step = loss_func(labels, pred)
    test_loss(loss_step)
    test_accuracy(labels, pred)

current_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
train_log_dir = 'logs/gradient_tape/' + current_time + '/train'
test_log_dir = 'logs/gradient_tape/' + current_time + '/test'
train_summary_writer = tf.summary.create_file_writer(train_log_dir)
test_summary_writer = tf.summary.create_file_writer(test_log_dir)

def train():
    for epoch in range(10):
        for (batch, (images, labels)) in enumerate(dataset):
            train_step(model, images, labels)
            print('.', end='')
    
        with train_summary_writer.as_default():
            tf.summary.scalar('loss', train_loss.result(), step=epoch)
            tf.summary.scalar('accuracy', train_accuracy.result(), step=epoch)
        
        for (batch, (images, labels)) in enumerate(test_dataset):
            test_step(model, images, labels)
            print('*', end='')
            
        with test_summary_writer.as_default():
            tf.summary.scalar('loss', test_loss.result(), step=epoch)
            tf.summary.scalar('accuracy', test_accuracy.result(), step=epoch)
        template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
        print(template.format(epoch+1,
                               train_loss.result(), 
                               train_accuracy.result()*100,
                               test_loss.result(), 
                               test_accuracy.result()*100))
        
        train_loss.reset_states()
        train_accuracy.reset_states()
        test_loss.reset_states()
        test_accuracy.reset_states()

train()

%tensorboard --logdir logs/gradient_tape

  

原文地址:https://www.cnblogs.com/Turing-dz/p/13193971.html