tensorflow自定义结构初步

本文探讨了在 TensorFlow 中自定义模型和优化器的步骤,包括数据准备、自定义层、模型构建、优化器创建以及训练和评估过程。通过实例展示了如何在不使用预定义 API 的情况下,实现神经网络的训练流程。
摘要由CSDN通过智能技术生成

0.摘要

对输入值x,标签y,模型参数c,我们希望习得一个最优的Model-c满足y=Model(x,c)。机器学习的任务就是要确定这个Model中的参数。但是因为Model的形状(如层数,节点个数等)是离散的,处理起来相对麻烦,所以我们在这里只讨论可导的参数c(tensorflow的一个优势就在于可以自动求导)。我们希望对于一个确定确定的模型Model,我们要找到这样的c满足c=argmin(loss),其中loss表示损失函数,如loss=sum(square(y-Model(x,c)))。我们算到这一步之后,可以再根据loss对各参数的偏导用梯度下降法更新梯度,也就是我们的学习过程,更新所用的对象为optimizer。

简而言之,训练分为如下几步:

1.y_pred=Model(x,c)
2.L=loss(y_pred,y)
3.g=optimizer(DL/Dc)
4.c=c-g

在下文中,Section1介绍了如何准备测试数据(傻瓜下载法);Section2,3介绍了如何构造一个训练用的Model。这个Model,就是我们在tensorflow中直接用于训练的对象。在深度学习中,这个Model就是神经网络,而神经网络又由许多层状结构组成,这就是我们构造过程中的次级对象layer;Section4介绍了如何构造一个Optimizer;Section5是训练的过程;Section6则是数据评估。

Talk is cheap,先从引入必要的库开始。

#引入库,开启eager模式
import tensorflow as tf
import numpy as np
tf.enable_eager_execution()

1.数据准备

__init____call__
下载名为mnist的数据库,并且分出4块从训练集中随机抽取batch_size个训练数据
class DataLoader():
    def __init__(self):
        mnist=tf.contrib.learn.datasets.load_dataset("mnist")
        self.train_data=mnist.train.images
        self.train_label=np.asarray(mnist.train.labels,dtype=np.int32)
        self.eval_data = mnist.test.images
        self.eval_labels = np.asarray(mnist.test.labels, dtype=np.int32)
    def __call__(self,batch_size):
        index=np.random.randint(np.shape(self.train_data)[0],size=batch_size)
        return self.train_data[index,:],self.train_label[index]

2.自定义层

__init____call__
构造一个确定输入输入的全连接层,并生成对应初始数据用该层对输入值X进行计算并返回计算值
class FullConnectedLayer(tf.keras.layers.Layer):
    def __init__(self,input_num,output_num):
        super().__init__()
        self.output_num=output_num
        self.input_num=input_num
        self.w=self.add_variable(name='w',shape=[self.input_num,self.output_num],initializer=tf.random_uniform_initializer(minval=0.,maxval=0.1))
        self.b=self.add_variable(name='b',shape=[1,self.output_num],initializer=tf.random_uniform_initializer(minval=0.,maxval=0.1))
    def __call__(self,X):
        y_pred=tf.nn.sigmoid(tf.matmul(X,self.w)+self.b)
        return y_pred

3.自定义模型

__init____call__predict
继承父类,构造复合层结构用各层计算输入值input,返回预测值利用argmax函数得到对应数据的标签
class MLP(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense1=tf.keras.layers.Dense(100,activation=tf.nn.relu)
        self.dense2=tf.keras.layers.Dense(10)
    def __call__(self,input):
        x=self.dense1(input)
        x=self.dense2(x)
        return x
    def predict(self,input):
        logits=self(input)
        return tf.argmax(logits,axis=-1)

4.自定义优化器

翻来覆去就那么几个,正常情况下直接用api就可以了。特殊情况?你除了用Adam和偶尔用上几次SGD之外还用得着啥?实在不行徒手写一个就行了。其实是懒得写了。

5.训练

#1#2#3
定义超参数实例化模型,数据,优化器用tf.GradientTape()函数自动求导,optimizer和model训练
#1
epoch=1000
batch_size=32
eta=0.003
#2
mlp=MLP()
data_loader=DataLoader()
optimizer=tf.train.AdamOptimizer(learning_rate=eta)
#3
for i in range(epoch):
    X,y=data_loader(batch_size)
    with tf.GradientTape() as tape:
        y_pred=mlp(tf.convert_to_tensor(X))
        L=tf.losses.sparse_softmax_cross_entropy(labels=y,logits=y_pred)
    g=tape.gradient(L,mlp.variables)
    optimizer.apply_gradients(grads_and_vars=zip(g,mlp.variables))

6.评估

y_pred=mlp.predict(data_loader.eval_data).numpy()
print("acc:%f"%(sum(y_pred==data_loader.eval_labels)/np.shape(data_loader.eval_labels)[0]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow中,可以通过自定义损失函数来训练模型。自定义损失函数可以根据具体的问题和需求来设计,以更好地适应模型的训练目标。 下面是一个使用自定义损失函数训练模型的示例代码: ```python import tensorflow as tf def custom_loss(y_true, y_pred): # 自定义损失函数的计算逻辑 loss = tf.square(y_true - y_pred) # 这里以平方差作为损失函数 return loss if __name__ == "__main__": # 定义输入和输出张量 x = tf.constant(\[1., 2., 3.\]) y_true = tf.constant(\[4., 5., 6.\]) # 定义模型 y_pred = tf.Variable(\[0., 0., 0.\]) # 定义损失函数 loss = custom_loss(y_true, y_pred) # 创建一个优化器 optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01) # 定义训练操作 train_op = optimizer.minimize(loss) # 创建一个会话并运行训练操作 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(100): sess.run(train_op) # 打印训练结果 print("Final prediction:", y_pred.eval()) ``` 在上述代码中,我们定义了一个自定义损失函数`custom_loss`,并使用该损失函数来计算模型的损失。然后,我们使用梯度下降优化器来最小化损失,并进行模型的训练。最后,我们打印出训练结果。 请注意,这只是一个简单的示例,实际中的自定义损失函数可能会更加复杂,根据具体的问题和需求进行设计。 #### 引用[.reference_title] - *1* *2* *3* [TensorFlow自定义损失函数](https://blog.csdn.net/sinat_29957455/article/details/78369763)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值