精华内容
下载资源
问答
  • 在前面节我们学习的都是单向的 RNN,单向的结构有个局限,就是在当前时间点上只能利用过去的信息,而无法利用未来的序列信息的,这会影响一些需要上下文背景的任务效果。 例如命名实体识别中,有些名字在某些语境...

    在前面几节我们学习的都是单向的 RNN,单向的结构有个局限,就是在当前时间点上只能利用过去的信息,而无法利用未来的序列信息的,这会影响一些需要上下文背景的任务效果。

    例如命名实体识别中,有些名字在某些语境中也许代表的是玩具的名字,如果不考虑下文,很可能就被识别为人名;或者在手写识别中,知道当前位置的前面和后面是什么样子的,可以更好地判断这是什么字,提高预测准确率;又或者想要预测序列中的缺失值,就不仅要考虑它前面的词,还要考虑后面的词是什么;此外还可以用于语音识别、机器翻译、蛋白质结构预测、词性标注、依赖解析等任务中。

    为了对单向结构的这个局限做出改进,于是就有了双向 RNN。

    什么是双向 RNN

    如上图所示,Bidirectional Recurrent Neural Networks——双向 RNN 就是把两个普通的单向 RNN 叠加在一起,输入序列以正向的时间顺序输入进其中一个网络,再以反向的时间顺序输入进另一个网络,这样就分别从两个方向计算序列的 output 和 state,然后将两个网络的激活值连接起来计算最终的输出值 y,有时也可以用求和的方式,这样在每个时间点,既可以利用之前的序列信息,也可以利用之后的序列信息

    下面我们来举个例子更具体地看一下这个模型:

    例如,我们有 $x_1$ 到 $x_4$ 四个词,想要得到 $t=3$ 时刻的预测值 $y_3$:

    • 首先计算前向的隐藏层单元,我们用右箭头表示前向,用 $x_1$ 计算得到 $h_1$,然后用 $x_2$ 和 $h_1$ 得到 $h_2$,同理得到 $h_3$。
    • 再计算反向的隐藏层单元,用左箭头表示,用 $x_4$ 得到 $h_4$,流到 $x_3$,由 $x_3$ 和 $h_4$ 计算出 $h_3$。注意,反向的这个 RNN 实际上也是在做前向传播,只不过是从序列的末端开始向前输入数据,而且正向的节点和反向的节点是不共用的。
    • 最后可以计算 $t=3$ 时刻的预测值 $y_3$ 了,这时需要将正向 $h_3$ 和 反向 $h_3$ 合在一起。

    用公式表示为:

    $$\overrightarrow{h_t} = f( \overrightarrow{W} x_t + \overrightarrow{V} \overrightarrow{h}_{t-1} + \overrightarrow{b} )$$

    $$\overleftarrow{h_t} = f( \overleftarrow{W} x_t + \overleftarrow{V} \overleftarrow{h}_{t+1} + \overleftarrow{b} )$$

    $$y_t = g( U h_t + c ) = g( U [ \overrightarrow{h_t} ; \overleftarrow{h_t} ] + c )$$

    这样得到的 $y_3$ 既有了过去的信息 $x_1$、$x_2$,和当前的信息 $x_3$,还有未来的信息 $x_4$。

    此外可以看到在 BRNN 这个图中有六个权重,分别为:向前/向后各自的输入层与隐藏层之间的 $(w_1,w_4)$,隐藏层到隐藏层的 $(w_2,w_5)$,隐藏层到输出层的 $(w_3,w_6)$,注意向前和向后两个网络的隐含层之间是没有联系的。

    另外 RNN 的这些单元可以是标准的 RNN,也可以是 GRU、LSTM 单元,在 NLP 任务中比较常用的是 LSTM 单元。

    多层双向 RNN

    双向 RNN 也可以像单向的一样叠加多层,结构如下:

    图片来源:wildml

    从第二层开始,每个神经元接收来自同一层的前一时刻的激活值,和前一层传递过来的两个值,一个是正向得到的,一个是反向得到的。

    用公式表示为:

    $$\overrightarrow{h^i_t} = f( \overrightarrow{W^i} h^{i-1}_t + \overrightarrow{V^i} \overrightarrow{h^i}_{t-1} + \overrightarrow{b^i} )$$

    $$\overleftarrow{h^i_t} = f( \overleftarrow{W^i} h^{i-1}_t + \overleftarrow{V^i} \overleftarrow{h^i}_{t+1} + \overleftarrow{b^i} )$$

    $$y_t = g( U h_t + c ) = g( U [ \overrightarrow{h^L_t} ; \overleftarrow{h^L_t} ] + c )$$

    双向 RNN 的缺点

    双向 RNN 虽然在一些任务上表现优于单向 RNN,但是它也有个限制,就是它需要知道完整的序列数据,才能对任意位置进行预测。例如一个语音识别系统,需要知道整个语音表达,就意味着需要等这个人全部说完,才能开始处理这段语音,所以实际的语音识别系统会有更复杂的结构;同样的在实时翻译中也不能直接用双向的 RNN。不过对于一些可以即时获得整个序列的 NLP 任务,标准的双向 RNN 还是很有效的。

    应用:手写识别

    MNIST 的例子,相信大家已经很熟悉了,相当于图像领域的 Hello World,常用 CNN 等网络对其进行训练学习和预测,其实序列模型也可以用来识别图像,今天我们用双向 RNN 来处理一下,看看其效果。

    我们所用的 MNIST 是一个手写数字的数据集,共有三部分:训练集(mnist.train)55000 个样本,测试集(mnist.test)10000,验证集(mnist.validation)5000 个。

    每个数字的图片已经标准化为 28*28 像素,并被展开为含有 784(28*28)个特征的一维数组,值在 0~1 之间。

    每个图片还有对应的真实数字标签(mnist.train.labels),标签向量长度为 10,以 one-hot 方式表示相应图片代表的真实数字。 我们的任务就是要识别出图片上面的数字。

    整个过程分为下面几步:

    1. 加载数据
    2. 设置参数
    3. 创建输入 x 和学习目标 y 的 placeholder
    4. 随机初始化权重和偏置
    5. 定义 Bidirectional LSTM 网络
    6. 定义损失,优化算法,准确率
    7. 加载测试集用于测试
    8. 定义可视化结果的辅助函数
    9. 训练模型并对结果可视化

    1. 加载数据

    import tensorflow as tf
    import numpy as np 
    from tensorflow.examples.tutorials.mnist import input_data
    
    mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
    

    2. 设置参数

    我们要建立的模型结构如下图所示:

    • MNIST 的每个图片是 28*28 像素,我们将它看成一个长度为 28 的序列,即 n_steps = 28,如图所示,每行数据作为 xt 输入到双向 RNN 中;
    • 这个序列在每个时间点上的输入是长度为 28 的向量,所以 n_inputs = 28
    • 隐藏层单元的维度为 128;
    • 因为这是个分类问题,预测的目标是 0~9 这10个数字,所以有 10 个类别,则输出层维度是 10。
    n_inputs = 28            # 输入层维度
    n_hidden = 128        # 隐含层维度
    n_outputs = 10        # 输出层长度
    n_steps = 28            # RNN 步数
    
    learning_rate = 0.001
    batch_size = 128
    n_epochs = 10
    

    3. 创建输入 x 和学习目标 y 的 placeholder

    每个图片被看作为一个时间序列,第一个维度是时间步 n_step,第二个维度是每个时间点的数据 n_inpts

    x = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
    y = tf.placeholder(tf.float32, [None, n_outputs])
    

    4. 随机初始化权重和偏置

    因为是有两个方向,所以权重维度需要是 2 倍。

    weights = tf.Variable(tf.random_normal([2 * n_hidden, n_outputs]))
    biases = tf.Variable(tf.random_normal([n_outputs]))
    

    5. 下面定义 Bidirectional LSTM 网络

    def BiRNN(x, weights, biases):
    
        # 将维度 [batch_size, timesteps, n_input] 变成长为 time steps 个 [batch_size, num_input],即(28,batch_size,28)
        x = tf.unstack(x, n_steps, 1)
    
        lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden, forget_bias = 1.0)
        lstm_bw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden, forget_bias = 1.0)
    
        # [28,batch_size, n_hidden*2] 即 (28,128,256)
        outputs, _, _ = tf.nn.static_bidirectional_rnn(lstm_fw_cell,
                                                       lstm_bw_cell, 
                                                       x,
                                                       dtype = tf.float32)
    
        return tf.matmul(outputs[-1], weights) + biases
    

    首先,将 x 调整为 RNN 要求的形状:

    当前的维度是 [batch_size, timesteps, n_input],通过 unstack 变成一个 list,长度为 time steps,每个时间点上的形状为 [batch_size, num_input]

    static_bidirectional_rnn 的用法:

    tf.nn.static_bidirectional_rnn 建立一个双向 RNN,它的输入参数为:

    tf.nn.static_bidirectional_rnn(
        cell_fw,                        # 前向 rnn 的 cell
        cell_bw,                         # 反向 rnn 的 cell
        inputs,                         # 输入序列
        initial_state_fw=None,            # 前向rnn_cell的初始状态
        initial_state_bw=None,            # 反向rnn_cell的初始状态
        dtype=None,                        # 初始化和输出的数据类型
        sequence_length=None,            # 输入序列的实际长度(默认为输入序列的最大长度)
        scope=None
    )
    

    在使用时,首先需要定义前向和反向的 RNN 单元 cell_fwcell_bw,正向的就是基本单向 RNN 的实现;反向部分相对复杂一点,它是双向 RNN 的核心所在,在函数内部,会通过两次逆序来达到反向 RNN 的效果:

    • 第一次是将输入序列进行逆序, 输入给单向 RNN,即输入为 $x_t, x_{t-1}, ..., x_2, x_1$,这样得到的输出序列相当于是 $y_t, y_{t-1}, ..., y_2, y_1$,以 $y_2$ 为例,它在反向网络这里就是利用了 $x_3$ 及其后的信息,而在前向网络中 $y_2$ 是利用了 $x_1$ 即其前的信息;
    • 第二次是将单向 RNN 返回的 outputs 再做一次逆序, 使正向和反向的位置是对应的,即 $y_t, y_{t-1}, ..., y_2, y_1$ 变成了 $y_1, y_2, ..., y_{t-1}, y_t$,将相同时刻的来自两个方向的 y 串联起来,例如 $y_2$ 此时就既包括了 $x_1$ 的信息,也包括了 $x_3$ 的信息了。

    函数的返回值是一个 [outputs, output_state_fw, output_state_bw] 元组:

    • 其中 outputs 是一个长度为 timesteps 的 list,每个时间点对应当前的 output。这里每个 output 都是由前向和反向 RNN 的输出叠加串联而成,即 outputs 的形状为 [time][batch][cell_fw.output_size + cell_bw.output_size]
    • 因为是两个方向的结果的叠加,所以维度变为 n_hidden * 2, 即 outputs[:][:][0:n_hidden, :] 对应的是前向 fw, outputs[:][:][n_hidden:n_hidden*2, :] 对应的是反向 bw。

    • 返回值中后面两个 output_state_fw, output_state_bw 分别为前向网络和反向网络的最终状态。

    6. 定义损失,优化算法,准确率

    我们用 tf.nn.softmax_cross_entropy_with_logits_v2 进行 Softmax 处理,再计算交叉熵损失,优化方法用 Adam。

    再用 tf.argmax 取出 pred 向量中值最大的那一个标签作为预测值输出。

    pred = BiRNN(x, weights, biases)
    
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits = pred, labels = y))
    
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
    training_op = optimizer.minimize(cost)
    
    correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    
    init = tf.global_variables_initializer()
    

    7. 加载测试集用于测试

    x_test = mnist.test.images.reshape((-1, n_steps, n_inputs))
    y_test = mnist.test.labels
    

    8. 可视化结果的辅助函数

    import matplotlib.pyplot as plt
    %matplotlib inline
    

    plot_images 用来建立一个 3x3 的图,来显示预测正确的图片:

    images 是要显示的图片,cls_true 是图片对应的真实数字,cls_pred 是预测的数字。

    def plot_images(images, cls_true, cls_pred=None, title=None):
    
        fig, axes = plt.subplots(3, 3, figsize=(9, 9))
        fig.subplots_adjust(hspace=0.3, wspace=0.3)
    
        for i, ax in enumerate(axes.flat):
            # 画图
            ax.imshow(np.squeeze(images[i]).reshape(28, 28), cmap='binary')
    
            # 显示出实际和预测的数字标签
            if cls_pred is None:
                ax_title = "True: {0}".format(cls_true[i])
            else:
                ax_title = "True: {0}, Pred: {1}".format(cls_true[i], cls_pred[i])
    
            ax.set_title(ax_title)
    
            ax.set_xticks([])
            ax.set_yticks([])
    
        if title:
            plt.suptitle(title, size=20)
    
        plt.show(block=False)
    

    plot_example_errors 用来显示预测错误的图片,输入参数的意义同上:

    def plot_example_errors(images, cls_true, cls_pred, title=None):
    
        # 锁定预测错误的那些图片位置
        incorrect = np.logical_not(np.equal(cls_pred, cls_true))
    
        # 获得预测错误的图片
        incorrect_images = images[incorrect]
    
        # 得出这些图片的真实标签和预测标签
        cls_pred = cls_pred[incorrect]
        cls_true = cls_true[incorrect]
    
        # 画出前 9 个图
        plot_images(images=incorrect_images[0:9],
                    cls_true=cls_true[0:9],
                    cls_pred=cls_pred[0:9],
                    title=title)
    

    9. 训练模型并对结果可视化

    with tf.Session() as sess:
        init.run()
    
        for epoch in range(n_epochs): 
    
            for iteration in range(mnist.train.num_examples // batch_size):
    
                # 随机抽出这一次迭代训练时用的数据,(batch_size, 784)
                x_batch, y_batch = mnist.train.next_batch(batch_size)
    
                # 对数据进行处理,使得其符合输入要求,(batch_size, 28, 28)
                x_batch = x_batch.reshape((-1, n_steps, n_inputs))
    
                sess.run(training_op, feed_dict={x: x_batch, y: y_batch})
    
            acc_train = accuracy.eval(feed_dict={x: x_batch, y: y_batch})
            acc_test = accuracy.eval(feed_dict={x: x_test, y: y_test})
    
            print(epoch, "Train accuracy:", acc_train, "Test accuracy:", acc_test)
    
        # 可视化结果,分别展示预测正确的数字,和预测错误的数字
        cls_prediction = tf.argmax(pred, 1)
        feed_dict_test = {x: x_test[:1000].reshape((-1, n_steps, n_inputs)), y: y_test[:1000]}
    
        cls_pred = sess.run(cls_prediction, feed_dict = feed_dict_test)
        cls_true = np.argmax(y_test, axis = 1)
    
        plot_images(x_test, cls_true, cls_pred, title='Correct Examples')
        plot_example_errors(x_test[:1000], cls_true[:1000], cls_pred, title='Misclassified Examples')
        plt.show()
    

    经过 10 轮的学习,BRNN 可以在一些简单的数字上表现良好,如 1 和 2,在复杂的数字上如 5、6、8 就会有较多判断错误。

    用 Keras 建立双向 RNN 模型

    上面是用 TF1 实现的双向 RNN 模型,同样的模型我们再用 TF2 中的 Keras 来搭建一下,基本步骤和参数的设置都是一样的,所以就不赘述了,大家有兴趣可以进行调参或者更换模型等看看会有什么样的效果。

    from __future__ import absolute_import, division, print_function, unicode_literals
    
    import collections
    import matplotlib.pyplot as plt
    import numpy as np
    
    try:
      # %tensorflow_version only exists in Colab.
      %tensorflow_version 2.x
    except Exception:
      pass
    import tensorflow as tf
    
    from tensorflow.keras import layers
    
    import matplotlib.pyplot as plt
    %matplotlib inline
    

    加载数据

    训练集 x_train.shape 是 (60000, 28, 28),测试集 x_test.shape 是 (10000, 28, 28)。

    mnist = tf.keras.datasets.mnist
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_train, x_test = x_train / 255.0, x_test / 255.0
    

    设置超参数

    batch_size = 128
    input_dim = 28
    units = 128
    output_size = 10  
    

    建立模型

    model = tf.keras.Sequential()
    model.add(layers.Bidirectional(layers.LSTM(units, input_shape=(None, input_dim))))
    model.add(layers.Dense(output_size))
    
    model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), 
                  optimizer='adam',
                  metrics=['accuracy'])
    

    训练模型

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

    画出模型的损失和准确率

    print(history.history.keys())
    
    plt.plot(history.history['acc'])
    plt.plot(history.history['val_acc'])
    plt.title('model accuracy')
    plt.ylabel('accuracy')
    plt.xlabel('epoch')
    plt.legend(['train', 'test'], loc='upper left')
    plt.show()
    

    plt.plot(history.history['loss'])
    plt.plot(history.history['val_loss'])
    plt.title('model loss')
    plt.ylabel('loss')
    plt.xlabel('epoch')
    plt.legend(['train', 'test'], loc='upper left')
    plt.show()
    

    从这两个图中我们可以看出在训练 6 轮左右时,模型就可以达到不错的效果了。

    为了更好地对比效果,此外还训练了一个单向的 LSTM 网络,下面是它在同样超参数设置下的 10 轮训练损失和准确率,可见双向的表现要比单向的更好更稳定:

    识别结果可视化

    y_test_predict = model.predict(x_test)
    
    cls_predict = np.argmax(y_test_predict, axis = 1)
    

    预测正确的结果示例:

    def plot_images(images, cls_true, cls_pred=None, title=None):
    
        fig, axes = plt.subplots(3, 3, figsize=(9, 9))
        fig.subplots_adjust(hspace=0.3, wspace=0.3)
    
        for i, ax in enumerate(axes.flat):
            # 画图
            ax.imshow(np.squeeze(images[i]).reshape(28, 28), cmap='binary')
    
            # 显示出实际和预测的数字标签
            if cls_pred is None:
                ax_title = "True: {0}".format(cls_true[i])
            else:
                ax_title = "True: {0}, Pred: {1}".format(cls_true[i], cls_pred[i])
    
            ax.set_title(ax_title)
    
            ax.set_xticks([])
            ax.set_yticks([])
    
        if title:
            plt.suptitle(title, size=20)
    
        plt.show(block=False)
    
    plot_images(x_test, y_test, cls_predict, title='Correct Examples')
    plt.show()
    

    预测错误的结果示例:

    def plot_example_errors(images, cls_true, cls_pred, title=None):
    
        # 锁定预测错误的那些图片位置
        incorrect = np.logical_not(np.equal(cls_pred, cls_true))
    
        # 获得预测错误的图片
        incorrect_images = images[incorrect]
    
        # 得出这些图片的真实标签和预测标签
        cls_pred = cls_pred[incorrect]
        cls_true = cls_true[incorrect]
    
        # 画出前 9 个图
        plot_images(images=incorrect_images[0:9],
                    cls_true=cls_true[0:9],
                    cls_pred=cls_pred[0:9],
                    title=title)
    
    plot_example_errors(x_test, y_test, cls_predict, title='Misclassified Examples')
    plt.show()
    

    参考文献:

    展开全文
  • 很多朋友在接网线的时候,通常搞不清楚网线里面八根铜导线,哪根才是保证网络传输正常的?首先要知道的是八根铜导线的...绞线最早的运用是被用于电话信号的传输,后来才被逐渐引入到数字信号的传输当中,现在...
    很多朋友在接网线的时候,通常搞不清楚网线里面八根铜导线,哪几根才是保证网络传输正常的?首先要知道的是八根铜导线的整体作用,八根铜导线是为了削减电磁信号的彼此搅扰,每两根按必定的密度缠绞在一起。这样,在传输电信号时彼此之间辐身出的电波就会彼此抵消,有用的消除搅扰。双绞线这个名字也是由于这样的构造而引伸出来的。1f76ec65cfdaf7160aa6501098b07c15.png双绞线最早的运用是被用于电话信号的传输,后来才被逐渐引入到数字信号的传输当中,现在广泛运用的都是超五类双绞线及六类双绞线。最大能到达1000Mbps的带宽。双绞线仅有的缺点即是传输间隔较短,只能到达100米。一般五类超五类双绞线需求运用四对线,即8根芯线。100M以下,一般运用1、2、3、6,四根线。正线(标准568B):两端线序一样,线序是:橙白,橙,绿白,蓝,蓝白,绿,棕白,棕。反线(568A):一端为正线的线序,另一端为:绿白,绿,橙白,蓝,蓝白,橙,棕白,棕。第一监控按:568A线序没有必要记了,一个现在已经不用这个线序了,再一个用到的时候再在B的基础上13和26对调就可以。a214239fc556c3c49fee919a66c72535.png具体的为什么用到1236四根线呢,那就要了解每根芯的作用是什么:1 输出数据 (+)2 输出数据 (-)3 输入数据 (+)4 保留为电话使用5 保留为电话使用6 输入数据 (-)7 保留为电话使用8 保留为电话使用由此可见,虽然双绞线有8根芯线,但在目前广泛使用的百兆网络中,实际上只用到了其中的4根,即第1、第2、第3、第6,它们分别起着收、发信号的作用。4、5,7、8是双向线,保留使用。但是在高于100M的网络运行下,通常八芯就会全用,比如六类超六类的网线不光要用1 3 2 6 ,八芯都需要用到,否则网络运行就会不稳定。剥开网线我们可发现四对双绞线缠绕的密度并不一样,用来传输数据的橙、绿两对,缠绕圈数明显大于用来接地和其它公共用途的棕、蓝两对,所以建议大家平时做跳线时,严格按照568B的顺序来排列。5c800e2dc90f9254c1394a6b22daf452.png经常听到有人说:“我就喜欢用自己习惯的排列顺序来做线,也是可以用的吗?这样的你在家里可以随便用,如果在工程中还是严谨一点按照线序来做。否则的话就失去了双绞线的作用。数据传输衰减严重,传输距离大大降低。在这里我们要强调,如果你非要按自己的习惯来排列线序的话,一定要把1 3两芯放在一对双绞线上、2 6两芯放在一对双绞线上。
    展开全文
  • 数字经济时代下的年轻客群爆发出强劲购买力,以“直播带货”为代表形式的“数字化营销”呈快速增长态势,流量与销量爆发。酒店业该如何跳出传统营销模式?顺势拥抱“酒店+”新营销带来的红利?9月18日,由最佳...

    当数字经济时代下的年轻客群爆发出强劲购买力,以“直播带货”为代表形式的“数字化营销”呈快速增长态势,流量与销量双爆发。酒店业该如何跳出传统营销模式?顺势拥抱“酒店+”新营销带来的红利?

    0c2cca380052df082b7429a6aa3ef5b4.png


    9月18日,由最佳东方和先之教育联合主办,由魔方生活服务集团独家冠名的“冰点重生,云上觉醒”高峰论坛于上,知家创始人、ZMO企业新媒体联盟发起人、新媒体学院创始人牟家和提出在后疫情期,酒店为突破行业瓶颈,需要4大策略支撑:
    打造酒店品牌力;
    对话年轻消费者;
    酒店业网红品牌升级;
    数字营销助力品牌增长。
    首先,新媒体营销近10年有非常多的变化。从微博营销、微信营销、私域营销,到现在的短视频营销,基本都是以“迅雷不及掩耳之势”爆发出来的。

    a87b568d2e60b1339ac26f47505fa3ed.png


    牟家和表示:“很多酒店人都深有感触,当自己酒店微博还没玩明白,微信就来了;微信还没搞清楚,社群来了;社群刚开始研究,短视频就爆发了。另外,近年来中国消费者群体也发生了很大的变化,实在叫人措手不及。”
    那中国消费者群体到底发生了哪些变化呢?
    1. 年轻化
    90后乃至00后的成长,越来越多的年轻群体成为中坚消费力量,逐渐呈现上升趋势。
    2. IP化
    现在很多IP都是自带流量,所以很多企业把IP与产品结合,去更好地完成产品的升级,以及目标用户、年轻用户的沟通。
    3. 地域下沉
    随着经济的发展,三四线城市的消费力量正在崛起。
    4. 文化觉醒
    随着中国国力的不断增强,引发了“国潮”的兴起,很多跟传统文化有关的产品,都变的越来越好卖。
    总而言之,牟家和认为:对酒店而言,不管你是什么类型的酒店、做什么产品,都要关注中国消费者的变化,而且还要多注重年轻人的消费变化,要以年轻人喜欢的方式去打造你品牌独有的特点,产品研发时也要针对年轻人的喜欢进行思考。


    第二,所有企业转型新营销的第一步就是打造自己的品牌。伴随着消费者注意力碎片化,新时代力量的崛起,酒店品牌老化现象愈加明显。很多品牌酒店都面临着空有品牌知名度却缺少品牌认可度,导致购买率非常低。
    牟家和纵观传统企业与新崛起的品牌发现:中国很多百年品牌、几十年的品牌正在慢慢淡出95后、00后的世界,虽然他们的产品做的非常好,但他们由于不太懂新媒体营销,所以在宣传上、产品研发上,并没有抓住新一波流量的资源。这一点对于像酒店这样的传统企业而言,是需要去认真思考的。
    这也印证了很多酒店在开发和设计酒店产品时会出现两个痛点:其一,不知道用户喜欢什么;其二,知道用户喜欢什么,但没有跟他们建立一个很好的沟通和种草的平台,导致酒店产品无法很快地卖掉。
    可能很多酒店困惑,为什么我一定要针对年轻人开发产品?我的新媒体端为什么一定要和年轻人互动?这是因为现在的消费人群大致可以分为95后和85前这两种人群。


    95后代表年轻人,85前代表现在主流中青年人群的购买力。一款新产品诞生后,它肯定会与积极的用户进行沟通,所以你会看到新媒体营销时,企业很喜欢与95后互动,因为95后年轻人中有80%-90%的人都是积极体验的用户,只有10%左右是保守用户。
    如果与85前互动,相对来说不太容易,因为85前消费者中有80%是保守用户,当市场上某件产品已经火了一段时间,且很多人都在讨论、朋友圈疯传,这时他们才可能会心动去买这款产品。
    牟家和:“所以说,不管是企业宣传还是做产品,一定要与那些积极的年轻用户沟通,从而形成推广的效果,去影响那些保守用户,这也是很多品牌要做年轻化的主要原因。”
    没有粉丝的品牌终会消亡,人们更愿意购买有人推荐的产品,品牌正在年轻化和社交人格化。
    转载请注明来源:知家


    http://jh.zoomedia.com.cn/index.php/newsdetail/80

    展开全文
  • 我们知道,数字信号在时域上是呈离散性的且都只有两种状态1和0,在短距离传送时(100米以下)可采用基带传输,当要进行远距离传输时就要采取载波传输...这里的所谓极性是指用正脉冲和负脉冲分别代表数字信号1和0;
  • 不仅以CCTV为代表的官媒频频报道数字货币的来龙去脉,就连广大百姓也对币圈充满了好奇,“比特币”“以太坊”等币圈专业词汇也常常成为热搜榜单的常客,大家在街头巷尾的谈资。在这样的状态下,Filecoin横空出世,...

    今天西部世界就和大家一起来剖析一下:Filecoin,凭什么这么火?

    首先一点西部世界认为,我们必须要承认,Filecoin生的“恰逢其时”,刚好赶上了币圈蓬勃而茁壮的上升发展期。

    最近几年,加密数字货币可谓火爆全网。不仅以CCTV为代表的官媒频频报道数字货币的来龙去脉,就连广大百姓也对币圈充满了好奇,“比特币”“以太坊”等币圈专业词汇也常常成为热搜榜单的常客,大家在街头巷尾的谈资。在这样的状态下,Filecoin横空出世,顺势而为,占尽了“天时地利”。
    在这里插入图片描述

    也正因此,自诞生以来,在大部分时间里,Filecoin都在扮演着一个奋进的角色,更在2021年3月26日提交了一份令人惊艳的成绩单:一举突破100美元大关。在达到高点之后的几天里,Filecoin更是乘胜追击,连续刷新波峰,最高的时候更是一度触及238美元,令人叹为观止。

    如果选择一个关键词来概括Filecoin,那一定是“存储”。Filecoin是由协议实验室发起的一种分散式存储解决方案,它将现有的云存储转化为一个算法市场。在这个市场里,矿工通过提供数据存储或数据检索服务来获得相应代币,而用户,则需要支付数据存储和数据检索的费用。

    相较于大多数网络只能实现单一标准类型节点的情况,Filecoin提出了双重解决方案:拥有两种节点:存储节点和检索节点。双节点设置,无疑是Filecoin的“小巧思”。

    存储节点指的是任何人都可以在他们的计算机上租用额外的硬盘空间,Filecoin将使用该硬盘空间来存储其他人文件的小型加密部分;检索节点则是Filecoin系统所特有的,它们需要位于网络上的存储节点附近,当然值得一提的是,检索节点还需要高带宽和低延迟,当他们最快找到并为用户检索文件时,他们就会得到报酬。

    展开全文
  • wangjy想到博览馆去看这位大师的作品。 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a和b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a 和 b)之间的所有图画,而门票 的价钱就是...
  • bash的个特别字符

    千次阅读 2011-04-06 15:59:00
    分号代表case语句的结束符号 . 圆点等同于source命令,导入另外一个文件的命令(当 . 作为一个文件名的前缀的时候,作用是隐藏该文件,用ls是查看不到的,比如vi生成的中间文件,除非加-a) :...
  • 2、null(代表空值) 3、false(布尔值的false,字符串"false"布尔值为true) 4、0(数字0,字符串"0"布尔值为true) 5、NaN(无法计算结果时出现,表示"非数值";但是typeof NaN==="number") 6、""(引号)...
  • 2、null(代表空值) 3、false(布尔值的false,字符串"false"布尔值为true) 4、0(数字0,字符串"0"布尔值为true) 5、NaN(无法计算结果时出现,表示"非数值";但typeofNaN===“number”) 6、""(引号)或’’...
  • 很多朋友在接网线的时候,通常搞不清楚网线里面八根铜导线,哪根才是保证网络传输正常的?首先要知道的是八根铜导线的...绞线最早的运用是被用于电话信号的传输,后来才被逐渐引入到数字信号的传输当中,现在...
  • 一、常用的种: 1、null值 2、引号或者单引号中间没有内容的,“” 或者 ‘’ (引号中键入空格的情况除外) 二、具体的转换情况见下 下面6种值转化为布尔值时为false,其他转化都为true 1、undefined(未定义,找...
  • null (代表空值) false (布尔值的fasle,字符串"false"布尔值为true) NaN (无法计算结果时出现, 表示为"非数值"; 但是typeof NaN===“number”) 0 (数字0,字符串"0"布尔值为true) undefined (未定义,找不到值时...
  • 剑指Offer算法总结系列-1数组与矩阵: 1.数组与矩阵* ...数组中某些数字是重复的,但不知道有数字重复了,也不知道每个数字重复了次。请找出数组中任意一个重复的数字。 示例1: 输入: [2, 3, 1, 0, 2
  • 1.码元------在使用时间域(时域)的波形表示数字信号时,代表不同离散数值的基本波形。 2.调制------把数字信号转换为模拟信号的过程。 3.解调------把模拟信号转换为数字信号的过程。 4.绞线水晶头:从左到右分别...
  • 我们知道65系列思科产品主要定位为交换机,76系列思科则定义为路由器。其实两者架构大致相同。 一台6500系列交换机主要由这样部分组成:机框(机箱)、电源(可有电源)、引擎卡...数字的不同分别代表了...
  • IntelCPU命名规则

    2008-12-11 09:31:05
    在前缀字母后面的四位数字里,左起第一位数字代表产品的系列,也可以表示处理器的核心数量,其中1代表单核心的Core Solo,2代表双核心的Core Duo;后面的三位数字则表示具体的产品型号,其中第二位数字代表产品的...
  • 我们知道65系列思科产品主要定位为交换机,76系列思科则定义为路由器。其实两者架构大致相同。 ...一台6500系列交换机主要由这样部分组成:机框(机箱)、电源(可有电源)、...数字的不同分别代表了槽位数...
  • 数字信号:代表消息的参数的取值是离散的 3.有关型号的个概念 单向通信(单工):只能有一个方向的通信,没有反方向的交互。 双向交替通信(半双工):通信的双方都可以发送信息,但双方不能同时发送(也不能同时...
  • 数字前加“0(八进制)、0x(十六进制)”等前缀为进制数。 字符常量为一个整数,‘X’ 代表相应ASCII的值。有些特殊字符为转义字符。字符串常量是用“”内多个或0个字符组成的字符序列。而引号只是用来限定...
  • Python实现Hart协议

    2021-01-15 13:28:28
    Hart协议是在端口电流上添加叠加0.5mA的正弦调制波,以1200Hz代表逻辑‘1’,2200Hz代表逻辑‘0’,成功地把模拟信号和数字信号双向同时通讯,而不互相干扰。如下图: Hart协议的消息帧要求如下: 其中RES,是状态...
  • shell考试题

    2020-06-24 22:33:05
    $n $n(n=任意数字)代表脚本在命令行的第个参数 $# 获取脚本参数的个数 $* 获取当前shell脚本所有传参的参数,如果不加引号作用同$@相同, 如果加上引号"$*"则表示将所有的参数视为单个字符串 相当于"$1$2$3" $@ ...
  • Shell 传递参数

    2019-07-04 15:33:19
    n代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 例子如下:我们向脚本传递三个参数,并分别输出,其中$0为执行的文件名 另外,还有个特殊字符用来处理参数: 例子: ...
  • 规则是字母加数字编号,表示编号为的元器件,比如R100,表示编号为100的电阻。下面是一些常用的。 电阻用R来表示。 电容用C来表示。 电感使用L来表示。 三极管或场效应管一般用Q或VT来表示 。 集成电路一般用U或IC...
  • 「我们已经用起来了」,是我们最喜欢听到的话,简简单单个字的背后代表着沉甸甸的信任和托付。从今天开始,我们将通过**「相信开放的力量」**系列深度案例分享,从业务的角度,看看一个数据库为各行业用户带来的...
  • Python学习笔记2

    2020-07-14 21:45:41
    提示符代表可以键入Python指令 最新版本Python键入指令的个格式要求: 1.需要括号括起带引号的文本 2.结束符不能加分号 3.可以直接键入整型(数字) 4.可以进行计算,Python的计算能力比c语言强,输入字符长度...
  • 概述:java中表示一个值可以用变量来表示,也可以用常量来表示,这里主要就是对这二者的总结。常量:常量,顾名思义就是值为固定的量,这与...4.字符串型常量:由引号代表的多个字符表示的字符序列;5.布尔常量:...
  • n 是一个数字,表示第个参数。例如,第一个参数是$1,第二个参数是$2$#传递给脚本或函数的参数个数$*传递给脚本或函数的所有参数$@传递给脚本或函数的所有参数。被引号(” “)包含时,与$*...
  • 「我们已经用起来了」,是我们最喜欢听到的话,简简单单个字的背后代表着沉甸甸的信任和托付。从今天开始,我们将通过 「相信开放的力量」 系列深度案例分享,从业务的角度,看看一个数据库为各行业用户带来的业务...
  • 对于每组数据,接下来一行有两个数字n和m,紧接着n行,每行m个数字代表每种物品存货量,再接着n行,每行m个数字代表我想要该种物品的数量。(0,n) Output 如果有一种物品数量不够,输出"NO",否则输出"YES"。不包括...
  • 组1:单-过滤对象为区域6的单字信息,-过滤对象为区域6的字信息,四-过滤对象为区域6的四字信息,A-过滤对象为区域6的文本A信息,U-过滤对象为区域6的文本U信息 组2:%d-代表读取的内存信息用十进制表示 %x-代表...

空空如也

空空如也

1 2 3 4 5 6
收藏数 109
精华内容 43
关键字:

双代表数字几