《python深度学习》学习笔记与代码实现(第七章:7.1:不用Sequential模型的解决方案)

python深度学习第七章----高级的深度学习最佳实践

7.1 不用Sequential模型的解决方案

Sequential模型的特点:

1.只有一种输入

例如,我们要同时处理文本数据(全连接层),图片数据(2D卷积层),就不能使用Sequential模型,我们就需要多模态输入,例如,我们的输入数据为元数据,文本描述,图片,来预测一个一个商品的价格,我们就可以将Dense模块,RNN模块,卷积神经网络模块结合起来

2.一种输出

例如,给定一部小说,我们将要他归类,还要预测其写作时间,这时就要两个输出,一个输出用来判别其类别,另一种输出来预测其写作时间

函数式API

from keras.models import Sequential,Model
from keras import layers
from keras import Input

# 之前学习过的Sequential模型
seq_model = Sequential()
seq_model.add(layers.Dense(32,activation = 'relu',input_shape = ((64,))))
seq_model.add(layers.Dense(32,activation = 'relu'))
seq_model.add(layers.Dense(10,activation = 'softmax'))
seq_model.summary()


# 对应的函数式API实现
input_tensor = Input(shape = (64,))
x = layers.Dense(32,activation = 'relu')(input_tensor)
x = layers.Dense(32,activation = 'relu')(x)
output_tensor = layers.Dense(10,activation = 'softmax')(x)

# 后台检索,从输入张量一直到输出张量,检索其每一层,检测输入张量,经过一系列变换,到达输出张量
model = Model(input_tensor,output_tensor)

model.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_4 (Dense)              (None, 32)                2080      
_________________________________________________________________
dense_5 (Dense)              (None, 32)                1056      
_________________________________________________________________
dense_6 (Dense)              (None, 10)                330       
=================================================================
Total params: 3,466
Trainable params: 3,466
Non-trainable params: 0
_________________________________________________________________
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 64)                0         
_________________________________________________________________
dense_7 (Dense)              (None, 32)                2080      
_________________________________________________________________
dense_8 (Dense)              (None, 32)                1056      
_________________________________________________________________
dense_9 (Dense)              (None, 10)                330       
=================================================================
Total params: 3,466
Trainable params: 3,466
Non-trainable params: 0
_________________________________________________________________

多输入模型

举例:一个问答问题,输入为一个问题和所有问题的文本数据集合,输出为一个回答

from keras.models import Model
from keras import layers
from keras import Input
import keras

text_vocabulary_size = 10000
question_vocabulary_size = 10000
answer_vocabulary_size = 500

# 第一个输入
text_input = Input(shape = (None,),dtype = 'int32',name = 'text')  #文本输入是一个长度可变的整数序列
embedded_text = layers.Embedding(text_vocabulary_size,64)(text_input)
encode_text = layers.LSTM(32)(embedded_text)

# 第二个输入
question_input = Input(shape = (None,),dtype = 'int32',name = 'question')
embedded_question = layers.Embedding(question_vocabulary_size,32)(question_input)
encode_question = layers.LSTM(16)(embedded_question)


# 将两个不同的输入,经过不同的网络,得到的结果级联起来
concatenated = layers.concatenate([encode_text,encode_question],axis = -1)

# 最后添加一个softmax分类器
answer = layers.Dense(answer_vocabulary_size,activation = 'softmax')(concatenated)


model = Model([text_input,question_input],answer)
model.compile(optimizer = 'rmsprop',loss = 'categorical_crossentropy',metrics = ['acc'])

# 将数据输入到多输入模型中

import numpy as np
num_samples= 1000
max_length = 100

# 生成虚构的numpy数据
text = np.random.randint(1,text_vocabulary_size,size = (num_samples,max_length))  #参数,low,high,size
question = np.random.randint(1,question_vocabulary_size,size = (num_samples,max_length))
answers = np.random.randint(answer_vocabulary_size,size = (num_samples))
# 回答进行独热编码
answers = keras.utils.to_categorical(answers,answer_vocabulary_size)

# 两种方法进行模型训练
# 1.使用输入组成的列表
model.fit([text,question],answers,epochs = 10,batch_size = 128)

# 2.使用输入组成的字典
model.fit({'text':text,'question':question},answers,epochs = 10,batch_size = 128)
Epoch 1/10
1000/1000 [==============================] - 6s 6ms/step - loss: 6.2141 - acc: 0.0020
Epoch 2/10
1000/1000 [==============================] - 3s 3ms/step - loss: 6.1979 - acc: 0.0420
Epoch 3/10
1000/1000 [==============================] - 3s 3ms/step - loss: 6.1546 - acc: 0.0220
Epoch 4/10
1000/1000 [==============================] - 3s 3ms/step - loss: 6.0582 - acc: 0.0060
Epoch 5/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.9883 - acc: 0.0080
Epoch 6/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.9284 - acc: 0.0080
Epoch 7/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.8564 - acc: 0.0100
Epoch 8/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.7803 - acc: 0.0130
Epoch 9/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.6730 - acc: 0.0160
Epoch 10/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.6041 - acc: 0.0230
Epoch 1/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.5310 - acc: 0.0370
Epoch 2/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.4517 - acc: 0.0410
Epoch 3/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.4116 - acc: 0.0430
Epoch 4/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.3387 - acc: 0.0530
Epoch 5/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.2483 - acc: 0.0550
Epoch 6/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.2013 - acc: 0.0540
Epoch 7/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.1401 - acc: 0.0740
Epoch 8/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.0840 - acc: 0.0900
Epoch 9/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.0057 - acc: 0.0870
Epoch 10/10
1000/1000 [==============================] - 3s 3ms/step - loss: 4.9580 - acc: 0.0920

多输出模型

一个网络,同时预测数据的不同性质

from keras import layers
from keras import Input
from keras.models import Model

vocabulary_size = 50000
num_income_groups = 10

posts_input = Input(shape = (None,),dtype = 'int32',name = 'posts')
embedded_posts = layers.Embedding(256,vocabulary_size)(posts_input)
x = layers.Conv1D(128,5,activation = 'relu')(embedded_posts)
x = layers.MaxPooling1D(5)(x)

x = layers.Conv1D(256,5,activation = 'relu')(x)
x = layers.Conv1D(256,5,activation = 'relu')(x)
x = layers.MaxPooling1D(5)(x)

x = layers.Conv1D(256,5,activation = 'relu')(x)
x = layers.Conv1D(256,5,activation = 'relu')(x)
x = layers.GlobalMaxPooling1D()(x)

age_prediction = layers.Dense(1,name = 'age')(x)

income_prediction = layers.Dense(num_income_groups,activation = 'softmax',name = 'income')(x)

gender_prediction = layers.Dense(1,activation = 'sigmoid',name = 'gender')(x)

model = Model(posts_input,[age_prediction,income_prediction,gender_prediction])

# 将不同预测的损失加在一起,组成一个全局损失,优化这个全局损失

# 两种方法编译模型
# 1.列表级联,还可以给不同的损失加上不同的权重
model.compile(optimizer = 'rmsprop',
              loss = ['mse','categorical_crossentropy','binary_crossentropy'],
              loss_weights = [0.25,1.0,10.])

# 2.用字典
model.compile(optimizer = 'rmsprop',
              loss = {'age':'mse','income':'categorical_crossentropy','gender':'binary_crossentropy'},
             loss_weights = {'age':0.25,'income':1.,'gender':10.})


# 训练模型
# 
model.fit(posts,[age_targets,income_targets,gender_targets],epochs = 10,batch_size = 64)

model.fit(posts,{'age':age_targets,'income':income_targets.'gender':gender_targets},epochs = 10,batch_size = 64)

层组成的有向无环图

# 1. Inception模块,一个输入,多个分支,一个输出
from keras import layers

x = Input(shape = (None,None,10))
branch_a = layers.Conv2D(128,1,activation = 'relu',strides = 2)(x)

branch_b = layers.Conv2D(128,1,activation = 'relu')(x)
branch_b = layers.Conv2D(128,3,activation = 'relu',strides = 2)(branch_b)

branch_c = layers.AveragePooling2D(3,strides = 2)(x)
branch_c = layers.Conv2D(128,3,activation = 'relu')(branch_c)

branch_d = layers.Conv2D(128,1,activation = 'relu')(x)
branch_d = layers.Conv2D(128,3,activation = 'relu')(branch_d)
branch_d = layers.Conv2D(128,3,activation = 'relu',strides = 2)(branch_d)

# 将不同的分支得到的结果级联起来oo
output = layers.concatenate([branch_a,branch_b,branch_c,branch_d],axis = -1)

# 2.残差连接
# 假设输入张量是4维的

from keras import layers
# 特征图尺寸相同
x = ...
y = layers.Conv2D(128,3,activation = 'relu',padding = 'same')(x)
y = layers.Conv2D(128,3,activation = 'relu',paddingg = 'same')(y)
y = layers.Conv2D(128,3,activation = 'relu',padding = 'same')(y)

y = layers.add([y,x])  # 将原始x与输出y相加


# 特征图尺寸不同
x = ...
y = layers.Conv2D(128,3,activation = 'relu',padding = 'same')(x)
y = layers.Conv2D(128,3,activation = 'relu',paddingg = 'same')(y)
y = layers.MaxPooling2D(2,strides = 2)(y)

residual = layers.Conv2D(128,1,strides = 2,padding = 'same')(x)

y = layers.add([y,residual])

共享层权重

from keras import layers
from keras import Input
from keras.models import Model

lstm = layers.LSTM(32)

left_input = Input(shape = (None,128))
left_output = lstm(left_input)

right_input = Input(shape= (None,128))
right_output = lstm(right_input)

merged = layers.concatenate([left_output,right_output],axis = -1)
predictions = layers.Dense(1,activation = 'sigmoid')(megred)

model = Model([left_input,right_input],predictions)
model.fit([left_data,right_data],targets)

# 一个层实例可能被多次重复使用,它可以被调用任意多次,每次都重复使用一组相同的权重

将模型作为层来调用

# 模型可以看作是更大的层
from keras import layers
from keras import applications
from keras import Input

# 这是一个自带的模型
xception_base = applications.Xception(weights = None,include_top = False)

left_input = Input(shape = (250,250,3))
right_input = Input(shape = (250,250,3))

left_features = xception_base(left_input)
right_features = xception_base(right_input)

megred_features = layers.concatenate([left_features,right_features],axis = -1)

小结

1.如果你需要实现的架构不仅仅是层的线性堆叠,就不要局限于sequential API

2.使用Keras函数式API来构建多输入模型,多输出模型,和具有复杂的内部网络拓扑结构的模型

3.通过多西调用相同的层实例或者模型实例,

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种非常流行的编程语言,尤其在数据处理和深度学习领域中应用广泛。在本文中,我们将介绍Python中的一些常用数据处理方法和深度学习技术,并提供代码示例。 数据处理方法 1. 数据清洗 数据清洗是指将原始数据转换为可用于分析和建模的数据。数据清洗通常包括以下几个方面: - 缺失值处理:删除或填充缺失值 - 异常值处理:检测和处理异常值 - 数据类型转换:将数据转换为适合分析的类型 - 去重处理:删除重复行或列 以下是一个简单的数据清洗示例,其中我们使用Pandas库来处理数据: ```python import pandas as pd # 读取数据 df = pd.read_csv('data.csv') # 删除缺失值 df.dropna(inplace=True) # 检测和处理异常值 df = df[df['age'] > 0] # 数据类型转换 df['age'] = df['age'].astype(int) # 删除重复行 df.drop_duplicates(inplace=True) # 保存清洗后的数据 df.to_csv('cleaned_data.csv', index=False) ``` 2. 特征工程 特征工程是指从原始数据中提取有用的特征来描述数据。特征工程通常包括以下几个方面: - 特征选择:选择最相关的特征 - 特征提取:从原始数据中提取有用的特征 - 特征转换:将特征转换为适合分析的形式 以下是一个简单的特征工程示例,其中我们使用Scikit-learn库来处理数据: ```python import pandas as pd from sklearn.feature_selection import SelectKBest, f_classif # 读取数据 df = pd.read_csv('data.csv') # 特征选择 X = df.drop('label', axis=1) y = df['label'] selector = SelectKBest(score_func=f_classif, k=10) X_new = selector.fit_transform(X, y) # 特征提取 from sklearn.decomposition import PCA pca = PCA(n_components=2) X_new = pca.fit_transform(X) # 特征转换 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_new = scaler.fit_transform(X) ``` 深度学习技术 1. 神经网络 神经网络是一种模仿生物神经网络工作方式的计算模型,通常用于分类、回归等任务。以下是一个简单的神经网络示例,其中我们使用Keras库来构建神经网络: ```python import numpy as np import keras from keras.models import Sequential from keras.layers import Dense # 生成数据 X = np.random.rand(1000, 10) y = np.random.randint(0, 2, size=(1000, 1)) # 构建神经网络 model = Sequential() model.add(Dense(32, activation='relu', input_dim=10)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy']) # 训练神经网络 model.fit(X, y, epochs=10, batch_size=32) # 预测新数据 X_new = np.random.rand(10) y_pred = model.predict(X_new.reshape(1, -1)) ``` 2. 卷积神经网络 卷积神经网络是一种特殊的神经网络,通常用于图像识别和语音识别等任务。以下是一个简单的卷积神经网络示例,其中我们使用Keras库来构建卷积神经网络: ```python import numpy as np import keras from keras.models import Sequential from keras.layers import Dense, Conv2D, MaxPooling2D, Flatten # 生成数据 X = np.random.rand(1000, 28, 28, 1) y = np.random.randint(0, 10, size=(1000, 1)) # 构建卷积神经网络 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(10, activation='softmax')) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # 训练卷积神经网络 y_one_hot = keras.utils.to_categorical(y, 10) model.fit(X, y_one_hot, epochs=10, batch_size=32) # 预测新数据 X_new = np.random.rand(28, 28, 1) y_pred = model.predict(X_new.reshape(1, 28, 28, 1)) ``` 总结 本文介绍了Python中常用的数据处理方法和深度学习技术,并提供了相应的代码示例。这些技术可以帮助您更好地处理和分析数据,以及构建更准确和有效的深度学习模型

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值