tensorflow包tf.keras模块构建和训练深度学习模型

 1. 读入数据

以mnist数据为例,手写数字(0-9)的分类问题,有监督学习。

import tensorflow as tf
import numpy as np

### 1. 读入数据
# mnist数据集作为演示数据
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
assert x_train.shape == (60000, 28, 28)
assert x_test.shape == (10000, 28, 28)
assert y_train.shape == (60000,)
assert y_test.shape == (10000,)
# print(x_train[1]) # 第一个图片数据
#print(y_train)

#增加一个维度: 图片数,行,列,图层
x_train=np.expand_dims(x_train,axis = 3)
x_test=np.expand_dims(x_test,axis = 3)

input_shape = x_train.shape[1:] # 去掉最高维!!!
print(input_shape)
#input_shape = tf.keras.layers.Flatten(input_shape=(28,28))

# 数据re-scale 到 0~1.0之间
x_train = x_train/255.
x_test = x_test/255.
# print(x_train[1])


# y值转化为one-hot编码
def one_hot(labels):
    onehot_labels=np.zeros(shape=[len(labels),10])
    for i in range(len(labels)):
        index=labels[i]
        onehot_labels[i][index]=1
    return onehot_labels
y_train = one_hot(y_train)
y_test = one_hot(y_test)

print(y_train[0])

2.通过计算过程搭建模型

### 2.通过计算过程搭建模型
inputs = tf.keras.Input(shape=input_shape) # Returns a placeholder tensor
x = tf.keras.layers.Flatten()(inputs)
# A layer instance is callable on a tensor, and returns a tensor.
x = tf.keras.layers.Dense(128, activation='relu')(x)
predictions = tf.keras.layers.Dense(10, activation='softmax')(x)
 
# Instantiate the model given inputs and outputs.
model = tf.keras.Model(inputs=inputs, outputs=predictions)

model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.001),
              loss="categorical_crossentropy",
                 metrics=['accuracy'])
print("model fit")
model.fit(x=x_train,y=y_train,batch_size=128, epochs=10)

print("model prediction")
test_loss,test_acc=model.evaluate(x=x_test,y=y_test)
print("Test Accuracy %.2f"%test_acc)

3. 通过Sequential模型

### 3. 通过Sequential模型
## 超参数设置

#FILTERS_1 = 32
#KERNEL_SIZE_1 = 5
#STRIDES_1 = (1,1)

#FILTERS_2 = 64
#KERNEL_SIZE_2 = 4
#STRIDES_2 = (2,2)

#POOL_SIZE = (2,2)
#DROPOUT_RATE = 0.25

#DENSE_UNIT_NUM_1 = 128
#DENSE_UNIT_NUM_2 = 10

#BATCH_SIZE = 128
#EPOCHS_NUM=100

## 全连接
def mnist_net(input_shape):
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Flatten(input_shape=input_shape))           #输出层
    model.add(tf.keras.layers.Dense(units=128, activation=tf.nn.relu))    #隐含层
    model.add(tf.keras.layers.Dense(units=10, activation=tf.nn.softmax))  #输出层
    return model

## 卷积神经网络
def mnist_cnn(input_shape):
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Conv2D(filters=32,kernel_size = 5,strides = (1,1),
                                    padding = 'same',activation = tf.nn.relu,input_shape = input_shape))
    # kernel_size = (5,5)
    model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2), strides = (2,2), padding = 'valid'))
    model.add(tf.keras.layers.Conv2D(filters=64,kernel_size = 3,strides = (1,1),padding = 'same',activation = tf.nn.relu))
    model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2), strides = (2,2), padding = 'valid'))
    model.add(tf.keras.layers.Dropout(0.25))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(units=128,activation = tf.nn.relu))
    model.add(tf.keras.layers.Dropout(0.25))
    model.add(tf.keras.layers.Dense(units=10,activation = tf.nn.softmax))
    return model

#模型训练与预测
my_model = mnist_net(input_shape)
#my_model = mnist_cnn(input_shape)

my_model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.001),
                  loss="categorical_crossentropy",
                  metrics=['accuracy'])
print("model fit")
my_model.fit(x=x_train,y=y_train,batch_size=64, epochs=10)

print("model prediction")
test_loss,test_acc=my_model.evaluate(x=x_test,y=y_test)
print("Test Accuracy %.2f"%test_acc)

4. 自定义模型类

### 4.通过模型类
## 定义模型类,重写__init__和call函数
class My_model(tf.keras.Model):
    def __init__(self,
                 input_shape,
                 l1=True,
                 l2=False,
                 kernel_size_1=5,
                 coefficient=0.01,
                 drop_rate=0.1,
                 hidden_dim=128,
                 feature_dim=10):
        super(My_model, self).__init__()
        tf.keras.backend.set_floatx('float64')
        self.l1 = tf.keras.regularizers.l1(l=coefficient)
        self.l2 = tf.keras.regularizers.l2(l=coefficient)
        self.l1l2 = tf.keras.regularizers.l1_l2(l1=coefficient, l2=coefficient)
        if l1 and l2:
            self.reg = self.l1l2
        else:
            if l1:
                self.reg = self.l1
            elif l2:
                self.reg = self.l2
            else:
                self.reg = None        
        self.conv2D_1 = tf.keras.layers.Conv2D(filters=32,
                                            kernel_size = 5,
                                            strides = (1,1),
                                            padding = 'same',
                                            activation = tf.nn.relu,
                                            input_shape = input_shape)
        self.maxPool2D_1 = tf.keras.layers.MaxPool2D(pool_size=(2,2), 
                                                  strides = (2,2), 
                                                  padding = 'valid')
        self.conv2D_2 = tf.keras.layers.Conv2D(filters=64,
                                            kernel_size = 3,
                                            strides = (1,1),
                                            padding = 'same',
                                            activation = tf.nn.relu,
                                            input_shape = input_shape)
        self.maxPool2D_2 = tf.keras.layers.MaxPool2D(pool_size=(2,2), 
                                                  strides = (2,2), 
                                                  padding = 'valid')
        self.dropout = tf.keras.layers.Dropout(drop_rate)
        self.flatten = tf.keras.layers.Flatten()
        self.dense = tf.keras.layers.Dense(hidden_dim,
                                            activation=tf.nn.relu,
                                            kernel_regularizer=self.reg)
        self.final_output = tf.keras.layers.Dense(units=10,activation = tf.nn.softmax)

    def call(self,x_input):
        # 第一次特征提取
        x = self.conv2D_1(x_input)
        x = self.maxPool2D_1(x)
        # 第一次特征提取
        x = self.conv2D_2(x)
        x = self.maxPool2D_2(x)
        # dropout提高模型的泛化
        x = self.dropout(x)
        # 两层全连接
        features1 = self.flatten(x)
        features2 =  self.dense(features1)
        model_output = self.final_output(features2)
        # return model_output,features1,features2 # 返回多个值,无法用model.fit
        return model_output

my_model = My_model(input_shape,
                    l1=True,
                    l2=False,
                    kernel_size_1=5,
                    coefficient=0.01,
                    drop_rate=0.1,
                    hidden_dim=128,
                    feature_dim=10)

my_model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.001),
                  loss="categorical_crossentropy",
                  metrics=['accuracy'])
print(y_train.shape)
print("model fit")
my_model.fit(x=x_train,y=y_train,batch_size=512, epochs=3)

print("model prediction")
test_loss,test_acc=my_model.evaluate(x=x_test,y=y_test)
print("Test Accuracy %.2f"%test_acc)

## 定义模型训练函数(对于复杂模型,需要手动定义损失函数和模型训练方法)
import math
## 定义损失函数
# 当损失函数比较复杂时,该函数很有必要
def get_loss(y_pre,y_input):
    cce = tf.keras.losses.CategoricalCrossentropy()
    all_loss = cce(y_pre,y_input)
    return all_loss

    
## 定义梯度计算函数
def get_grad(model, x_input, y_input):
    with tf.GradientTape() as tape:
        model_output = model(x_input)
        all_loss = get_loss(model_output,y_input)  # 调用get_loss函数
        grads = tape.gradient([all_loss],model.trainable_variables)
    return all_loss, grads

    
## 定义训练函数
def train_model(model,
                x_train,
                y_train,
                batch_size=512,
                optimizer=tf.optimizers.Adam(learning_rate=0.001),
                num_epochs=5):
    # 确定stop条件
    for epoch in range(1,num_epochs+1):
        print("Epoch {}/{}".format(epoch,num_epochs))
        step = 0
        step_num = math.ceil(len(x_train)/batch_size)
        for x in range(0, len(x_train), batch_size):
            step += 1
            x_inp = x_train[x: min(len(x_train),x + batch_size)]
            y_inp = y_train[x: min(len(x_train),x + batch_size)]           
            all_loss, grads = get_grad(model, x_inp, y_inp)      
            optimizer.apply_gradients(zip(grads, model.trainable_variables))
            print("\r", end="")
            print ("{}/{}".format(step,step_num),end=" ")
            print("loss:", all_loss.numpy())
            
            # 打印进度条
            #print("\r", end="")
            #print("{}/{} [".format(step,step_num),"=" * (step//2), end="")
            
    return model

my_model = My_model(input_shape,
                    l1=True,
                    l2=False,
                    kernel_size_1=5,
                    coefficient=0.01,
                    drop_rate=0.1,
                    hidden_dim=128,
                    feature_dim=10)

trained_model = train_model(my_model,x_train,y_train,num_epochs=3)
print("training is over.")

# 模型在测试集上的表现
y_test_pre = trained_model(x_test)
test_loss = get_loss(y_test_pre,y_test)  # 调用get_loss函
print("Test Loss %.2f"%test_loss)
test_acc=tf.keras.metrics.CategoricalAccuracy()(y_test_pre,y_test)
print("Test Accuracy %.2f"%test_acc)

参考:

https://tensorflow.google.cn/api_docs/python/tf/keras?hl=en

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要安装tensorflow.keras.layers,需要先安装TensorFlow。可以通过以下步骤安装: 1. 首先,确保已经安装了Python。如果没有安装,可以从官方网站下载并安装Python的最新版本。 2. 接下来,使用pip(Python管理工具)安装TensorFlow。在命令行中输入以下命令: ``` pip install tensorflow ``` 3. 等待安装完成后,就可以开始使用TensorFlow了。 4. 安装完成后,可以在Python环境中导入TensorFlow并开始使用其提供的工具和功能: ```python import tensorflow as tf ``` 5. tensorflow.keras.layers是TensorFlow的一个子模块,它提供了一组用于构建神经网络层的工具。在TensorFlow 2.0及以上的版本中,Keras已经被整合到TensorFlow中,所以可以直接使用`tensorflow.keras`来导入相关模块。 ```python from tensorflow.keras.layers import Dense, Activation, Conv2D ``` 通过这种方式就可以导入tensorflow.keras.layers模块,并开始使用其中提供的函数和类。 总结起来,安装tensorflow.keras.layers的步骤如下: 1. 安装Python; 2. 使用pip安装TensorFlow; 3. 导入并使用tensorflow.keras.layers模块。 ### 回答2: 安装tensorflow.keras.layers可以通过以下步骤进行: 1. 首先,你需要安装好TensorFlow,因为tensorflow.keras.layers是TensorFlow的一部分。你可以在TensorFlow的官方网站上找到安装指南,并根据你的操作系统选择合适的安装方式。 2. 安装好TensorFlow后,你就可以开始使用tensorflow.keras.layers了。tensorflow.keras.layers可以通过Python的pip管理器进行安装。我们可以在终端或命令提示符中运行以下命令来安装tensorflow.keras.layers: ``` pip install tensorflow ``` 3. 安装完成后,你可以导入tensorflow.keras.layers来开始使用它。在Python的代码中,你可以使用以下语句导入tensorflow.keras.layers: ```python from tensorflow.keras import layers ``` 现在你可以使用tensorflow.keras.layers中的各种层来构建神经网络模型了。具体的使用方法和示例可以参考TensorFlow的官方文档和教程。 总结起来,安装tensorflow.keras.layers的步骤括安装TensorFlow和使用pip安装tensorflow.keras。安装完成后,你可以通过导入tensorflow.keras.layers来使用它。 ### 回答3: 要安装tensorflow.keras.layers,首先需要确保已经安装了TensorFlowTensorFlow是一个开源的机器学习框架,提供了一系列用于构建训练深度学习模型的工具和库。 安装TensorFlow的方法有多种,可以使用pip命令在终端中执行以下命令安装最新版本的TensorFlow: ``` pip install tensorflow ``` 如果你使用的是Anaconda环境,可以使用下面的命令安装TensorFlow: ``` conda install tensorflow ``` 安装完成后,就可以使用tensorflow.keras.layers了。它是TensorFlow中用于构建神经网络模型的一部分。 要使用tensorflow.keras.layers,可以在Python代码中导入相关的模块: ```python from tensorflow import keras from tensorflow.keras import layers ``` 然后,就可以开始使用tensorflow.keras.layers中的各种层来构建你的神经网络了。这个模块提供了许多常用的神经网络层,如全连接层、卷积层、池化层等,以及激活函数和正则化操作等。 ```python # 创建一个模型 model = keras.Sequential() # 添加层到模型中 model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(train_data, train_labels, epochs=10, batch_size=32) # 使用模型进行预测 predictions = model.predict(test_data) ``` 以上是一个简单的例子,展示了如何使用tensorflow.keras.layers构建、编译和训练一个神经网络模型。当然,tensorflow.keras.layers还有更多的功能和用法,可以根据具体需求进行学习和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值