精华内容
下载资源
问答
  • keras:构建多输入多输出模型、多输入输出模型

    万次阅读 多人点赞 2019-09-10 10:58:51
    一个具有两个输入和两个输出的模型: 我们试图预测 Twitter 上的一条新闻标题有多少转发和点赞数。模型的主要输入将是新闻标题本身,即一系列词语,但是为了增添趣味,我们的模型还添加了其他的辅助输入来接收额外的...

    一个具有两个输入和两个输出的模型:

    我们试图预测 Twitter 上的一条新闻标题有多少转发和点赞数。模型的主要输入将是新闻标题本身,即一系列词语,但是为了增添趣味,我们的模型还添加了其他的辅助输入来接收额外的数据,例如新闻标题的发布的时间等。 该模型也将通过两个损失函数进行监督学习。较早地在模型中使用主损失函数,是深度学习模型的一个良好正则方法。
    模型结构如下图所示:
    在这里插入图片描述
    主要输入接收新闻标题本身,即一个整数序列(每个整数编码一个词)。 这些整数在 1 到 10,000 之间(10,000 个词的词汇表),且序列长度为 100 个词。

    from keras.layers import Input, Embedding, LSTM, Dense
    from keras.models import Model
    
    # 标题输入:接收一个含有 100 个整数的序列,每个整数在 1 到 10000 之间。
    # 注意我们可以通过传递一个 "name" 参数来命名任何层。
    main_input = Input(shape=(100,), dtype='int32', name='main_input')
    
    # Embedding 层将输入序列编码为一个稠密向量的序列,
    # 每个向量维度为 512。
    x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
    
    # LSTM 层把向量序列转换成单个向量,
    # 它包含整个序列的上下文信息
    lstm_out = LSTM(32)(x)
    

    在这里,我们插入辅助损失,使得即使在模型主损失很高的情况下,LSTM 层和 Embedding 层都能被平稳地训练。

    auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
    

    此时,我们将辅助输入数据与 LSTM 层的输出连接起来,输入到模型中:

    auxiliary_input = Input(shape=(5,), name='aux_input')
    x = keras.layers.concatenate([lstm_out, auxiliary_input])
    
    # 堆叠多个全连接网络层
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)
    
    # 最后添加主要的逻辑回归层
    main_output = Dense(1, activation='sigmoid', name='main_output')(x)
    

    然后定义一个具有两个输入和两个输出的模型:

    model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])
    

    现在编译模型,并给辅助损失分配一个 0.2 的权重。如果要为不同的输出指定不同的 loss_weights 或 loss,可以使用列表或字典。 在这里,我们给 loss 参数传递单个损失函数,这个损失将用于所有的输出。

    model.compile(optimizer='rmsprop', loss='binary_crossentropy',
                  loss_weights=[1., 0.2])
    

    我们可以通过传递输入数组和目标数组的列表来训练模型:

    model.fit([headline_data, additional_data], [labels, labels],
              epochs=50, batch_size=32)
    

    由于输入和输出均被命名了(在定义时传递了一个 name 参数),我们也可以通过以下方式编译模型:

    model.compile(optimizer='rmsprop',
                  loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},
                  loss_weights={'main_output': 1., 'aux_output': 0.2})
    
    # 然后使用以下方式训练:
    model.fit({'main_input': headline_data, 'aux_input': additional_data},
              {'main_output': labels, 'aux_output': labels},
              epochs=50, batch_size=32)
    

    多输入单输出模型(共享网络层)

    来考虑推特推文数据集。我们想要建立一个模型来分辨两条推文是否来自同一个人(例如,通过推文的相似性来对用户进行比较)。

    实现这个目标的一种方法是建立一个模型,将两条推文编码成两个向量,连接向量,然后添加逻辑回归层;这将输出两条推文来自同一作者的概率。模型将接收一对对正负表示的推特数据。

    由于这个问题是对称的,编码第一条推文的机制应该被完全重用来编码第二条推文(权重及其他全部)。这里我们使用一个共享的 LSTM 层来编码推文。

    让我们使用函数式 API 来构建它。首先我们将一条推特转换为一个尺寸为 (280, 256) 的矩阵,即每条推特 280 字符,每个字符为 256 维的 one-hot 编码向量 (取 256 个常用字符)。

    import keras
    from keras.layers import Input, LSTM, Dense
    from keras.models import Model
    
    tweet_a = Input(shape=(280, 256))
    tweet_b = Input(shape=(280, 256))
    

    要在不同的输入上共享同一个层,只需实例化该层一次,然后根据需要传入你想要的输入即可:

    # 这一层可以输入一个矩阵,并返回一个 64 维的向量
    shared_lstm = LSTM(64)
    
    # 当我们重用相同的图层实例多次,图层的权重也会被重用 (它其实就是同一层)
    encoded_a = shared_lstm(tweet_a)
    encoded_b = shared_lstm(tweet_b)
    
    # 然后再连接两个向量:
    merged_vector = keras.layers.concatenate([encoded_a, encoded_b], axis=-1)
    
    # 再在上面添加一个逻辑回归层
    predictions = Dense(1, activation='sigmoid')(merged_vector)
    
    # 定义一个连接推特输入和预测的可训练的模型
    model = Model(inputs=[tweet_a, tweet_b], outputs=predictions)
    
    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    model.fit([data_a, data_b], labels, epochs=10)
    

    层「节点」的概念

    每当你在某个输入上调用一个层时,都将创建一个新的张量(层的输出),并且为该层添加一个「节点」,将输入张量连接到输出张量。当多次调用同一个图层时,该图层将拥有多个节点索引 (0, 1, 2…)。

    在之前版本的 Keras 中,可以通过 layer.get_output() 来获得层实例的输出张量,或者通过 layer.output_shape 来获取其输出形状。现在你依然可以这么做(除了 get_output() 已经被 output 属性替代)。但是如果一个层与多个输入连接呢?

    只要一个层仅仅连接到一个输入,就不会有困惑,.output 会返回层的唯一输出:

    a = Input(shape=(280, 256))
    
    lstm = LSTM(32)
    encoded_a = lstm(a)
    
    assert lstm.output == encoded_a
    

    但是如果该层有多个输入,那就会出现问题:

    a = Input(shape=(280, 256))
    b = Input(shape=(280, 256))
    
    lstm = LSTM(32)
    encoded_a = lstm(a)
    encoded_b = lstm(b)
    
    lstm.output
    
    >> AttributeError: Layer lstm_1 has multiple inbound nodes,
    hence the notion of "layer output" is ill-defined.
    Use `get_output_at(node_index)` instead.
    

    好吧,通过下面的方法可以解决:

    assert lstm.get_output_at(0) == encoded_a
    assert lstm.get_output_at(1) == encoded_b
    

    input_shape 和 output_shape 这两个属性也是如此:只要该层只有一个节点,或者只要所有节点具有相同的输入/输出尺寸,那么「层输出/输入尺寸」的概念就被很好地定义,并且将由 layer.output_shape / layer.input_shape 返回。但是比如说,如果将一个 Conv2D 层先应用于尺寸为 (32,32,3) 的输入,再应用于尺寸为 (64, 64, 3) 的输入,那么这个层就会有多个输入/输出尺寸,你将不得不通过指定它们所属节点的索引来获取它们:

    a = Input(shape=(32, 32, 3))
    b = Input(shape=(64, 64, 3))
    
    conv = Conv2D(16, (3, 3), padding='same')
    conved_a = conv(a)
    
    # 到目前为止只有一个输入,以下可行:
    assert conv.input_shape == (None, 32, 32, 3)
    
    conved_b = conv(b)
    # 现在 `.input_shape` 属性不可行,但是这样可以:
    assert conv.get_input_shape_at(0) == (None, 32, 32, 3)
    assert conv.get_input_shape_at(1) == (None, 64, 64, 3)
    
    展开全文
  • keras多输入多输出模型

    千次阅读 2019-05-20 19:18:37
    keras多输入多输出模型 主要输入(main_input): 新闻标题本身,即一系列词语。 辅助输入(aux_input): 接受额外的数据,例如新闻标题的发布时间等。 该模型将通过两个损失函数进行监督学习。 较早地在模型中使用主...

    keras多输入多输出模型

    主要输入(main_input): 新闻标题本身,即一系列词语。
    辅助输入(aux_input): 接受额外的数据,例如新闻标题的发布时间等。

    • 该模型将通过两个损失函数进行监督学习。
    • 较早地在模型中使用主损失函数,是深度学习模型的一个良好正则方法。

    完整过程图示如下:
    在这里插入图片描述
    其中,红圈中的操作为将辅助数据与LSTM层的输出连接起来,输入到模型中。

    过程实现代码:

    import keras
    from keras.layers import Input, Embedding, LSTM, Dense
    from keras.models import Model
    
    # 定义网络模型 
    # 标题输入:接收一个含有 100 个整数的序列,每个整数在 1 到 10000 之间
    # 注意我们可以通过传递一个 `name` 参数来命名任何层
    main_input = Input(shape=(100,), dtype='int32', name='main_input')
    
    # Embedding 层将输入序列编码为一个稠密向量的序列,每个向量维度为 512
    x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
    
    # LSTM 层把向量序列转换成单个向量,它包含整个序列的上下文信息
    lstm_out = LSTM(32)(x)
    
    # 在这里我们添加辅助损失,使得即使在模型主损失很高的情况下,LSTM层和Embedding层都能被平稳地训练
    auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
    
    # 此时,我们将辅助输入数据与LSTM层的输出连接起来,输入到模型中
    auxiliary_input = Input(shape=(5,), name='aux_input')
    x = keras.layers.concatenate([lstm_out, auxiliary_output])
    
    # 再添加剩余的层
    # 堆叠多个全连接网络层
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)
    
    # 最后添加主要的逻辑回归层
    main_output = Dense(1, activation='sigmoid', name='main_output')(x)
    
    # 定义这个具有两个输入和输出的模型
    model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])
    
    # 编译模型时候分配损失函数权重:编译模型的时候,给 辅助损失 分配一个0.2的权重
    model.compile(optimizer='rmsprop', loss='binary_crossentropy', loss_weights=[1., 0.2])
    
    # 训练模型:我们可以通过传递输入数组和目标数组的列表来训练模型
    model.fit([headline_data, additional_data], [labels, labels], epochs=50, batch_size=32)
    
    # 另外一种利用字典的编译、训练方式
    # 由于输入和输出均被命名了(在定义时传递了一个 name 参数),我们也可以通过以下方式编译模型
    model.compile(optimizer='rmsprop',
                  loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},
                  loss_weights={'main_output': 1., 'aux_output': 0.2})
    # 然后使用以下方式训练:
    model.fit({'main_input': headline_data, 'aux_input': additional_data},
              {'main_output': labels, 'aux_output': labels},
              epochs=50, batch_size=32)
    
    

    参考资料:

    keras入门多输入多输出模型

    展开全文
  • keras 多输入多输出网络

    万次阅读 2018-03-15 16:34:27
    keras中的多输入多输出网络 多输入多输出网络搭建的官网介绍: http://keras-cn.readthedocs.io/en/latest/getting_started/functional_API/ Demo: from keras.applications.mobilenet import MobileNet from...

    keras中的多输入多输出网络

    多输入多输出网络搭建的官网介绍:
    http://keras-cn.readthedocs.io/en/latest/getting_started/functional_API/

    Demo:

    from keras.applications.mobilenet import MobileNet
    from keras.applications.inception_v3 import InceptionV3
    from keras.applications.inception_resnet_v2 import InceptionResNetV2
    from keras.applications.vgg19 import VGG19
    from keras.applications.xception import Xception
    
    def generate_model(application, num_class, img_size, pre_weights=None):
        if application == 'InceptionV3':
            base_model = InceptionV3(input_shape=(img_size, img_size, 3),
                                     include_top=False,
                                     weights=pre_weights)
        elif application == 'MobileNet':
            base_model = MobileNet(input_shape=(img_size, img_size, 3),
                                   include_top=False,
                                   weights=pre_weights)
        elif application == 'VGG19':
            base_model = VGG19(input_shape=(img_size, img_size, 3),
                               weights=pre_weights,
                               include_top=None)
        elif application == 'InceptionResNetV2':
            base_model = InceptionResNetV2(input_shape=(img_size, img_size, 3),
                                           weights=pre_weights,
                                           include_top=None)
        elif application == 'Xception':
            base_model = Xception(input_shape=(img_size, img_size, 3),
                                  weights=pre_weights,
                                  include_top=None)
        else:
            raise ('No specific aplication type!')
    
        x = base_model.output
        feature = Flatten(name='feature')(x)
        predictions = Dropout(0.5)(feature)
        #x = GlobalAveragePooling2D()(x)
        #predictions = Dense(1024, activation='relu')(x)
        predictions = Dense(num_class, activation='softmax',
                            name='pred',
                            kernel_initializer=RandomNormal(mean=0.0, stddev=0.001))(predictions)
        model = Model(inputs=base_model.input, outputs=[predictions, feature])
        #Model.summary(model)
        return model

    该函数基于keras自带的分类网络,定义了一个单输入双输出的网络
    - 输入:(img_size, img_size, 3)的三通道图像
    - 输出1:softmax后输出的分类类别,损失函数为多分类交叉熵,输出accuracy
    - 输出2:softmax前模型输出的特征向量,损失函数为自定义的Triplet loss

    展开全文
  • 大家所熟悉的机器学习算法的回归结果通常就是一个变量,而最近项目中遇到一个问题,希望利用多输入变量预测多输出变量,也就是multiple input -multiple output。拿到这个问题,我的思路有两个,一个是利用神经网络...

    大家所熟悉的机器学习算法的回归结果通常就是一个变量,而最近项目中遇到一个问题,希望利用多输入变量预测多输出变量,也就是multiple input -multiple output。拿到这个问题,我的思路有两个,一个是利用神经网络算法,毕竟其自身的构造特点就是多输入多输出;另一个是对每一个输出变量构造回归模型,有几个输出就有几个回归模型,当然最好都用同一种算法。在自己思考过后,在网上查阅了资料发现,原来处理多输入多输出回归问题,还有其它高效的处理办法。
    具体操作见文献1,具体操作都以python中的sklearn为例,不再赘述,这里仅将该文章中的做法进行归纳。
    一、固有的多输出回归算法
    以下算法(不局限于列举内容)自身支持多输出回归预测,无需改造。
    1、线性回归
    2、K近邻
    3、随机森林
    二、包装器多输出回归算法
    以下方法需要对现有算法进行适当加工后,实现多输出回归。
    1、每个输出的单独模型
    其思想与我的第一种想法一致,直接借助python中的MultiOutputRegressor即可轻松实现。
    2、每个输出的链接模型
    其核心思想是创建线性模型序列,即:序列中的第一个模型使用输入并预测一个输出。第二模型使用第一模型的输入和输出进行预测;第三个模型使用前两个模型的输入和输出进行预测,依此类推。
    使用scikit-learn库中的RegressorChain类来实现。
    总结:
    有时候当我们遇到一个问题时,我们要勤于思考,有属于自己的一个或者几个想法,之后再尝试查找资料,看别人是怎么处理同类问题的,这个过程能验证我们想法的可行性,或许还能发现更加高效的处理方法。

    参考文献:
    【1】https://zhuanlan.zhihu.com/p/139746972
    【2】https://www.zhihu.com/question/391160005

    展开全文
  • 05_keras入门多输入多输出模型(上)

    万次阅读 多人点赞 2018-07-04 19:17:41
    多输入多输出模型 这里用Keras官方文档的例子来说明如何用Keras实现多输入多输出模型 主要输入(main_input): 新闻标题本身,即一系列词语. 辅助输入(aux_input): 接受额外的数据,例如新闻标题的发布时间等....
  • keras搬砖系列-keras多输入多输出模型

    千次阅读 2018-03-06 17:54:46
    keras搬砖系列-keras多输入多输出模型使用函数式模型的一个典型的场景就是搭建多输入多输出模型。考虑这样一个模型,希望预测一条新闻会被转发和点赞多少次。模型的主要输入是新闻的本身,也就是一个词语的序列,...
  • PyTorch 多输入多输出模型构建

    千次阅读 2020-06-15 20:15:24
    当然你的模型中可能不需要~ out1 = self.predict1(out) out2 = self.predict2(out) return out1, out2 # 多输出!!! net = Net(1, 20, 1) x1 = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # 请不要关心...
  • c语言进行数据的多输入多输出

    万次阅读 2016-04-04 02:42:02
    c语言中有一个标准输入函数,即:scanf函数,它可以读取输入的任意格式类型的数据。scanf函数也有返回值,返回类型为int类型,它返回成功读入的项目的个数。如果它没有读取任何项目(当它期望一个数字而您却键入了一...
  • Keras-多输入多输出任务】

    万次阅读 热门讨论 2018-12-24 16:01:08
    # 输入层 inputs_01 = Input((samples_dim_01,), name='input_1') inputs_02 = Input((samples_dim_02,), name='input_2') # 全连接层 dense_01 = Dense(units=3, name="dense_01", activation='softmax')(inputs_01...
  • 用Sequential只能定义一些简单的模型,如果你想要定义多输入多输出以及共享网络层,就需要使用Model模型了。 声明方法 inputs = Input(shape=(784,)) x = Dense(64, activation='relu')(inputs) x = Dense(64, ...
  • 请问OJ测试代码时是如何输入输出的?C语言如何实现组数据的输出?比如这道题 “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。 现在要求输出所有在m和n范围内的水仙花数。 ...
  • Java输入输出

    万次阅读 多人点赞 2018-05-12 15:27:45
    引言:在平时java开发中,被输入输出搞得头疼。特此写下这篇博客,一是为了总结输入输出,二是为了和大家分享。如果大家觉得写得好,就请高抬贵手点个赞呗!!! 1.输入格式,输出格式控制 1.1输入处理 java的...
  • 1.simulink中的MATLAB function如何实现输入输出端口 解决方案:双击MATLAB function模块,进入其编程界面,定义函数 函数名为fcn,有几个形参,simulink中的模块就会有几个端口,输出端口同样。在我的测试...
  • 请给我个代码做范例,题目要求一次性输入多个字符串,然后对每个字符串进行一些处理,又一次性把处理后的字符串输出,最好能给我个代码做事例。谢谢大神!
  • 多输入通道:当输入数据含有个通道时,我们需要构造一个输入通道数与输入数据通道数相同的卷积核,从而能够与含有输入数据做...多输出通道:通过1乘1卷积核来调整网络层之间的通道数,并控制模型的复杂度。 ...
  • ACM 新手入门 之 如何实现输入输出

    万次阅读 多人点赞 2018-10-16 19:55:30
    一般ACM赛制题目都要求 输入输出 ,我们以 杭电1000题为例:     题目是很简单的 A+B :代码为: #include<stdio.h> int main() { int a,b; scanf("%d%d",&a,&...
  • Java的常用输入输出语句

    万次阅读 多人点赞 2018-04-14 19:03:38
    一、概述 输入输出可以说是计算机的基本功能。作为一种语言体系,java中主要按照流(stream)的模式来实现。其中数据的流向是按照计算机的方向确定的,流入计算机的数据流叫做输入流(inputStream),由计算机发出的...
  • Go-输入输出总结及oj的输入输出

    万次阅读 2021-05-29 17:55:15
    目录 输入 无换行 接口 控制台 字符串 ...fmt部分输入输出函数调用图 oj的输入输出 全部代码 参考 输入 无换行 接口 func Fscan(r io.Reader, a ...interface{}) (n int, err error) .
  • C语言中实现组数据输入输出

    千次阅读 2019-09-22 23:48:13
    C语言中实现组数据输入输出主要有两种方式: 1.首先输入一个n,表示将有n个输入输出,例如: #include <stdio.h> int main() { int n,a; scanf("%d",&n); while(n--){ scanf("%d",&a); printf...
  • logstash配置文件多输入多输出

    万次阅读 2017-08-09 08:47:38
    logstash针对个beat的输入和不同形式输出的设置 网上说可以用设置type来标识,结果没有输出,原因: Beat已经设置了type字段,所以自行设置的type将会被忽略 The Beats shipper automatically sets the ...
  • C++输入输出

    万次阅读 多人点赞 2019-06-11 20:46:05
    在C++的标准库中,将用于进行数据输入输出的类统称为”流类“。cin是流类istream的对象,cout是流类ostream的对象。要使用流类,需要在程序中包含iostream头文件。 C++中常用的几个流类及其2相互关系: 图1中的...
  • Scala:输入输出

    千次阅读 2016-10-23 16:37:51
    http://blog.csdn.net/pipisorry/article/details/52902694Scala基本输入输出从屏幕上读取用户输入有时候我们需要接收用户在屏幕输入的指令来处理程序。实例如下:object Test { def main(args: Array[String]) { ...
  • 单层LSTM和多层LSTM的输入输出

    千次阅读 多人点赞 2020-06-10 11:44:09
    上图是单层LSTM的输入输出结构图。其实它是由一个LSTM单元的一个展开,如下图所示: 所以从左到右的每个LSTM Block只是对应一个时序中的不同的步。 在第一个图中,输入的时序特征有S个,长度记作:seq_len,每个...
  • 输入输出外挂总结

    万次阅读 多人点赞 2016-05-22 05:06:28
    这个问题很明显,一定是因为这些输入输出函数功能过于强大而导致效率低,(很时候,功能越强大的东西越臃肿),而我们使用的输入输出外挂既然叫外挂,那说明其一定有很大的优势,而这方面优势就体现在术有专攻上。...
  • JAVA基础知识和常用算法合集: ... 目录 1.主类的命名必须是Main ...2.输入输出: 2.1输入: (1)使用Scanner类进行输入 (2) hasNext()方法 2.2输出 3快速输入输出 3.1使用StreamTokenizer 和 PrintW...
  • 存储过程(无参,输入参数,输出参数) 存储过程:  1、减少编译次数  2、简化操作  3、减少了变异次数减少了和数据库的链接次数,提高效率  关于存储过程的方法:  1、删除存储过程  DROP ...
  • C语言输入输出语句

    万次阅读 2018-04-27 13:54:03
    一:控制台输入输出 (1)字符数据的输入/输出 字符输出 putchar(ch); 字符输入 getchar(ch); (2)格式化输入/输出 格式输出 printf(“格式控制字符串”,输出列表); 格式输入 scanf(“格式控制字符...
  • c语言文件输入输出

    万次阅读 2017-09-30 11:28:41
    重定向的方法写起来简单、自然,但是不能同时读写文件和标准输入输出;fopen的写法稍有繁琐,但是灵活性比较大(例如可以重复打开并读写文件)。如果想把fopen版的程序改成读写标准输入输出,只需要赋值“fin=stdin;...
  • C语言 基本输入输出函数

    万次阅读 多人点赞 2016-11-03 15:07:57
    1 几组常见的输入输出函数在stdio.h头文件中内置了几种输入输出函数,如下列出: printf 与 scanf getchar 与 putchar gets 与 puts 相比之下 printf 与 scanf的功能最为强大,但操作稍显复杂,后两种则功能简单,...
  • c语言输入输出多个字符串

    万次阅读 2015-01-15 14:01:30
    #include #include int main() { char str[50][50]; char *ps[50];... scanf()函数接受输入以后,回车被保存在输入流中了, 你在scanf()后面加一个getchar()就好了。 这样会吃 掉多余的回车符,后面的g

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,981,513
精华内容 1,592,605
关键字:

多输入多输出