您当前的位置:首页 > 生活百科 > 科学

使用神经网络为图像生成标题

时间:2020-07-29 12:20:57  来源:  作者:

我们都知道,神经网络可以在执行某些任务时复制人脑的功能。神经网络在计算机视觉和自然语言生成方面的应用已经非常引人注目。

本文将介绍神经网络的一个这样的应用,并让读者了解如何使用CNNs和RNNs (LSTM)的混合网络实际为图像生成标题(描述)。我们在这个任务中使用的数据集是流行的flickr 8k图像数据集,它是这个任务的基准数据

注意:我们将把数据集分割为7k用于训练,1k用于测试。

我们将首先讨论在我们的混合神经网络中不同的组件(层)和它们的功能。与此同时,我们还将研究使用Tensorflow、Keras和Python开发混合神经网络的实际实现。

神经网络的总体结构

让我们来看看我们将用于生成字幕的神经网络的总体架构

使用神经网络为图像生成标题

 

简单地说,上述神经网络有3个主要组成部分(子网络),每个子网络都有一个特定的任务,即卷积网络(用于从图像中提取特征)、rstm(用于生成文本)和解码器(用于合并两种网络)。

现在让我们详细讨论每个组件并了解它们的工作原理。

图像特征提取器

为了从图像中生成特征,我们将使用卷积神经网络,只需稍加修改。让我们来看看一个用于图像识别的卷积神经网络。

使用神经网络为图像生成标题

 

一般的CNN分类模型有两个子网络

Feature Learning Network—负责从图像中生成Feature map的网络(多卷积和池化层的网络)。

分类网络——负责图像分类的全连通深度神经网络(多稠密层、单输出层网络)。

由于我们只对从图像中提取特征感兴趣,而对其分类不感兴趣,所以我们只对CNN的Feature Learning部分进行处理,这就是我们从图像中提取特征的方法。

下面的代码可以用来从任何一组图像提取特征:

import tensorflow as tf
from keras.preprocessing import image

import numpy as np

# function to extract features from image
def extract_image_features():
    
    model = tf.keras.models.Sequential()
    
    # adding first layers of convolution and pooling layers to network
    model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), input_shape=(90,90,3), padding="VALID", activation="relu"))
    model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu"))
    model.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))
    
    # adding second layers of convolution and pooling layers to network
    model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), padding="VALID", activation="relu"))
    model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation="relu"))
    model.add(tf.keras.layers.AveragePooling2D(pool_size=2, strides=1))
    
    # flattening the output using flatten layer, since the input to neural net has to be flat
    model.add(tf.keras.layers.Flatten())
    
    # model summary
    model.summary()
    
    return model

for file in os.listdir(image_path):
    path = image_path + "//" + file
    img = image.load_img(path, target_size=(90, 90))
    img_data = image.img_to_array(img)
    img_data = np.expand_dims(img_data, axis=0)
    img_data = preprocess_input(img_data)
    
    feature = extract_image_features.predict(img_data)
    feature = np.reshape(feature, feature.shape[1])

任何人都可以使用上述代码构建自己的图像特征提取器,但有一个问题…

上面的模型太过简单,无法从我们的一组图像中提取出每一个重要的细节,因此会影响整个模型的性能。此外,由于高性能gpu和系统的不可用性,使得模型过于复杂(具有大量神经元的多层密集层)也具有挑战性。

为了解决这个问题,我们在Tensorflow中有非常流行的预训练CNN模型(VGG-16, ResNet50等,由不同大学和组织的科学家开发),可以用于从图像中提取特征。记住,在使用输出层进行特征提取之前,要将它从模型中移除。

下面的代码将让您了解如何使用Tensorflow中这些预先训练好的模型从图像中提取特征。

import tensorflow as tf
from keras.preprocessing import image
from keras.Applications.resnet50 import ResNet50
from keras.applications.resnet50 import preprocess_input
from keras.models import Model

# load the ResNet50 Model
feature_extractor = ResNet50(weights='imagenet', include_top=False)
feature_extractor_new = Model(feature_extractor.input, feature_extractor.layers[-2].output)
feature_extractor_new.summary()

for file in os.listdir(image_path):
    path = image_path + "//" + file
    img = image.load_img(path, target_size=(90, 90))
    img_data = image.img_to_array(img)
    img_data = np.expand_dims(img_data, axis=0)
    img_data = preprocess_input(img_data)
    
    feature = feature_extractor_new.predict(img_data)
    feature_reshaped = np.array(feature).flatten()

正如您在下面看到的,如果执行上面的代码,您将看到我们的图像特性只是一个形状-(18432,)的numpy数组。

image_feature_dictionary[list(image_feature_dictionary. Keys())[0]].shape
 (18432,)

接下来,我们将开发用于为图像生成标题的LSTM网络(RNN)。

用于生成标题的LSTM

文本生成是LSTM网络中最流行的应用之一。LSTM单元格(LSTM网络的基本构建块)能够根据前一层的输出生成输出,即它保留前一层(内存)的输出,并使用该内存生成(预测)序列中的下一个输出。

对于我们的数据集,我们为每张图片设置了5个标题,即总共40k个标题。

让我们看看我们的数据集-

使用神经网络为图像生成标题

 

1. A child in a pink dress is climbing up a set of stairs in an entry way.

1. A girl going into a wooden building.

1. A little girl climbing into a wooden playhouse.

1. A little girl climbing the stairs to her playhouse.

1. A little girl in a pink dress going into a wooden cabin.

正如所见,所有的字幕都很好地描述了图片。我们现在的任务是设计一个RNN,它可以为任何相似的图像集复制这个任务。

回到最初的任务,我们首先必须看看LSTM网络是如何生成文本的。对于LSTM来说,网络标题只不过是一长串单独的单词(编码为数字)放在一起。利用这些信息,它试图根据前面的单词预测序列中的下一个单词(记忆)。

在我们的例子中,由于标题可以是可变长度的,所以我们首先需要指定每个标题的开始和结束。我们看看-是什么意思

使用神经网络为图像生成标题

 

首先,我们将把和添加到数据集中的每个标题中。在创建最终词汇表之前,我们将对训练数据集中的每个标题进行标记。为了训练我们的模型,我们将从词汇表中删除频率小于或等于10的单词。增加这一步是为了提高我们的模型的一般性能,并防止它过拟合训练数据集。

代码如下:

# loading captions from captions file
import pandas as pd

# loading captions.txt
captions = pd.read_csv('/kaggle/input/flickr8k/captions.txt', sep=",")
captions = captions.rename(columns=lambda x: x.strip().lower())
captions['image'] = captions['image'].apply(lambda x: x.split(".")[0])
captions = captions[['image', 'caption']]
# adding <start> and <end> to every caption
captions['caption'] = "<start> " + captions['caption'] + " <end>"

# in case we have any missing caption/blank caption drop it
print(captions.shape)
captions = captions.dropna()
print(captions.shape)

# training and testing image captions split
train_image_captions = {}
test_image_captions = {}

# list for storing every caption
all_captions = []

# storing training data
for image in train_data_images:
    tempDf = captions[captions['image'] == image]
    list_of_captions = tempDf['caption'].tolist()
    train_image_captions[image] = list_of_captions
    all_captions.append(list_of_captions)

# store testing data
for image in test_data_images:
    tempDf = captions[captions['image'] == image]
    list_of_captions = tempDf['caption'].tolist()
    test_image_captions[image] = list_of_captions
    all_captions.append(list_of_captions)

print("Data Statistics")
print(f"Training Images Captions {len(train_image_captions.keys())}")
print(f"Testing Images Captions {len(test_image_captions.keys())}")

上面的代码将生成下面的输出

train_image_captions[list(train_image_captions. Keys())[150]]
['<start> A brown dog chases a tattered ball around the yard . <end>',
 '<start> A brown dog is chasing a tattered soccer ball across a low cut field . <end>',
 '<start> Large brown dog playing with a white soccer ball in the grass . <end>',
 '<start> Tan dog chasing a ball . <end>',
 '<start> The tan dog is chasing a ball . <end>']

一旦我们加载了标题,我们将首先使用spacy和Tokenizer(来自tensorflow.preprocessing.)对所有内容进行标记。文本类)。

令牌化就是将一个句子分解成不同的单词,同时删除特殊字符,所有内容都小写。结果是我们在句子中有了一个有意义的单词(记号)的语料库,我们可以在将其用作模型的输入之前对其进行进一步编码。

import spacy
nlp = spacy.load('en', disable=['tagger', 'parser', 'ner'])

# tokenize evry captions, remove punctuations, lowercase everything
for key, value in train_image_captions.items():
    ls = []
    for v in value:
        doc = nlp(v)
        new_v = " "
        for token in doc:
            if not token.is_punct:
                if token.text not in [" ", "n", "nn"]:
                    new_v = new_v + " " + token.text.lower()
        
        new_v = new_v.strip()
        ls.append(new_v)
    train_image_captions[key] = ls
    

# create a vocabulary of all the unique words present in captions
# flatten the list
all_captions = [caption for list_of_captions in all_captions for caption in list_of_captions]

# use spacy to convert to lowercase and reject any special characters 
tokens = []
for captions in all_captions:
    doc = nlp(captions)
    for token in doc:
        if not token.is_punct:
            if token.text not in [" ", "n", "nn"]:
                tokens.append(token.text.lower())

# get tokens with frequency less than 10
import collections
word_count_dict = collections.Counter(tokens)
reject_words = []
for key, value in word_count_dict.items():
    if value < 10:
        reject_words.append(key)
        
reject_words.append("<")
reject_words.append(">")

 # remove tokens that are in reject words
tokens = [x for x in tokens if x not in reject_words]

# convert the token to equivalent index using Tokenizer class of Keras
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts(tokens)

上面的代码将生成一个字典,其中每个令牌都被编码为整数,反之亦然。示例输出如下所示

tokenizer.word_index {'a': 1,
 'end': 2,
 'start': 3,
 'in': 4,
 'the': 5,
 'on': 6,
 'is': 7,
 'and': 8,
 'dog': 9,
 'with': 10,
 'man': 11,
 'of': 12,
 'two': 13,
 'black': 14,
 'white': 15,
 'boy': 16,
 'woman': 17,
 'girl': 18,
 'wearing': 19,
 'are': 20,
 'brown': 21.....}

在此之后,我们需要找到词汇表的长度和最长标题的长度。让我们看看这两种方法在创建模型时的重要性。

词汇长度:词汇长度基本上是我们语料库中唯一单词的数量。此外,输出层中的神经元将等于词汇表长度+ 1(+ 1表示由于填充序列而产生的额外空白),因为在每次迭代时,我们需要模型从语料库中生成一个新单词。

最大标题长度:因为在我们的数据集中,即使对于相同的图像,标题也是可变长度的。让我们试着更详细地理解这个

使用神经网络为图像生成标题

 

正如您所看到的,每个标题都有不同的长度,因此我们不能将它们用作我们的LSTM模型的输入。为了解决这个问题,我们填充填充每个标题到最大标题的长度。

使用神经网络为图像生成标题

 

注意,每个序列都有一组额外的0来增加它的长度到最大序列。

# compute length of vocabulary and maximum length of a caption (for padding)
vocab_len = len(tokenizer.word_counts) + 1
print(f"Vocabulary length - {vocab_len}")

max_caption_len = max([len(x.split(" ")) for x in all_captions])
print(f"Maximum length of caption - {max_caption_len}")

和输出的模型创建训练数据集。对于我们的问题,我们有两个输入和一个输出。为了便于理解,让我们更详细地看看这个

使用神经网络为图像生成标题

 

对于每个图像我们都有

图像特征(X1):利用ResNet50模型提取的形状的Numpy数组(18432,)

输入序列(X2):这需要更多的解释。每个标题只是一个序列列表,我们的模型试图预测序列中下一个最好的元素。因此,对于每个标题,我们将首先从序列中的第一个元素开始,对该元素的相应输出将是下一个元素。在下一次迭代中,前一次迭代的输出将和前一次迭代的输入(内存)一起成为新的输入,这样一直进行,直到我们到达序列的末尾。

输出(y):序列中的下一个单词。

下面的代码可以用来实现上面创建训练数据集的逻辑-

from keras.preprocessing.sequence import pad_sequences
from keras.utils import to_categorical

# generator function to generate inputs for model
def create_trianing_data(captions, images, tokenizer, max_caption_length, vocab_len, photos_per_batch):
    
    X1, X2, y = list(), list(), list()
    n=0
   
    # loop through every image
    while 1:
        for key, cap in captions.items():
            n+=1
            # retrieve the photo feature
            image = images[key]
            
            for c in cap:
                # encode the sequence
                sequnece = [tokenizer.word_index[word] for word in c.split(' ') if word in list(tokenizer.word_index.keys())]
                
                # split one sequence into multiple X, y pairs
                
                for i in range(1, len(sequence)):
                    # creating input, output
                    inp, out = sequence[:i], sequence[i]
                    # padding input                     
                    input_seq = pad_sequences([inp], maxlen=max_caption_length)[0]
                    # encode output sequence
                    output_seq = to_categorical([out], num_classes=vocab_len)[0]
                    # store
                    X1.append(image)
                    X2.append(input_seq)
                    y.append(output_seq)
                    
            # yield the batch data
            if n==photos_per_batch:
                yield ([np.array(X1), np.array(X2)], np.array(y))
                X1, X2, y = list(), list(), list()
                n=0

合并两个子网络

现在我们已经开发了两个子网络(用于生成字幕的图像特征提取器和LSTM),让我们结合这两个网络来创建我们的最终模型。

使用神经网络为图像生成标题

 

对于任何一幅新图像(必须与训练中使用的图像相似),我们的模型将根据它在训练相似的图像和字幕集时获得的知识生成标题。

下面的代码创建了最终的模型

import keras

def create_model(max_caption_length, vocab_length):
    
    # sub network for handling the image feature part
    input_layer1 = keras.Input(shape=(18432))
    feature1 = keras.layers.Dropout(0.2)(input_layer1)
    feature2 = keras.layers.Dense(max_caption_length*4, activation='relu')(feature1)
    feature3 = keras.layers.Dense(max_caption_length*4, activation='relu')(feature2)
    feature4 = keras.layers.Dense(max_caption_length*4, activation='relu')(feature3)
    feature5 = keras.layers.Dense(max_caption_length*4, activation='relu')(feature4)
    
    # sub network for handling the text generation part
    input_layer2 = keras.Input(shape=(max_caption_length,))
    cap_layer1 = keras.layers.Embedding(vocab_length, 300, input_length=max_caption_length)(input_layer2)
    cap_layer2 = keras.layers.Dropout(0.2)(cap_layer1)
    cap_layer3 = keras.layers.LSTM(max_caption_length*4, activation='relu', return_sequences=True)(cap_layer2)
    cap_layer4 = keras.layers.LSTM(max_caption_length*4, activation='relu', return_sequences=True)(cap_layer3)
    cap_layer5 = keras.layers.LSTM(max_caption_length*4, activation='relu', return_sequences=True)(cap_layer4)
    cap_layer6 = keras.layers.LSTM(max_caption_length*4, activation='relu')(cap_layer5)
    
    # merging the two sub network
    decoder1 = keras.layers.merge.add([feature5, cap_layer6])
    decoder2 = keras.layers.Dense(256, activation='relu')(decoder1)
    decoder3 = keras.layers.Dense(256, activation='relu')(decoder2)
    
    # output is the next word in sequence
    output_layer = keras.layers.Dense(vocab_length, activation='softmax')(decoder3)
    model = keras.models.Model(inputs=[input_layer1, input_layer2], outputs=output_layer)
    
    model.summary()

    return model

在编译模型之前,我们需要给嵌入层添加权重。这是通过为语料库(词汇表)中出现的每个标记创建单词嵌入(在高维向量空间中表示标记)来实现的。有一些非常流行的字嵌入模型可以用于这个目的(GloVe, Gensim嵌入模型等)。

我们将使用Spacy内建的"encoreweb_lg"模型来创建令牌的向量表示(即每个令牌将被表示为(300,)numpy数组)。

下面的代码可以用于创建单词嵌入,并将其添加到我们的模型嵌入层。

# create word embeddings
import spacy
nlp = spacy.load('en_core_web_lg')

# create word embeddings
embedding_dimension = 300
embedding_matrix = np.zeros((vocab_len, embedding_dimension))

# travel through every word in vocabulary and get its corresponding vector
for word, index in tokenizer.word_index.items():

    doc = nlp(word)
    embedding_vector = np.array(doc.vector)
    embedding_matrix[index] = embedding_vector
    
# adding embeddings to model
predictive_model.layers[2]
predictive_model.layers[2].set_weights([embedding_matrix])
predictive_model.layers[2].trainable = False

现在我们已经创建了所有的东西,我们只需要编译和训练我们的模型。

注意:由于我们任务的复杂性,这个网络的训练时间会非常长(具有大量的epoch)

# get training data
train_data = create_trianing_data(train_image_captions, train_image_features, tokenizer, max_caption_len, vocab_length, 32)

# initialize model
model = create_model(max_caption_len, vocab_len)

steps_per_epochs = len(train_image_captions)//32

# compile model
model.compile(optimizer='adam', loss='categorical_crossentropy')
model.fit_generator(train_data, epochs=100, steps_per_epoch=steps_per_epochs)

为了生成新的标题,我们首先需要将一幅图像转换为与训练数据集(18432)图像相同维数的numpy数组,并使用作为模型的输入。

在序列生成过程中,一旦在输出中遇到,我们就会终止这个过程。

import matplotlib.pyplot as plt
import seaborn as sns
from PIL import Image
%matplotlib inline

# method for generating captions
def generate_captions(model, image, tokenizer.word_index, max_caption_length, tokenizer.index_word):
    
    # input is <start>
    input_text = '<start>'
    
    # keep generating words till we have encountered <end>
    for i in range(max_caption_length):
        seq = [tokenizer.word_index[w] for w in in_text.split() if w in list(tokenizer.word_index.keys())]
        seq = pad_sequences([sequence], maxlen=max_caption_length)
        prediction = model.predict([photo,sequence], verbose=0)
        prediction = np.argmax(prediction)
        word = tokenizer.index_word[prediction]
        input_text += ' ' + word
        if word == '<end>':
            break
    
    # remove <start> and <end> from output and return string
    output = in_text.split()
    output = output[1:-1]
    output = ' '.join(output)
    return output

# traverse through testing images to generate captions
count = 0
for key, value in test_image_features.items():
    test_image = test_image_features[key]
    test_image = np.expand_dims(test_image, axis=0)
    final_caption = generate_captions(predictive_model, test_image, tokenizer.word_index, max_caption_len, tokenizer.index_word)
    
    plt.figure(figsize=(7,7))
    image = Image.open(image_path + "//" + key + ".jpg")
    plt.imshow(image)
    plt.title(final_caption)
    
    count = count + 1
    if count == 3:
        break

现在让我们检查模型的输出

使用神经网络为图像生成标题

 


使用神经网络为图像生成标题

 


使用神经网络为图像生成标题

 


使用神经网络为图像生成标题

 


使用神经网络为图像生成标题

 

总结

正如你所看到的,我们的模型为一些图片生成了足够好的标题,但有些标题并没有说明。

这可以通过增加epoch、训练数据、向我们的最终模型添加层来改善,但所有这些都需要高端机器(gpu)进行处理。

这就是我们如何用我们自己的深度学习模型为图片生成标题。

作者:Akash Chauhan

deephub翻译组



Tags:神经网络   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
SimpleAI.人工智能、机器学习、深度学习还是遥不可及?来这里看看吧~ 从基本的概念、原理、公式,到用生动形象的例子去理解,到动手做实验去感知,到著名案例的学习,到用所学来实现...【详细内容】
2021-10-19  Tags: 神经网络  点击:(47)  评论:(0)  加入收藏
MNIST 这里就不多展开了,我们上几期的文章都是使用此数据集进行的分享。手写字母识别EMNIST数据集Extended MNIST (EMNIST), 因为 MNIST 被大家熟知,所以这里就推出了 EMNIST...【详细内容】
2021-09-08  Tags: 神经网络  点击:(182)  评论:(0)  加入收藏
理解什么是人工智能,以及机器学习和深度学习如何影响它,是一种不同凡响的体验。在 Mate Labs 我们有一群自学有成的工程师,希望本文能够分享一些学习的经验和捷径,帮助机器学习...【详细内容】
2021-06-09  Tags: 神经网络  点击:(128)  评论:(0)  加入收藏
资料来源:getwallpapers.com 深度学习是机器学习中重要分支之一。它的目的是教会计算机做那些对于人类来说相当自然的事情。深度学习也是无人驾驶汽车背后的一项关键性技术,...【详细内容】
2021-04-13  Tags: 神经网络  点击:(168)  评论:(0)  加入收藏
私有虚拟网络(VPN)是在公用网络基础之上建立的私有加密通信隧道网络,企业对于自管辖网络中个人使用VPN软件行为具有监管责任,但技术上却很难识别VPN的加密与通信方式,因此利用人工智能(AI)领域的神经网络技术从网络流量中识...【详细内容】
2021-01-07  Tags: 神经网络  点击:(193)  评论:(0)  加入收藏
深层神经网络的模型概括,过度拟合和正则化方法的挑战> Source 在完成了与神经网络有关的多个AI项目之后,我意识到模型的概括能力对于AI项目的成功至关重要。 我想写这篇文章来...【详细内容】
2020-10-30  Tags: 神经网络  点击:(101)  评论:(0)  加入收藏
本文最初发表于 Towards Data Science 博客,经原作者 Andre Ye 授权,InfoQ 中文站翻译并分享。卷积神经网络(Convolutional Nerual Network,CNN)构成了图像识别的基础,这无疑是深...【详细内容】
2020-10-16  Tags: 神经网络  点击:(115)  评论:(0)  加入收藏
本报告讨论了非常厉害模型优化技术 —— 知识蒸馏,并给大家过了一遍相关的TensorFlow的代码。...【详细内容】
2020-09-25  Tags: 神经网络  点击:(92)  评论:(0)  加入收藏
算法算法从1950年代的早期研究开始,机器学习的所有工作似乎都随着神经网络的创建而积累起来。 从逻辑回归到支持向量机,相继提出了新算法之后的算法,但是从字面上看,神经网络是...【详细内容】
2020-09-17  Tags: 神经网络  点击:(90)  评论:(0)  加入收藏
卷积神经网络(CNN)广泛应用于深度学习和计算机视觉算法中。虽然很多基于CNN的算法符合行业标准,可以嵌入到商业产品中,但是标准的CNN算法仍然有局限性,在很多方面还可以改进。这篇文章讨论了语义分割和编码器-解码器架构...【详细内容】
2020-09-17  Tags: 神经网络  点击:(93)  评论:(0)  加入收藏
▌简易百科推荐
在海洋、陆地、天空三片领域中,都有处在食物链顶端的王者,它们站在食物链顶端,拥有王者的身份,如海洋霸主虎鲸是毫无争议的海洋王者,在海洋中,基本上是所向披靡,没有天敌,而草原王者...【详细内容】
2021-12-17  小楠动物世界    Tags:   点击:(7)  评论:(0)  加入收藏
氦元素在全宇宙的质量中大约占了24%,但是在地球大气中的浓度为5.2 ppm(1ppm=0.0001%)[1],因此称它为稀有气体。稀有气体也被称为惰性气体,化学反应上的惰性也是造成氦气在地球上含...【详细内容】
2021-12-15  中科院物理所    Tags:稀有气体   点击:(8)  评论:(0)  加入收藏
在管理工作中,有些传统的做法是错误的,我们要避免犯这些错误。以下这11条,都是错的。 01 . 拒绝承担个人责任有一次,有一项工作出了差错,董事长把我叫去骂了一顿。我对董事长说,“...【详细内容】
2021-12-14  股权设计布局    Tags:管理   点击:(5)  评论:(0)  加入收藏
对光的研究起源于古希腊,在那里,哲学家们开始思考视觉是如何工作的。柏拉图和毕达哥拉斯等思想家认为,我们的眼睛会发出微弱的光线进行探测。这些光线将收集我们周围物体的信息...【详细内容】
2021-12-08    中科院物理所  Tags:   点击:(12)  评论:(0)  加入收藏
据阿根廷布宜诺斯艾利斯经济新闻网12月6日报道,进食后感到困倦或疲惫是很常见的。这可以解释为,在那一刻,身体所有的能量都“投入”在消化过程中,短时间内感到有点昏昏欲睡非常...【详细内容】
2021-12-08    参考消息  Tags:犯困   点击:(7)  评论:(0)  加入收藏
量子力学能用来干什么?更该问的是它不能干什么!在知道了量子力学这个学科后,许多人就会来问:它能用来干什么?实际上,这个问题问偏了。真正有意义的问题是:量子力学不能用来干什么?因...【详细内容】
2021-12-07  中科院物理所    Tags:量子力学   点击:(14)  评论:(0)  加入收藏
电流是什么?首先回想下,我们学过的电流的定义是什么?很简单,导体中的带电粒子的定向运动就是电流。只有当物质内具有能自由移动的带电粒子,它才可以传输电流&mdash;&mdash;即导电...【详细内容】
2021-12-07    中科院物理所  Tags:电流   点击:(22)  评论:(0)  加入收藏
要理解光速不变原理。首先要有抛弃固有的思维模式的思想准备,否则不容易理解。因为爱因斯坦这个理论有点离经叛道。 我们都知道,描叙一个运动,必须有参考系才有意义。说一列火...【详细内容】
2021-11-30  宇宙探索    Tags:光速不变   点击:(18)  评论:(0)  加入收藏
一半是彻夜无眠,而床上的另一半是呼噜声连绵不绝。这个场景恐怕是很多家庭的真实写照了吧。更让人崩溃的是,推一下不打了,下一秒又开始了“呼~~~呼~~呼”。给我闭嘴!!!那为什么“...【详细内容】
2021-11-17    科普中国  Tags:打呼噜   点击:(21)  评论:(0)  加入收藏
光合作用是指绿色植物的叶片吸收和利用太阳光能将植物吸收的,二氧化碳和水综合成富含能量的有机物,并释放出氧气的过程,这也是大搞植树造林能改变气候环境的原因之一,光合作用的...【详细内容】
2021-11-17  农业百晓生    Tags:光合作用   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条